openglesFBO的简单介绍
Android OpenGLES3绘图 - 帧缓冲
普通的OpenGL绘图时是绘制到当前帧上面,由于GL环境跟当前屏幕进行了关联,也就直接绘制到屏幕了。这样有两个问题:1. 如果有的帧计算得快,有的计算得慢,而屏幕刷新率是固定的,就会拖慢整体帧率;2. 在着色器里面只能处理当前位置的点,没办法处理当前点跟其他点的关系。
如果将OpenGL计算后的帧缓存起来,不直接绘制。那么就可以利用双缓冲或多缓冲技术稳定帧率;在着色器里面可以从缓存帧读取所有点,就可以进行一些相对位置处理,比如将当前点跟周围点颜色计算平均值,进行图像模糊。这就是帧缓冲。
给一个普通的绘制添加帧缓冲也很方便,基本不影响原来的绘制。假设原来绘制的是三角形,那么先配置一下帧缓冲,可以配置成2D纹理,然后进行原来的绘制,三角形就会绘制到缓冲帧的纹理上面,最后将这个2D纹理绘制到屏幕上就可以了。
实现方法:
原图形是很多个旋转的3D箱子
创建帧缓冲对象fbo,创建纹理对象tcbo和渲染缓冲对象rbo,将它们俩跟fbo绑定,检查一下是否成功。
创建顶点数组缓冲对象vbo,绘制一个带纹理的正方形,注意纹理需要用上一步创建的纹理对象tcbo
先绑定帧缓冲对象,开启深度测试,用原图形Shader绘制3D箱子图案;然后解绑帧缓冲对象fbo,关闭深度测试(绑定当前屏幕),用帧缓冲Shader绘制fbo中的纹理。绘制结果跟原图形完全一致。
有了帧缓冲后,可以在帧缓冲的片段着色器上做一些简单的图像处理:反相、灰度;核效果:模糊、锐化、边缘检测等。
OpenGL ES - FBO离屏渲染
FBO,Frame Buffer Object,帧缓冲对象。默认情况下,我们的GLSurfaceView中绘制的结果会显示到屏幕上,然而实际中很多情况不需要渲染到屏幕上,这时候用FBO可以实现这个需求。FBO可以让我们的渲染不渲染到屏幕上,而是渲染到离屏Buffer中。
1、创建离屏渲染FBO
2、创建一个普通纹理
创建了一个GL_TEXTURE_2D的2D纹理
3、设置GL_TEXTURE_2D的输入输出格式
4、将前面生成的FBO和Texture绑定
5、在FBO上绘制
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来渲染
OpenglES学习简单总结
渲染管线如下,只要按照步骤调用api就行:
使用opengles,主要就是围绕着顶点着色器和片段着色器做工作,来显示2D、3D物体以及着色和纹理贴图。
创建的顶点,传递给顶点着色器后,会绘制出图形或3D物体,并且可以通过矩阵变换,将物体的不同角度展现在屏幕上。
创建的颜色或纹理,传递给片段着色器,片段着色器可以对传入的信息进行处理,不如变更RGB的值,对纹理进行扭曲变换等,最后将颜色或纹理贴到顶点构造的物体上。
通过顶点着色器和纹理着色器,我们可以他们来:
1)图像处理,美颜、特效等
2)通过不断变更纹理,就可以通过opengles显示动画效果。例如直播间的礼物特效。
3)使用FBO离屏渲染
4)显示三维建模场景
5)显示VR场景(将纹理贴在球形物体上,随着手机移动,球体同步转动。同时将相机位置设置为圆心)