在MSL中,颜色可以使用标准8位无符号整数(0~255)表示,也可以使用浮点数(范围为0.0~1.0)表示。无论使用整数还是浮点数,MSL始终使用线性颜色。这意味着颜色值在计算之前会被转换成线性空间,然后在计算后再转换回RGB颜色空间。 以下是一个使用MSL的代码示例,其中颜色转换(转换为线性空间,完成计算后再转换回RGB空间)在函数内部完成:
fragment float4 myFragmentShader(VertexOut in [[stage_in]]) {
// 定义颜色,并将其转换为线性空间
float4 color = convertLinearRGBA(in.color);
// 颜色计算代码,计算结果仍然在线性空间中
float4 result = color * someMatrix;
// 将计算结果转换回RGB颜色空间
return convertRGB(result);
}
// 颜色转换函数:将颜色转换为线性空间
inline float4 convertLinearRGBA(uint4 rgba) {
float4 color;
color.r = pow(rgba.r / 255.0, 2.2);
color.g = pow(rgba.g / 255.0, 2.2);
color.b = pow(rgba.b / 255.0, 2.2);
color.a = rgba.a / 255.0;
return color;
}
// 颜色转换函数:将颜色转换为RGB颜色空间
inline float4 convertRGB(float4 linearColor) {
float4 color;
color.r = pow(linearColor.r, 1.0 / 2.2);
color.g = pow(linearColor.g, 1.0 / 2.2);
color.b = pow(linearColor.b, 1.0 / 2.2);
color.a = linearColor.a;
return color;
}