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

时间:2015-02-13 17:25:19

标签: opengl opengl-es framebuffer render-to-texture

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

但FBO还有其他颜色缓冲选项,它是Renderbuffer。我在互联网上搜索了很多,但找不到任何与绘制Renderbuffer作为Texturebuffer并使用着色器相关的示例

如果我错了,Renderbuffer在OpenGL 3.30中发布,它比Texturebuffer更快。

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

如果是,请引导我或给出任何示例以将渲染缓冲区绘制为纹理缓冲区。

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

2 个答案:

答案 0 :(得分:1)

首先,不要使用术语"纹理缓冲区"当你真的只是意味着纹理。 A"缓冲区纹理" /"纹理缓冲区对象"是一个不同的概念,在这里完全不相关。

  

如果我错了,Renderbuffer在OpenGL 3.30中发布,它比Texturebuffer更快。

没有。当FBO最初被发明时,Renderbuffers就在那里。一个比另一个更快的通常也不是真的,但这些是实现细节。但它也无关紧要。

  

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

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

因此,渲染缓冲区适用于不同的用例集:

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

答案 1 :(得分:0)

看来您的术语已经混淆了。

您将 图像 附加到Framebuffer对象。这些图像可以是 Renderbuffer对象(这是除了附加和blitting之外几乎没有用处的屏幕外表面),或者它们可以是纹理对象的一部分。

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

表现明智,不做任何假设。您可能会认为,由于渲染缓冲区的使用量较少,因此它们会更快,但情况并非总是如此。 glBlitFramebuffer (...)可能比绘制纹理四边形慢。