【问题标题】:How to resolve a multisampled depth buffer to a depth texture?如何将多重采样深度缓冲区解析为深度纹理?
【发布时间】:2013-09-17 14:28:50
【问题描述】:

我在将 msaa 深度缓冲区解析为深度纹理时遇到问题。我为我的颜色纹理和深度纹理创建了 glTexImage2d,并将它们绑定到“resolve”(非 msaa)帧缓冲区。然后我创建并绑定另一个帧缓冲区并创建我的多重采样渲染缓冲区(颜色和深度)。我知道要从多重采样渲染缓冲区中获取我的颜色纹理信息,我只是将写入缓冲区作为我的颜色纹理帧缓冲区,将读取缓冲区作为我的 msaa 帧缓冲区。我的问题是如何将我的多重采样深度缓冲区映射到我的深度纹理。

【问题讨论】:

    标签: opengl framebuffer depth-buffer render-to-texture multisampling


    【解决方案1】:

    您可以按照与颜色缓冲区相同的方式执行此操作,只是您将使用GL_DEPTH_BUFFER_BIT 并确保将GL_NEAREST 用于过滤模式。如果您想对深度/模板缓冲区进行线性过滤,无论出于何种原因,如果您使用深度纹理,您实际上可以在 GLSL 中执行此操作(当然这对于 MSAA 纹理仍然无效) - 但使用 @ 执行此操作是无效的987654323@.

    您不必像要选择单个颜色缓冲区那样做任何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 会弄清楚吗?
    • 应该工作。前提是您的读取和绘制帧缓冲区都具有颜色附件 0 和深度缓冲区。如果您的颜色缓冲区和深度缓冲区具有不同的尺寸(是的,这是可能的),或者如果您的深度缓冲区是打包的深度/模板(如果您想直接进入窗口,通常就是这种情况),事情可能会变得很棘手)。
    • 我应该补充一点,MSAA 深度纹理是 Shader Model 4.1 的一项功能(也就是说,直到 SM 4.1,它们才必需 )。许多早于 AMD Radeon HD 3xxx 或 GeForce 2xx 的硬件不支持它们。从理论上讲,这只会在您朝着相反的方向前进时才会影响您 - 尝试从 MSAA 深度纹理到单采样渲染缓冲区/纹理,但您永远不知道。
    • 让我知道您使用的是什么硬件,我很想知道这是否是罪魁祸首;我有自己的理论。
    • 非常感谢。我很抱歉花了这么长时间。那行得通。出于某种原因,我是否需要将 glReadBuffer 和 glDrawBuffer 设置为 GL_DEPTH_COMPONENT 然后对它进行 blit,这让我感到非常困惑。感谢您这么快回复我。