【问题标题】:Multisampling on iOS can't get depth texture?iOS 上的多重采样无法获得深度纹理?
【发布时间】:2013-07-17 11:52:39
【问题描述】:

我已经在 iOS 上设置了渲染到带有颜色和深度纹理的帧缓冲区,一切正常。然后我尝试通过 APPLE 扩展添加多重采样(我使用此代码 Rendering to texture on iOS OpenGL ES—works on simulator, but not on device )但显然有一个问题。

在将多重采样缓冲区解析为我的原始帧缓冲区(用于后期处理效果)后,我只解析了颜色缓冲区。 glResolveMultisampleFramebufferAPPLE() 显然根本没有触及我的深度纹理,所以如果我使用多重采样,我必须放弃我的深度纹理效果。如果我使用多重采样,有没有办法获得深度纹理?我知道多重采样的工作原理,我只想要颜色纹理旁边的深度纹理。

【问题讨论】:

    标签: ios opengl-es-2.0


    【解决方案1】:

    APPLE_framebuffer_multisample 上的规范告诉 glResolveMultisampleFramebufferApple 解析颜色附件,这意味着您必须在附加渲染通道中将深度写入颜色渲染缓冲区并解析它以获得深度信息。

    【讨论】:

    • 这是 DX9 风格,如果场景中有很多多边形,将所有内容渲染两次会很快降低性能,尤其是在移动设备上。我正在寻找一种 DX10+ 样式,我可以在其中获取驱动程序中已有的内容,或者更确切地说,我可以告诉驱动程序在哪里解决什么问题(多采样颜色到颜色和多采样深度到深度)。至少 GL ES 3 将标准化多个渲染目标,因此您所说的可以在没有辅助通道的情况下完成。
    【解决方案2】:

    好的,经过几天的调查,我得到了答案。 所以 APPLE 扩展存在(并且与 EXT 不同)只是因为它只解析颜色。 GL ES 3.0 标准(可能会出现在 iOS 7.1 中)或 DesktopGL 表示,为了解析颜色或深度,您使用 glBlitFramebuffer 来复制和解析事物。我使用 DesktopGL 4.2 进行了尝试,并且 blitting 深度缓冲区有效。

    我还回到了我的 DirectX11 渲染器,并在支持 DirectX 11.1 级别功能的 GPU 上尝试了同样的事情,我很惊讶领先的硬件无法在一次解析调用中做到这一点。当您尝试解析绑定为深度的纹理时,ID3D11DeviceContext::ResolveSubresource 会引发错误。解决方法是要么有一个特殊的着色器通道来进行深度解析,但这意味着使用 Texture2DMS(一个 DirectX 10_1 级别功能),或者通过 2 个未绑定到深度的单独纹理来乒乓纹理(意味着 1 个解析调用和 2 个全深度纹理副本)。

    在 GL 中使用相同的对应物意味着使用 glTexImage2DMultisample 图像而不是多重采样渲染缓冲区(桌面 OpenGL 3.1 的一部分),然后在像素着色器中使用 sampler2DMS 进行实际的着色器纹理提取。

    编辑:glBlitFramebuffer 是否解析深度似乎被标记为依赖于实现。在桌面 GL (HD7850) 上它可以工作,在 GLES3 上它仍然无法解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多