使用VAO和着色器,我成功地使用Texturebuffer渲染纹理。
但FBO还有其他颜色缓冲选项,它是Renderbuffer。我在互联网上搜索了很多,但找不到任何与绘制Renderbuffer作为Texturebuffer并使用着色器相关的示例
如果我错了,Renderbuffer在OpenGL 3.30中发布,它比Texturebuffer更快。
我可以使用Renderbuffer作为Texturebuffer吗? (愚蠢的问题?我认为这应该是绝对的,不是吗?)
如果是,请引导我或给出任何示例以将渲染缓冲区绘制为纹理缓冲区。
我的目标只是用于学习,但我想知道绘制纹理的更好方法是什么?我们应该经常使用吗?
答案 0 :(得分:1)
首先,不要使用术语"纹理缓冲区"当你真的只是意味着纹理。 A"缓冲区纹理" /"纹理缓冲区对象"是一个不同的概念,在这里完全不相关。
如果我错了,Renderbuffer在OpenGL 3.30中发布,它比Texturebuffer更快。
没有。当FBO最初被发明时,Renderbuffers就在那里。一个比另一个更快的通常也不是真的,但这些是实现细节。但它也无关紧要。
我可以使用Renderbuffer作为Texturebuffer吗? (愚蠢的问题?我认为这应该是绝对的,不是吗?)
不。您无法直接将renderbuffer的内容用作纹理映射的源。 Renderbuffesr只是GPU渲染的抽象内存区域,并且它们不是纹理化所需的格式。您可以使用glReadPixels
将结果读回CPU,我们可以将数据复制到纹理对象中,例如,通过glCopyTexSubImage
- 但这比直接渲染到纹理要慢得多。
因此,渲染缓冲区适用于不同的用例集:
答案 1 :(得分:0)
看来您的术语已经混淆了。
您将 图像 附加到Framebuffer对象。这些图像可以是 Renderbuffer对象(这是除了附加和blitting之外几乎没有用处的屏幕外表面),或者它们可以是纹理对象的一部分。
使用任何有意义的。如果您需要在着色器中读取绘图的结果,那么显然您应该附加纹理。如果你只需要一个深度缓冲区,但永远不需要读回来,渲染缓冲区可能没问题。一些较旧的硬件不支持多重采样纹理,因此这是另一种情况,您可能更喜欢渲染缓冲区而不是纹理。
表现明智,不做任何假设。您可能会认为,由于渲染缓冲区的使用量较少,因此它们会更快,但情况并非总是如此。 glBlitFramebuffer (...)
可能比绘制纹理四边形慢。