如何将多重采样深度缓冲区解析为深度纹理?

4
我在处理msaa深度缓冲区解析为深度纹理时遇到了问题。我创建了glTexImage2d用于我的颜色纹理和深度纹理,并将它们绑定到“resolve”(非msaa)帧缓冲区。然后我创建并绑定另一个帧缓冲区,并创建我的多重采样渲染缓冲区(颜色和深度)。我知道如何从多重采样渲染缓冲区获取我的颜色纹理信息,只需使用写入缓冲区作为我的颜色纹理帧缓冲区,读取缓冲区作为我的msaa帧缓冲区即可进行blit操作。我的问题是如何将我的多重采样深度缓冲区blit到我的深度纹理中。
1个回答

4
您可以像为颜色缓冲区做的那样来完成这个操作,只需使用GL_DEPTH_BUFFER_BIT并确保在过滤模式中使用GL_NEAREST。如果您想在深度/模板缓冲区上进行线性过滤,出于任何原因,您实际上可以在GLSL中使用深度纹理来实现(当然,这仍然对MSAA纹理无效)- 但是使用glBlitFramebuffer (...)这样做是无效的。

您不必像选择单个颜色缓冲区时那样执行任何glReadBuffer (...)荒谬操作,glBlitFramebuffer (...)将从绑定的GL_READ_FRAMEBUFFER复制深度缓冲区到绑定的GL_DRAW_FRAMEBUFFER


所以,如果我像这样复制颜色缓冲区...glDrawBuffer(GL_COLOR_ATTACHMENT0);glReadBuffer(GL_COLOR_ATTACHMENT0);glBlitFrameBuffer(0,0,mWidth,mHeight,0,0,mWidth,mHeight,GL_COLOR_BUFFERBIT,GL_NEAREST);...我可以在BlitFrameBuffer中添加深度缓冲位吗?像这样...glBlitFrameBuffer(0,0,mWidth,mHeight,0,0,mWidth,mHeight,GL_COLOR_BUFFERBIT | GL_DEPTH_BUFFER_BIT,GL_NEAREST);...然后gl会自己处理吗? - Ryan Bartley
应该 行得通。前提是你的读取和绘制帧缓冲都有颜色附件0和深度缓冲。如果您的颜色缓冲区和深度缓冲区具有不同的尺寸(是的,这是可能的),或者如果您的深度缓冲区是压缩深度/模板(如果您想直接复制到窗口,则通常情况下是这样),则可能会出现问题。 - Andon M. Coleman
我应该补充一下,MSAA深度纹理是Shader Model 4.1的一个特性(也就是说,在SM 4.1之前它们不是必需的)。它们不支持比AMD Radeon HD 3xxx或GeForce 2xx旧的硬件。理论上,这只会影响你如果你想从MSAA深度纹理复制到单采样的渲染缓冲区/纹理,但你永远不知道。 - Andon M. Coleman
请告诉我您使用的硬件,我很想知道是否是罪魁祸首;我有自己的理论。 - Andon M. Coleman
非常感谢。很抱歉让你等了这么久。它起作用了。由于某种原因,我对是否需要将glReadBuffer和glDrawBuffer设置为GL_DEPTH_COMPONENT并进行blit感到困惑。我很感激你能够如此迅速地回复我。 - Ryan Bartley
那对我也起作用了!我得到了(解决)颜色纹理抗锯齿,但深度纹理则出现了锯齿。问题出在哪里?我使用的是Intel HD3000 GPU。 - Alexey S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接