3

为了实现“深度剥离”,我将我的 OpenGL 场景渲染到一系列帧缓冲区中,每个帧缓冲区都配备了 rgba 颜色纹理和深度纹理。如果我不关心抗锯齿,这很好用。如果我这样做了,那么似乎正确的做法是启用GL_MULTISAMPLING并使用 aGL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D. 但我对需要更换哪些其他电话感到困惑。

特别是,我应该如何调整我的帧缓冲区结构以使用glTexImage2DMultisample而不是glTexImage2D

我是否需要将调用更改为glFramebufferTexture2D超出使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D

如果我将颜色和深度都渲染到纹理中,是否需要调用glRenderbufferStorageMultisample

最后,glBlit*除了为要渲染的帧缓冲区设置纹理之外,我还需要做些什么吗?

关于这个主题有很多相关问题,但我发现的解决方案似乎都没有指向规范教程或将所有这些放在一起的清晰示例。

4

1 回答 1

1

虽然我只使用渲染缓冲区而不是纹理的多重采样 FBO 渲染,但以下是我的理解。

我是否需要将调用更改为glFramebufferTexture2D超出使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D

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

如果我将颜色和深度都渲染到纹理中,是否需要调用glRenderbufferStorageMultisample

是的。如果将深度缓冲区附加到同一个 FBO,则需要使用多重采样渲染缓冲区,其样本数与颜色缓冲区相同。因此,您使用 来创建深度渲染缓冲区glRenderbufferStorageMultisample(),并传入您用于颜色缓冲区的相同样本计数。

最后,glBlit*除了为要渲染的帧缓冲区设置纹理之外,我还需要做些什么吗?

不适用于渲染到帧缓冲区。完成渲染后,您有几个选择:

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

  2. 您可以使用多重采样纹理进行后续渲染。您将需要sampler2DMS在着色器代码中使用采样器的类型以及相应的采样函数。

对于选项 1,我真的看不出使用多重采样纹理的充分理由。您也可以使用多重采样渲染缓冲区,它更易于使用,并且至少应该同样有效。为此,您为颜色附件创建一个渲染缓冲区,并使用 分配它,这与glRenderbufferStorageMultisample()深度缓冲区所需的非常相似。

于 2015-05-25T18:16:50.507 回答