OpenGL-ES 学习(8) ---- FBO

OpenGL ES FBO 渲染

FBO OverView

FBO(FrameBuffer Object) 指的是帧缓冲对象,实际上是一个可以添加缓冲区容器,可以为其添加纹理或者渲染缓冲区对象(RBO)
FBO(FrameBuffer Object) 本身不能用于渲染,只有添加了纹理或者纹理缓冲区之后才可以作为渲染目标,而且它仅且提供了三类附着,分别是颜色附着,模板附着和深度附着

和顶点缓冲区不同,FBO 不能通过共享上下文的方式进行共享

在 opengl-es 可以通过共享上下文方式进行共享的资源有:

  • 纹理
  • shader
  • program 着色器程序
  • buffer 类对象,比如 VBO,EBO,RBO 等

不能通过共享上下文方式进行共享的资源有:

  • VAO 顶点数组对象(非Buffer类对象)
  • FBO 帧缓冲对象(非Buffer类对象)

这里需要说明的是,在不可以共享的资源中,FBOVAO属于资源管理型对象,FBO负责管理几种缓冲区,本身不占用资源,VAO负责管理VBO或者EBO,本身也不占用资源
RBO(Render Buffer Object) 是渲染缓冲区对象,是一个由应用程序分配的2D图像缓冲区,渲染缓冲区可以用于分配和存储颜色、深度或者模板值,可以用作FBO中的颜色、深度和模板附着
如果要使用FBO作为渲染目标,首先要为FBO添加连接对象,比如颜色附着需要连接纹理或者渲染缓冲区对象的颜色缓冲区

FrameBuffer object

FBO 优点

默认情况下,opengl-es通过绘制到窗口系统提供的帧缓冲区,然后将帧缓冲区对应的区域复制到纹理来实现渲染到纹理,但是此方法只有在纹理尺寸小于或等于帧缓冲区尺寸才有效

另一种方式是使用连接到纹理的 Pbuffer 来实现渲染到纹理,但是与上下文和窗口系统提供的可绘制表面切换开销也很大,因此,引入了帧缓冲区对象 FBO 来解决此问题
opengl-es 的场景中,有一些成绩不需要渲染到屏幕,比如在后台利用GPU实现一些图像转换,缩放等操作,这个时候就可以使用FBO
相对于渲染到屏幕,FBO渲染不改变图像的分辨率,在图像处理算法中比较常用

FBO(FrameBuffer object) 渲染是渲染到离屏的Buffer中,可以使用glReadPixels的方式将渲染后图像读出来

使用FBO的步骤

  • 创建一个 FBO 并且创建一个2D 纹理用于连接 FBO 的颜色附着
  • glBindFramebuffer 绑定FBO
  • glDrawElements 进行绘制
  • glBindFramebuffer 解绑FBO

如果要等待绘制完成需要添加如下步骤:

  • glFinish 等待绘制完成
  • 可以通过 glReadPixels 将绘制的内容保存下来

参考代码如下:

static int initInternal(ESContext* esContext) {
   
   
    UserData *userData = esContext->userData;

    ......

    // gen bo & bind to texture
    glGenFramebuf
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值