帧缓冲区对象,渲染缓冲区对象和纹理之间的区别?

时间:2012-04-12 04:32:23

标签: opengl-es-2.0

帧缓冲区对象,渲染缓冲区对象和纹理之间有什么区别?在什么情况下他们会被使用?

2 个答案:

答案 0 :(得分:24)

帧缓冲

帧缓冲区实际上不是缓冲区。它是定义绘制操作参数的对象的抽象。它是一个小对象,包含一个或多个附件,它们本身就是实际的缓冲区。将framebuffer理解为具有许多字段的C结构。每个字段(OpenGL术语中的每个附件)都可以是指向渲染缓冲区,纹理,深度缓冲区等的指针。

纹理

标准像素数组。这是一个实际的缓冲区,可以作为绘制像素的目标附加到帧缓冲区。纹理中的每个像素通常都包含颜色分量和alpha值(纹理中的像素可以从具有4个浮点数的RGBA quad转换成。)

在绘制到包含附加纹理的帧缓冲区后,可以从纹理中读取像素以用于另一个绘制操作。例如,这允许在另一个场景内进行多遍绘制或绘制场景。

纹理可以附加到着色器程序并用作采样器。

渲染

原生像素数组。渲染缓冲区就像一个纹理,但使用内部格式存储像素。它针对pixel transfer操作进行了优化。它可以作为绘制像素的目标附加到帧缓冲区,然后快速复制到视口或另一个帧缓冲区。这允许实现double buffer算法,其中在展示前一场景时绘制下一个场景。

渲染缓冲区还可用于存储仅用于单个绘制过程的深度和模板信息。这是可能的,因为只有实现本身需要读取renderbuffer数据,并且往往比纹理更快,因为使用本机格式。

因为它使用原生格式,渲染缓冲区无法附加到着色器程序并用作采样器。

答案 1 :(得分:19)

帧缓冲对象或多或少只是一个管理构造。它管理一个完整的帧缓冲区及其所有子缓冲区,如颜色缓冲区,深度缓冲区和模板缓冲区。

纹理或渲染缓冲区包含各个子缓冲区的实际存储空间。这样,您可以拥有多个颜色缓冲区,深度缓冲区和模板缓冲区,所有颜色缓冲区都存储在不同的纹理/渲染缓冲区中。但是它们共同组成了一个单独的逻辑帧缓冲区。

因此,写入帧缓冲区的最终片段(您可以将其称为像素,但实际上还不是一个)具有一个或多个颜色值,深度值和模板值,它们都以不同的子缓冲区结束帧缓冲区。