即使使用[MTKTextureLoader.Option.SRGB:false],金属也会渲染出较暗的暗纹理?

问题描述 投票:0回答:1

我已经检查了this问题。在纹理加载器选项中使用[MTKTextureLoader.Option.SRGB : false]不起作用。发生的全部是当我执行[MTKTextureLoader.Option.SRGB : true]时,它变得更黑而不是稍微更黑。肯定还有别的东西。这是此不良行为的示例。Example of unwanted behavior这是供参考的原始纹理:Original texture for reference如您所见,我正在使用鼠标将原始填充的冰纹理保留在渲染的冰纹理上。即使使用[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);
}

如何解决该问题?如何渲染实际的纹理而不是较暗的版本?

注意:我必须fix问题,不能解决。解决方法类似于片段着色器中的return half4(Color.r+0.1, Color.g+0.1, Color.b+0.1, 1);。我必须从根本上解决问题。为什么库中有那么多错误?

我还尝试将黑色背景更改为白色,并且它不会更改纹理,因此不起作用。

我想我曾经被告知使用Xcode的GPU帧调试器检查纹理。这是什么意思?

将不胜感激。

swift macos rendering textures metal
1个回答
0
投票

为了加载这些PNG图像,我需要将pixelFormat设置为bgra8Unorm_srgb而不是bgra8Unorm。为什么默认情况下它不只是bgra8Unorm_srgb? This answer指定如何执行此操作。我自己弄清楚了,与此同时我没有其他意见,也没有其他答案。我基本上不得不独自解决。

MetalView.colorPixelFormat = .bgra8Unorm_srgb

所以我可以

PipelineDescriptor.colorAttachments[0].pixelFormat = .bgra8Unorm_srgb

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.