我已经检查过this问题。在纹理加载器选项中使用 [MTKTextureLoader.Option.SRGB : false]
不起作用。所发生的一切是当我执行[MTKTextureLoader.Option.SRGB : true]
时,它变暗了很多,而不是稍微暗了一点。一定还有别的东西。以下是这种不良行为的示例。
这是原始纹理供引用:
正如你所看到的,我使用鼠标将原始的冰 block 纹理保持在渲染的纹理上。即使使用 [MTKTextureLoader.Option.SRGB : false]
,它也轻得多。尽管我悬停在渲染纹理上的图像稍微透明,但不需要的效果仍然清晰存在。
这是我的片段函数:
fragment half4 TextureFragment(VertexOut VertexIn [[stage_in]], texture2d<float> Texture [[texture(0)]]) {
constexpr sampler ColorSampler(mip_filter::nearest, mag_filter::nearest, min_filter::nearest);
float4 Color = Texture.sample(ColorSampler, VertexIn.TexCoord.xy / VertexIn.TexCoord.z);
return half4(Color.r, Color.g, Color.b, 1);
}
如何解决这个问题?如何渲染实际纹理而不是较暗的版本?
注意:我必须解决问题,而不是解决它。解决方法是从片段着色器中 return half4(Color.r+0.1, Color.g+0.1, Color.b+0.1, 1);
。我必须从根本上解决这个问题。为什么库中有这么多错误?
我还尝试将黑色背景更改为白色,但它不会改变纹理,因此不起作用。
我想我曾经被告知要使用 Xcode 的 GPU 帧调试器检查纹理。这是什么意思?
我们将非常感谢您的帮助。
最佳答案
为了加载这些 PNG 图像,我需要将 PixelFormat 设置为 bgra8Unorm_srgb 而不是 bgra8Unorm。为什么默认情况下不只是 bgra8Unorm_srgb ? This answer指定如何执行此操作。我自己弄清楚了,同时我没有得到其他评论,没有其他答案。我基本上必须独自解决这个问题。
MetalView.colorPixelFormat = .bgra8Unorm_srgb
所以我可以
PipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm_srgb
所以我得到了正确的图像渲染
关于swift - Metal 渲染奇怪的较暗纹理,即使使用 [MTKTextureLoader.Option.SRGB : false]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61761448/