金属颜色表示问题(使用sRGB像素格式)

时间:2018-04-25 01:52:11

标签: ios shader metal alphablending metalkit

如果CAMetalLayer pixelFormat设置为rgba8Unorm_srgb,我无法在我的基本Metal项目中实现正确的颜色表示。正确的我的意思是我的UIColor和UIImage在金属中应该像在UIKit中一样。我发现,如果我的CAMetalLayer pixelFormat是rgba8Unorm,那就完全正确了。但我真的需要使用rgba8Unorm_srgb

我附上了这个项目的两个截图。它有一个平方的CAMetalLayer。它的灰色背景颜色是MTLRenderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0.5, 0.5, 0.5, 1)。它还有白色和黑色四边形以及另一个四边形,上面有红色渐变,实际上使用标准的alpha混合:

colorAttachments[0].rgbBlendOperation = .add
colorAttachments[0].alphaBlendOperation = .add

colorAttachments[0].sourceRGBBlendFactor = .sourceAlpha
colorAttachments[0].sourceAlphaBlendFactor = .sourceAlpha

colorAttachments[0].destinationRGBBlendFactor = .oneMinusSourceAlpha
colorAttachments[0].destinationAlphaBlendFactor = .oneMinusSourceAlpha

两个屏幕截图之间的唯一区别是他们的CAMetalLayer pixelFormat。但正如你所看到的那样,即使是清晰的颜色也已经不同了。 (它们实际上与伽马校正完全不同)。白色和黑色相同,但所有其他颜色也不同。 Alpha混合在rgba8Unorm_srgb上也无法正常工作:你可以看到,白色目的地的一半是去饱和的,黑色目的地的一半是过饱和的。

根据我的理解,我不需要担心伽马校正,不需要修改我的着色器或颜色。无论pixelFormat如何,Metal都应该在线性空间中完成所有数学运算。那为什么会这样呢?

rgba8Unorm rgba8Unorm_srgb

0 个答案:

没有答案