Metal // 读取多重采样深度纹理

Metal // Reading multisampled depth texture

对于某些 post 渲染效果,我需要阅读深度纹理。只要关闭多重采样,它就可以正常工作。但是使用多重采样我无法读取纹理。

尝试通过 depth2d_ms 参数在着色器中使用多重采样纹理,编译器将在 运行 时失败并显示错误消息 "Internal Compiler Error"。

我发现使用 OpenGL 时,您首先要将多重采样深度缓冲区 blit 到解析的深度缓冲区以读取采样值,但是对于 Metal,我得到一个断言错误,指出 blit 纹理的样本计数需要匹配,所以没有机会将 4 个样本变成 1 个。

那么如何在使用多重采样时从深度缓冲区中读取采样值或未采样值?

我不知道答案。但建议尝试以下解决方案:

设置MTLRenderPassDepthAttachmentDescriptor的storeAction如下:

  depthAttachment.storeAction = MTLStoreActionMultisampleResolve;

并将其 resolveTexture 设置为另一个纹理:

  depthAttachment.resolveTexture = targetResolvedDepthTexture.

最后,尝试读取targetResolvedDepthTexture内容。

MSAA 深度解析 仅在 iOS GPU 系列 3 v1(A9 GPU on iOS 9)中受支持

查看功能可用性文档:

https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/MetalFeatureSetTables/MetalFeatureSetTables.html#//apple_ref/doc/uid/TP40014221-CH13-DontLinkElementID_8