Apple Metal Shader Language (MSL) 始终是线性颜色?

Tri*_*cky 5 ios metal metalkit

我试图在金属片段(或计算)着色器的上下文中理解颜色。

我的理解是,在金属着色器的上下文中,任何颜色值始终是线性的。无论纹理附加到片段或计算函数,金属都会在进入着色器时应用任何线性传递函数(伽玛)的反函数,并在退出时再次应用它。

考虑到这一点,如果在着色器的上下文中,我返回一个近似线性中间灰度值约为 22.25% 的值,当使用金属套件通过简单纹理渲染到屏幕时,我希望得到.bgra8Unorm一个非线性 sRGB 读数约为 128,128,128。

fragment float4 fragment_shader(
    TextureMappingVertex in [[stage_in]]
) {
    float middleGrey = float(0.2225);
    return float4(middleGrey, middleGrey, middleGrey, 1);
}
Run Code Online (Sandbox Code Playgroud)

但事实上,如果着色器内没有与线性颜色空间之间的转换,我会得到 57,57,57 的输出:

线性中灰

我在这里缺少什么?

一方面,这当然看起来更直观,但它违背了我认为的金属着色器的规则,因为它们总是在线性空间中。