MTKTextureLoader 导致灰度图像出现条带

MTKTextureLoader causing banding in grayscale image

我正在尝试在金属着色器中实现一个简单的 LUT 颜色等级。它适用于彩色 LUT,但当 LUT 为灰度时,问题就会出现。首先,加载灰度图像会导致 "image decoding failed" 错误,该错误已通过 this bug workaround 修复。

通过将图像重新定性为资源包中的纹理,加载成功,但输出图像上有条带。果然,捕捉一个GPU帧显示纹理中已经引入了banding:

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

我也尝试了各种 MTKTextureLoader 选项,包括 enabling/disabling sRGB、mipmaps 等

关于如何修复条带有什么想法吗?

重要的是要了解,当 MTKTextureLoader 与资产目录中的纹理资产一起使用时,大多数运行时纹理加载器选项都会被忽略。这可能没有记录,但目前确实如此。

您可以通过在 Xcode 资产目录编辑器中选择您的资产并将其像素格式明确设置为类似于“8 位规范化 - RGBA”,在运行时映射到 .rgba8Unorm