OpenGL FrameBuffer Object (FBO)
OpenGL FrameBuffer Object (FBO)
1. FBO 简介
Frame Buffer Object(FBO)扩展,被推荐用于把`数据渲染到纹理对像`。相对于其它同类技术,如数据拷贝或交换缓冲区等,使用FBO技术会更高效并且更容易实现。该技术可以把一些渲染到纹理 (render to texture)的功能加入到程序中,实现更快速的运行。
2. 建立
GLuint fbo;
glGenFramebuffersEXT (1, &fbo);
3. 绑定
glBindFramebufferEXT (GL_FRAMWBUFFER_EXT, fbo);
4. 加入一个深度缓存 (Depth Buffer)
一个FBO本身没有多大用处,要让它更有效的被利用,我们需要把它与一个可被渲染过的缓冲区绑定在一起,这样的缓冲区可以是纹理,也可以是 渲染缓冲区 (renderBuffers)。
一个renderBuffer,其实就是一个用来支持离屏渲染的缓冲区。通常是帧缓冲区的一部份,一般不具有纹理格式。常见的模版缓冲和深度缓冲就是这样一类对像。
在这里,我们要为我们的FBO指定一个渲染缓冲区。这样,当我们渲染的时候,我们便把这个渲染缓冲区作为FBO的一个深度缓存来使用。
和FBO的生成一样,我们首先也要为渲染缓冲区指定一个有效的标识。
GLuint depthBuffer;
glGenRenderbuffersEXT (1, depthBuffer);
glBindRenderbufferEXT (GL_RENDERBUFFER_EXT, depth);
这里有一个关键的地方,也就是我们生成的渲染缓冲对像,它本身并不会自动分配内存空间。因此我们要调用OpenGL的函数来给它分配指定大小的内存空间,在这里,我们分配一个固定大小的深度缓显空间。
glRenderbufferStorageEXT (GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height);
上面这一函数成功运行之后,OpenGL将会为我们分配好一个大小为width x height的深度缓冲区。注意的是,这里用了GL_DEPTH_COMPONENT,就是指我们的空间是用来保存深度值的,但除了这个之外,渲染缓冲区 还可以用来保存普通的RGB/RGBA格式的数据或者是模板缓冲的信息。
5. Renderbuffer 和 Framebuffer 绑定在一起
准被好了深度缓存的显存空间后,接下来要做的工作就是把它与前面我们准备好了的FBO对像绑定在一起。
glFramebufferRenderbufferEXT (GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthbuffer);
6. 加入用于渲染的纹理
GLuint img;
glGenTextures (1, &img);
glBindTexture (GL_TEXTURE_2D, img);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSINGED_BYTE, NULL);
7. 绑定纹理和FBO
glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, img, 0);
8. 检查FBO
GLenum status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT)
浙公网安备 33010602011771号