OpenGL FBO渲染缓冲区或纹理附件

20

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


2
我一直对此感到困惑已久。我的猜测是,存在一些基于PBuffer的遗留程序库,有些人不愿意适应不同的概念(即写入纹理而不是写入PBuffer并复制),因此在FBO之上重新实现了确切的PBuffer功能,以鼓励他们使用FBO。我真的想不出其他原因,因为渲染缓冲区附件根本没有用处(努力避免说“愚蠢”)。没有明显的理由说明为什么渲染到纹理会更慢(或者有任何不同)。 - Damon
2个回答

24

纹理为您提供更多功能(采样!格式多样性),因此更有可能出现性能损失。

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

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


2
终于有一个好的、直截了当的回答这个简单的问题。谢谢。似乎很多人对这个主题只有含糊其辞的评论(换句话说——他们并不知道)。 - Engineer
“从表面采样”是什么意思?您能给出更多具体的例子,说明何时需要采样以及何时不需要吗? - bluenote10
2
@bluenote10,“采样”是指在着色器中查询纹理的特定值。请参阅https://www.opengl.org/wiki/Sampler_%28GLSL%29上的“纹理查找函数”以获取更多信息。例如,如果您需要模糊某些内容,则通常会在着色器中对像素区域进行采样并加权,因此您需要一个纹理源。在另一种情况下,如果您只想使用深度测试绘制某些内容,则可以使用深度渲染缓冲区。 - kvark
@kvark,你能对比一下在给定点获取纹素和提取纹理的区别吗?例如,可以将渲染缓冲用于延迟着色通道,其中解析着色器只需要在特定点访问特定纹素而无需插值吗? - Jherico
@Jherico,你无法从渲染缓冲区中获取纹素,只能从纹理中获取。 - kvark
完全同意。使用Renderbuffer,您可以使用glReadPixels将其提取到CPU中,而使用Texture,则可以在后续渲染中使用它。 - heLomaN

1
使用RenderBuffers而不是纹理的另一个原因是,纹理可能在某些配置中不受支持,从而防止您构建有效的FBO。我特别考虑了深度纹理,这些纹理在某些硬件上不受本地支持,例如nVidia Tegra 2/3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接