【问题标题】:OpenGL FBO renderbuffer or texture attatchmentOpenGL FBO 渲染缓冲区与纹理附件
【发布时间】:2013-06-12 21:08:28
【问题描述】:

在什么情况下,除了默认帧缓冲区之外,我还希望在 OpenGL FBO 中使用渲染缓冲区附件,而不是纹理附件?因为,纹理附件似乎更加通用。

【问题讨论】:

  • 我一直在想这个问题。我的猜测是存在基于 PBuffer 的遗留程序的基础,有些人不愿意适应不同的概念(即写入纹理而不是写入 PBuffer 并复制),因此重新实现了确切的 PBuffer 功能FBO 的顶部,以鼓励他们使用 FBO。我真的想不出任何其他原因,因为渲染缓冲区附件根本没有用(努力避免说“延迟”)。渲染到纹理应该更慢(或任何不同),没有直接明显的原因。

标签: opengl


【解决方案1】:

纹理为您提供更多功能(采样!、格式多样性),因此更容易受到性能损失的影响。

答案很简单:在必须从表面采样的任何地方使用 纹理(没有其他选择)。

在不需要采样的地方使用渲染缓冲区。驱动程序可能会也可能不会根据您表达的不进行采样的意图来决定更有效地存储您的像素数据。 之后您可以使用 GL blitting 对结果进行处理。

【讨论】:

  • 最后,对这个简单的问题给出一个好的、直接的答案。谢谢。似乎很多人对这个话题一无所知(换句话说——他们不知道)。
  • 从表面采样是什么意思?你能举出更具体的例子吗?什么时候需要采样?
  • @bluenote10 通过“采样”我的意思是在着色器中查询纹理的特定值。有关更多信息,请参阅opengl.org/wiki/Sampler_%28GLSL%29 的“纹理查找函数”。例如,如果您需要模糊某些东西,您的着色器通常会对像素区域进行采样并对它们进行加权,因此您需要一个纹理源。在另一种情况下,如果你只是想通过深度测试绘制一些东西,你可以使用深度渲染缓冲区。
  • @kvark 你能把它与在给定点获取纹素进行对比吗?例如,渲染缓冲区能否用于延迟着色通道,其中解析着色器只需要在特定点访问特定纹素而不需要插值?
  • @Jherico 您无法从渲染缓冲区中获取纹素,只能从纹理中获取。
【解决方案2】:

将问题扩展到 OpenGL|ES,使用 RenderBuffers 而不是纹理的另一个原因是,某些配置可能不支持纹理并阻止您构建有效的 FBO。我特别考虑了 depth 纹理,某些硬件(例如 nVidia Tegra 2/3)本身不支持这些纹理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2011-09-06
    • 2014-07-08
    相关资源
    最近更新 更多