rbo就像fbo一样,是帧缓冲区附加项的一种类型,它可以是任何字节的、整型的、像素的或其他类型的数组。rbo不能直接读取,这让OpenGL对其做了许多内存优化,让rbo相比于纹理在fbo的离屏渲染上具备了性能优势。
=========================================================================
FrameBuffers深入理解:
以往的渲染,OpenGL在渲染循环中,先进行默认buffers绑定,所有的渲染操作和设置,包括深度和模板值的数据,都存储在那个默认的framebuffers里,最后再由glfwSwapBuffers函数,把默认buffers的所有计算和设置,包括深度、模板、颜色的值,全部取出,放到屏幕缓冲区里,换言之,就是显示到了屏幕上。而不用再渲染循环中绑定buffers(因为glfwSwapBuffers默认的是把buffers里的数据swap出来)
而Framebuffers,相当于在渲染之前,把颜色缓冲、深度和模板缓冲全部设置好(这个过程叫做配置Framebuffers),
如果设置的不对,就叫做不完整,可以用函数glCheckFramebufferStatus检查。
在渲染循环中,首先要绑定自定义的Framebuffers,所有的渲染操作及其数据,
全部会进入这个Framebuffers,然后再用这个framebuffers作为默认buffers的纹理,
这样,屏幕显示的就是framebuffers里渲染好的color attachment的内容,再进行glfwSwapBuffers。
创建对象,绑定和调用
unsigned int rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);//附加渲染缓冲对象