2

我有一个由 Metal 定制的 CIKernel,我发现一个奇怪的东西,着色器返回一个固定的颜色,但屏幕显示不同!我使用断点检查生成的 CIImage 对象,颜色确实不同。

有我的代码

float4 test(sample_t s) {
    return float4(16 / 255.0, 16 / 255.0, 16 / 255.0, 1);
}

这是断点的结果。

在此处输入图像描述

我想要(16,16,16)颜色,但它产生了(62,62,62)颜色。

我试了很多次,得到了这张图,(x轴是输入值(着色器返回),y轴是结果)

在此处输入图像描述

看起来有伽玛校正?如何解决这个问题?任何人都可以帮助

4

1 回答 1

0

是的,这很可能是伽马校正。

Core Image 使用线性(非伽马压缩)sRGB 工作颜色空间,即您在内核中读取和写入的所有颜色值都被解释为线性的、未校正的光值。
但是,大多数渲染目标都具有非线性色彩空间(如 sRGB 或 Display P3),因此在渲染期间会发生伽马压缩,这会改变像素值的存储方式(但不显示)。

如果要禁用输出的伽马校正,则需要指定线性输出色彩空间,例如linearSRGBextendedLinearDisplayP3

于 2021-06-18T05:39:20.610 回答