swift - Metal 渲染奇怪的较暗纹理,即使使用 [MTKTextureLoader.Option.SRGB : false]?

标签 swift macos rendering textures metal

我已经检查过this问题。在纹理加载器选项中使用 [MTKTextureLoader.Option.SRGB : false] 不起作用。所发生的一切是当我执行[MTKTextureLoader.Option.SRGB : true]时,它变暗了很多,而不是稍微暗​​了一点。一定还有别的东西。以下是这种不良行为的示例。 Example of unwanted behavior 这是原始纹理供引用:
Original texture for reference
正如你所看到的,我使用鼠标将原始的冰 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

所以我得到了正确的图像渲染

enter image description here

关于swift - Metal 渲染奇怪的较暗纹理,即使使用 [MTKTextureLoader.Option.SRGB : false]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61761448/

相关文章:

ios - Xcode - 如何修复 'NSUnknownKeyException',原因 : … this class is not key value coding-compliant for the key X"error?

css - CSS 的速度

css - 如何在Grails渲染插件模板中使用bootstrap css

ios - 子类 UIView 上的 UIPanGestureRecognizer

file - 在 Swift 中,如何将现有二进制文件读入数组?

c - OSX Yosemite getutxent() 返回同一用户两次

objective-c - 具有自定义 View 的 NSMenuItem 不会更新

android - 如何解决 Android Studio 4.2 渲染问题?

ios - 当用户点击图表时创建一个 MarkerView

ios - 在闭包之外使用 "self"是否有实际好处?