帧缓冲 默认和自定义的 一些区别

转载自: http://blog.****.net/yager0203/article/details/78073017


在OpenGL渲染管道中,几何数据和纹理被转换并通过几个测试,最终以2D像素的形式呈现在屏幕上。

OpenGL管道的最终呈现目标称为帧缓冲区(Framebuffer)。Framebuffer是OpenGL使用的2D数组或存储库的集合:彩色缓冲区,深度缓冲区,模板缓冲区和累积缓冲区。默认情况下,OpenGL使用帧缓冲区作为由窗口系统完全创建和管理的rendering target。这个默认的帧缓冲区称为窗口系统提供的帧缓冲区。

OpenGL扩展GL_ARB_framebuffer_object,提供了一个接口来创建其他不可显示的帧缓冲对象(FBO)。该帧缓冲区被称为应用程序创建的帧缓冲区,以便与默认的窗口系统提供的帧缓冲区区分开来。 
通过使用FBO,OpenGL应用程序可以将渲染输出重定向到除了传统的窗口系统提供的帧缓冲区之外的应用程序创建的FBO。而且,它完全由OpenGL控制。

与窗口系统提供的帧缓冲区类似,FBO包含一系列渲染缓冲区集合:颜色,深度和模板缓冲区。FBO中没有定义累加缓冲区。FBO中的逻辑缓冲区被称为framebuffer-attachable 图像,它们是可以附加到帧缓冲区对象FBO的二维像素数组。

有两种类型的framebuffer-attachable images:纹理图像和renderbuffer图像。

  1. 如果纹理对象的图像被附加到帧缓冲区,OpenGL将执行“渲染到纹理”。
  2. 如果renderbuffer对象的图像附加到帧缓冲区,则OpenGL会执行“屏幕外渲染”。

顺便说一下,renderbuffer对象是在GL_ARB_framebuffer_object扩展中定义的一种新类型的存储对象。它在渲染过程中用作单个2D图像的渲染目的地。

下图显示了FBO,纹理对象和renderbuffer对象之间的连接。多个纹理对象或renderbuffer对象可以通过attachment point 附加到framebuffer对象。 
帧缓冲 默认和自定义的 一些区别

  1. 帧缓冲对象中有多个颜色附着点(GL_COLOR_ATTACHMENT0,…,GL_COLOR_ATTACHMENTn)
  2. 一个深度附着点(GL_DEPTH_ATTACHMENT)
  3. 一个模板附着点(GL_STENCIL_ATTACHMENT)

颜色连接点的数量取决于实现,但每个FBO必须至少具有一个颜色附着点。您可以使用GL_MAX_COLOR_ATTACHMENTS查询最大数量的颜色附着点,这些数据由显卡支持。 FBO具有多个颜色附着点的原因是允许在同一时间将颜色缓冲区渲染到多个目的地。

这个“多个渲染目标”(MRT)可以由GL_ARB_draw_buffers扩展完成。请注意,framebuffer对象本身没有任何图像存储(数组),但它只有多个附件点。

帧缓冲器对象(FBO)提供了一种高效的切换机制:从FBO中分离先前的可与帧缓冲区相关联的图像,并将一个新的framebuffer-attachable image 图像附加到FBO。切换framebuffer-attachable image比在FBO之间切换要快得多。 FBO提供glFramebufferTexture2D()来切换2D纹理对象,并将glFramebufferRenderbuffer()切换到renderbuffer对象。