MTKTextureLoader导致灰度图像出现条纹

时间:2019-01-18 20:33:53

标签: swift metal metalkit

我正在尝试在金属着色器中实现简单的LUT颜色等级。它与彩色LUT一起使用,但是当LUT为灰度时,问题就会出现。首先,加载灰度图像会导致“图像解码失败”错误,该错误已通过this bug workaround修复。

通过将图像重新表征为资产束中的纹理,可以成功加载图像,但是输出图像上出现了条纹。果然,捕获GPU帧表明纹理中已引入了条纹:

banding in LUT texture

在资产捆绑包或源PNG中进行“快速查看”时,不会出现此带。检查纹理的像素格式表明它已编码为ASTC_4x4_sRGB,Apple documentation指出是低动态范围内容的压缩格式。似乎这种压缩可能会导致LUT纹理降级。通常,在使用LUT时,我会避免任何压缩,但是我找不到在MTKTextureLoader中禁用压缩或强制像素格式的方法。

我还尝试了各种MTKTextureLoader选项,包括启用/禁用sRGB,mipmap等。

关于如何解决条带的任何想法?

1 个答案:

答案 0 :(得分:3)

重要的是要理解,当对资产目录中的纹理资产使用MTKTextureLoader时,大多数运行时纹理加载器选项将被忽略。可能没有记录,但目前是这种情况。

通过在Xcode资产目录编辑器中选择资产并将其像素格式显式设置为“ 8位归一化-RGBA”之类的方法,您也许可以避免这种自动压缩(意图良好,但既笨拙又过于激进) ”,它会在运行时映射到.rgba8Unorm

Xcode texture asset settings