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)中受支持。
查看功能可用性文档:
对于某些 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)中受支持。
查看功能可用性文档: