swift - MTKTextureLoader 导致灰度图像出现 strip

标签 swift metal metalkit

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

通过将图像重新表征为 Assets 包中的纹理,它可以成功加载,但输出图像上存在 strip 。果然,捕获 GPU 帧显示纹理中已引入 strip :

banding in LUT texture

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

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

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

最佳答案

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

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

Xcode texture asset settings

关于swift - MTKTextureLoader 导致灰度图像出现 strip ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54261068/

相关文章:

ios - Metal 同时有纹理和无纹理,多重混合

c++ - 在 Metal 着色器代码中,如何定义函数的输入/输出参数变量?

ios - 在 WebRTC 库中关闭 View Controller 时因 EXC_BAD_ACCESS 错误而崩溃

image-processing - 使用 Swift 4 在 Metal Compute Kernel 中传递参数

ios - Metal 着色器中的 GLSL gl_FragDepth 等效项

ios - 使用 MTKView 显示 JPEG 图片

ios - xCode 项目未在 macOS Catalina 10.15.5 上找到 c++ 标准库

swift - Swift 中集合类型的扩展,用于查找对象之后的所有对象

ios - Swift2 SpriteKit 推特分享错误

ios - 在图片右上角绘制文字