OpenGL ES学习教程 --- FBO
OpenGL ES学习教程 — FBO
简介之什么是FBO
Frame Buffer Object帧缓冲对象,按照之前的学习绘制图像、纹理,着色器着色后最后一步,会将所有的数据都传给FBO,然后在屏幕上显示,只不过没使用自定义FBO之前都是使用默认的FBO,这个FBO id为0;使用我们自定义的FBO,绑定激活后,后续的渲染操作都会传递到这个FBO上,而且这个FBO不会显示屏幕上,我们可以对这个FBO内部存储的数据进行自己的操作,适合一些不需要显示屏幕上、突破屏幕尺寸的需求工作,也就是所谓的离屏渲染
FBO本身是没有分配渲染的内存,它更像一个资源的管理者,提供一些附着点,让纹理和渲染缓存(Render Buffer)附着,提供渲染;FBO实现有两种方式,一种是EGL实现 ,另一种是使用GLSurfaceView实现,本文以GLSurfaceView方式来阐述
今天没有心情写了,直接贴核心源码
创建
public static int getFramBufferId(){
int fboId[] = new int[1];
GLES20.glGenFramebuffers(1, fboId, 0);
return fboId[0];
}
激活FBO
这一步很重要,之前我总是搞混 GL_FRAMEBUFFER相当于一个激活的变量,应该只有一个才能激活,当前fbo被激活了, 后续对Render的渲染都会把数据放到这个fbo,所有对像素数据的读写操作都在这个fbo, 如果不需要在此fbo操作,要解除绑定,并切换使用以下同一个方法切换绑定
int fboId = GLHelper.getFramBufferId();
/**
* 这一步很重要,之前我总是搞混
* GL_FRAMEBUFFER相当于一个激活的变量,应该只有一个才能激活,当前fbo被激活了,
* 后续对Render的渲染都会把数据放到这个fbo,所有对像素数据的读写操作都在这个fbo,
* 如果不需要在此fbo操作,要解除绑定,并切换使用以下同一个方法切换绑定
*/
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[1]);
绑定
texture = GLHelper.loadTexture(context, bitmap);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture[1]);
//纹理作为颜色附着在FBO上
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
GLES20.GL_TEXTURE_2D, texture[1], 0);
//创建render buffer并绑定
GLES20.glGenRenderbuffers(1, fRender, 0);
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, fRender[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16,
imgWidth, imgHeight);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT,
GLES20.GL_RENDERBUFFER, fRender[0]);
以上要使用GLSurfaceView才能创建使用FBO,经过上面的配置,进行常规的纹理、图元绘制就会绘制到FBO上去了,而不会在屏幕上显示
最后,献上我的demo