OpenGL ES - FBO离屏渲染

FBO

FBO,Frame Buffer Object,帧缓冲对象。默认情况下,我们的GLSurfaceView中绘制的结果会显示到屏幕上,然而实际中很多情况不需要渲染到屏幕上,这时候用FBO可以实现这个需求。FBO可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。

1、创建离屏渲染FBO

        mFramebuffers = IntArray(1)
        GLES20.glGenFramebuffers(1, mFramebuffers, 0)

2、创建一个普通纹理
创建了一个GL_TEXTURE_2D的2D纹理

        //2、创建属于FBO的纹理
        mFramebufferTextures = IntArray(1)
        //创建并配置纹理
        TextureHelper.genTextures(mFramebufferTextures)

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mFramebufferTextures[0])

3、设置GL_TEXTURE_2D的输入输出格式

        GLES20.glTexImage2D(
            GLES20.GL_TEXTURE_2D,
            0,
            GLES20.GL_RGBA,
            width,
            height,
            0,
            GLES20.GL_RGBA,
            GLES20.GL_UNSIGNED_BYTE,
            null
        )

4、将前面生成的FBO和Texture绑定

//让fbo和纹理绑定起来
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFramebuffers[0])
        GLES20.glFramebufferTexture2D(
            GLES20.GL_FRAMEBUFFER,
            GLES20.GL_COLOR_ATTACHMENT0,
            GLES20.GL_TEXTURE_2D,
            mFramebufferTextures[0],
            0
        )

5、在FBO上绘制

        //绑定FBO,因为是离屏渲染,需要渲染到FBO中
        GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFramebuffers[0])
...进行绘制...
        //通知OpenGL绘制
        GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4)
...

6、将FBO内容绘制的屏幕上
在上面曾经将FBO和一个GL_TEXTURE_2D的2D纹理绑定,现在直接将这个2D纹理利用GL_TEXTURE_2D的格式绘制出来。

整个过程:
生成FBO --> 绑定GL_TEXTURE_2D到FBO -->
相机绘制过程
绑定FBO glBindFramebuffer --> 绑定相机的Surface TextureID GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId)
--> 将绑定GL_TEXTURE_2D到FBO的textureID传递出去
-->将这个传递过来的纹理利用GL_TEXTURE_2D来渲染

你可能感兴趣的:(OpenGL ES - FBO离屏渲染)