为了实现“深度剥离”,我将我的OpenGL场景渲染到一系列帧缓冲区中,每个帧缓冲区都配备了rgba颜色纹理和深度纹理。这个很好用如果我不关心反混叠。如果我这样做了,那么正确的做法似乎是启用GL_MULTISAMPLING
并使用GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
。但我搞不懂还有哪些电话需要更换。
特别是,我应该如何调整我的框架缓冲区结构,使其使用glTexImage2DMultisample
而不是glTexImage2D
?
我是否需要改变对glFramebufferTexture2D
的调用,而不是使用GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
如果我将颜色和深度渲染成纹理,是否需要调用glRenderbufferStorageMultisample
?
最后,除了设置框架缓冲区要呈现的纹理之外,还有什么glBlit*
需要做吗?
关于这个主题,有很多相关的问题,但我发现的解决方案中,没有一个似乎指向一个规范的教程或明确的例子将所有这些组合在一起。
发布于 2015-05-25 18:16:50
虽然我只使用多采样FBO渲染与渲染缓冲区,而不是纹理,以下是我的理解。
我是否需要改变对
glFramebufferTexture2D
的调用,而不是使用GL_TEXTURE_2D_MULTISAMPLE
而不是GL_TEXTURE_2D
?
不,这就是你所需要的。使用glTexImage2DMultisample()
创建纹理,然后使用GL_TEXTURE_2D_MULTISAMPLE
作为第三个参数附加到glFramebufferTexture2D()
。唯一的限制是,级别(第5个参数)必须为0。
如果我将颜色和深度渲染成纹理,是否需要调用
glRenderbufferStorageMultisample
?
是。如果将深度缓冲区附加到相同的FBO,则需要使用多采样呈现缓冲区,并将相同数量的示例作为颜色缓冲区。因此,您可以使用glRenderbufferStorageMultisample()
创建深度呈现缓冲区,传递用于颜色缓冲区的相同的示例计数。
最后,除了设置框架缓冲区要呈现的纹理之外,还有什么
glBlit*
需要做吗?
不适用于渲染到框架缓冲区。一旦您完成了渲染,您就有了几个选项:
glBlitFramebuffer()
,其中多样本纹理附加到GL_READ_FRAMEBUFFER
,规则纹理附加到GL_DRAW_FRAMEBUFFER
。sampler2DMS
类型的采样器在您的着色器代码,与相应的抽样功能。对于选项1,我认为使用多样本纹理并不是很好的理由。您还可以使用一个多示例呈现缓冲区,它稍微容易使用,并且至少应该具有同样的效率。为此,您为颜色附件创建一个呈现缓冲区,并将其分配给glRenderbufferStorageMultisample()
,非常类似于深度缓冲区所需的内容。
https://stackoverflow.com/questions/30427944
复制相似问题