Android OpenGLES3绘图 - 帧缓冲

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OpenGLES3绘图 - 帧缓冲相关的知识,希望对你有一定的参考价值。

参考技术A 普通的OpenGL绘图时是绘制到当前帧上面,由于GL环境跟当前屏幕进行了关联,也就直接绘制到屏幕了。这样有两个问题:1. 如果有的帧计算得快,有的计算得慢,而屏幕刷新率是固定的,就会拖慢整体帧率;2. 在着色器里面只能处理当前位置的点,没办法处理当前点跟其他点的关系。

如果将OpenGL计算后的帧缓存起来,不直接绘制。那么就可以利用双缓冲或多缓冲技术稳定帧率;在着色器里面可以从缓存帧读取所有点,就可以进行一些相对位置处理,比如将当前点跟周围点颜色计算平均值,进行图像模糊。这就是帧缓冲。

给一个普通的绘制添加帧缓冲也很方便,基本不影响原来的绘制。假设原来绘制的是三角形,那么先配置一下帧缓冲,可以配置成2D纹理,然后进行原来的绘制,三角形就会绘制到缓冲帧的纹理上面,最后将这个2D纹理绘制到屏幕上就可以了。

实现方法:

原图形是很多个旋转的3D箱子

创建帧缓冲对象fbo,创建纹理对象tcbo和渲染缓冲对象rbo,将它们俩跟fbo绑定,检查一下是否成功。

创建顶点数组缓冲对象vbo,绘制一个带纹理的正方形,注意纹理需要用上一步创建的纹理对象tcbo

先绑定帧缓冲对象,开启深度测试,用原图形Shader绘制3D箱子图案;然后解绑帧缓冲对象fbo,关闭深度测试(绑定当前屏幕),用帧缓冲Shader绘制fbo中的纹理。绘制结果跟原图形完全一致。

有了帧缓冲后,可以在帧缓冲的片段着色器上做一些简单的图像处理:反相、灰度;核效果:模糊、锐化、边缘检测等。

以上是关于Android OpenGLES3绘图 - 帧缓冲的主要内容,如果未能解决你的问题,请参考以下文章

如何在 webgl 中使用帧缓冲目标?

使用帧缓冲区(纹理空白)向纹理发出绘图

如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?

帧缓冲区绑定顺序

OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?

OpenGL 中的离屏帧缓冲区