如何在FBO中绘制Renderbuffer作为Texturebuffer?

How to draw Renderbuffer as Texturebuffer in FBO?

我使用 VAO 和着色器成功地使用 Texturebuffer 渲染到纹理。

但是FBO还有另外一个颜色缓冲选项,它是Renderbuffer。我在互联网上搜索了很多,但找不到任何与 draw Renderbuffer as Texturebuffer with shaders

相关的示例

如果我没记错的话,Renderbuffer 是在 OpenGL 3.30 中发布的,它比 Texturebuffer 更快。

我可以使用 Renderbuffer 作为 Texturebuffer 吗? (愚蠢的问题吧?我认为这应该是绝对的,不是吗?)

如果是,请引导我或举例说明将渲染缓冲区绘制为纹理缓冲区。

我的目标只是学习,但我想知道这种绘制纹理的方法是否更好?我们应该经常使用它吗?

首先,当您真正指的是 纹理 时,请不要使用术语 "texture buffer"。 "buffer texture"/"texture buffer object" 是不同的概念,在这里完全不相关。

If I ain't wrong, Renderbuffer is released in OpenGL 3.30, and it's faster than Texturebuffer.

没有。首次发明 FBO 时就存在渲染缓冲区。一个比另一个快通常也不是真的,但这些是实现细节。但这也无关紧要。

Can I use Renderbuffer as Texturebuffer? (stupid question huh? I think it should be absolutely, isn't it?)

没有。您不能直接将渲染缓冲区的内容用作纹理映射的来源。 Renderbuffesr 只是 GPU 渲染到的抽象内存区域,它们不是纹理化所需的格式。您可以使用 glReadPixels 将结果读回到 CPU,我们可以将数据复制到纹理对象中,例如通过 glCopyTexSubImage - 但这比直接渲染到纹理要慢得多。

因此渲染缓冲区适用于一组不同的用例:

  • 离屏渲染(例如,图像结果将写入文件或编码为视频)
  • 作为渲染期间的辅助缓冲区,例如深度缓冲区或模板缓冲区,无论如何您都不关心这些缓冲区的最终内容
  • 当图像数据不能被以下步骤直接使用时作为中间缓冲区,例如使用多重采样并将结果复制到非多重采样帧缓冲区或纹理时

看来您混淆了术语。

您将 图像 附加到帧缓冲区对象。这些图像可以是 Renderbuffer Object(这是一个屏幕外表面,除了附加和 blitting 之外几乎没有其他用途)或者它们可以是 Texture Object.

使用任何有意义的。如果您需要在着色器中读取绘图结果,那么显然您应该附加一个纹理。如果您只需要一个深度缓冲区,但永远不需要读回它,那么渲染缓冲区可能没问题。一些较旧的硬件不支持多重采样纹理,因此这是您可能更喜欢渲染缓冲区而不是纹理的另一种情况。

性能方面,不要做任何假设。您可能会认为,由于渲染缓冲区的使用次数少得多,因此它们会以某种方式更快,但情况并非总是如此。 glBlitFramebuffer (...) 可能比绘制带纹理的四边形慢。