如何在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 (...)
可能比绘制带纹理的四边形慢。
我使用 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 (...)
可能比绘制带纹理的四边形慢。