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来渲染
网友评论