如何在多样本纹理中渲染颜色和深度



为了实现"深度剥离",我将我的OpenGL场景渲染到一系列帧缓冲区中,每个帧缓冲区都配备了rgba颜色纹理和深度纹理。如果我不关心抗锯齿,这工作得很好。如果我这样做,那么似乎正确的事情是启用GL_MULTISAMPLING并使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D。但我不清楚还有哪些电话需要替换。

特别是,我应该如何调整我的framebuffer结构来使用glTexImage2DMultisample而不是glTexImage2D ?

我是否需要在使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D之外更改对glFramebufferTexture2D的调用?

如果我渲染颜色和深度到纹理,我需要调用glRenderbufferStorageMultisample吗?

最后,有一些glBlit*,我需要做的除了设置纹理为帧缓冲渲染成?

关于这个主题有许多相关的问题,但我发现的解决方案似乎都没有指向一个规范的教程或明确的例子来把所有这些放在一起。

虽然我只使用了renderbuffers的多采样FBO渲染,而不是纹理,以下是我的理解。

我是否需要在使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D之外更改对glFramebufferTexture2D的调用?

不,这就是你所需要的。您使用glTexImage2DMultisample()创建纹理,然后使用GL_TEXTURE_2D_MULTISAMPLE作为glFramebufferTexture2D()的第三个参数将其附加。唯一的限制是级别(第5个参数)必须为0。

如果我渲染颜色和深度到纹理,我需要调用glRenderbufferStorageMultisample吗?

是的。如果您将深度缓冲区附加到相同的FBO,则需要使用多采样渲染缓冲区,其采样数量与颜色缓冲区相同。所以你用glRenderbufferStorageMultisample()创建你的深度渲染缓冲,传递你用于颜色缓冲的相同样本计数。

最后,有一些glBlit*,我需要做的除了设置纹理为帧缓冲渲染成?

不用于渲染到framebuffer。完成渲染后,有几个选项:

  1. 你可以将多样本纹理下采样(解析)为常规纹理,然后在后续渲染中使用常规纹理。要解析多样本纹理,可以使用glBlitFramebuffer(),其中多样本纹理附加到GL_READ_FRAMEBUFFER,规则纹理附加到GL_DRAW_FRAMEBUFFER

  2. 您可以在后续渲染中使用多样本纹理。你需要使用sampler2DMS类型的采样器在你的着色器代码,与相应的采样函数。

对于选项1,我真的没有看到一个很好的理由使用多样本纹理。您也可以使用多样本渲染缓冲区,它稍微容易使用,并且至少应该同样有效。为此,您为颜色附件创建一个渲染缓冲区,并使用glRenderbufferStorageMultisample()分配它,这与您需要的深度缓冲区非常相似。

最新更新