【问题标题】:Difference between Frame buffer object, Render buffer object and texture?帧缓冲区对象、渲染缓冲区对象和纹理之间的区别?
【发布时间】:2012-04-24 10:26:34
【问题描述】:

帧缓冲对象、渲染缓冲对象和纹理有什么区别?它们将在什么情况下使用?

【问题讨论】:

  • @shree "它允许将场景直接渲染到渲染缓冲区对象,而不是渲染到纹理对象。"为什么我们需要渲染到渲染缓冲区或我们需要渲染到帧缓冲区对象的纹理?

标签: opengl-es-2.0


【解决方案1】:

帧缓冲

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

纹理

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

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

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

渲染缓冲区

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

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

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

【讨论】:

  • 我听过的关于这些缓冲区的最清晰的解释,并指出每个对象的不同用例。太好了!
【解决方案2】:

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

纹理或渲染缓冲区构成各个子缓冲区的实际存储。这样,您可以拥有多个颜色缓冲区、一个深度缓冲区和一个模板缓冲区,所有这些都存储在不同的纹理/渲染缓冲区中。但它们共同构成了一个逻辑帧缓冲区,您可以在其中进行渲染。

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

【讨论】:

  • 感谢重播。了解帧缓冲区的概念,因此它们是最终渲染缓冲区。但是这些渲染缓冲区怎么样?我知道纹理,但为什么以及何时必须使用渲染缓冲区?
  • @Megharaj Renderbuffers 在引入帧缓冲区对象时需要,因为纹理不能用作深度或模板附件,我认为,抛开多样本帧缓冲区不谈。但是随着多样本纹理的出现,渲染缓冲区不再需要了。它们基本上只是为要渲染的内存缓冲区提供存储空间,但不能用于其他用途。
  • @ChristianRau 在每个屏幕外渲染条件(在 ES 2.X 中)中,是否可以安全地使用纹理而不是渲染缓冲区?
  • @BartekBanachewicz 我不太确定 OpenGL ES。我很确定 ES 不支持多重采样纹理。因此,如果您需要一个多重采样 FBO,您将需要一个渲染缓冲区。同样,如果 ES 不支持深度或模板纹理(不确定)。所以不,绝对不是每个条件。
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多