自定义Metal CIKernel返回固定颜色会产生不同的颜色

3

我有一个使用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轴是输入值(shader返回),y轴是结果)

在此输入图片描述

看起来像是进行了伽玛校正?如何解决?有人能帮忙吗?

1个回答

0

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

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

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


我应该在哪里指定这个颜色空间?CISampler吗? - undefined
我正在开发一个色调曲线功能,我发现通过曲线映射得到的最终颜色与Photoshop的结果不同,我认为我的曲线是正确的,并且我想弄清楚是什么导致了这种差异,并找到了原因。例如,我的曲线将100转换为16,所以在采样的内核中可能有一些颜色为100,然后应该输出16,对吗?但最终的颜色是64,整个图像的颜色不符合我的要求。 - undefined
你如何渲染CIImage?几乎所有CIContext的渲染API都有一个colorSpace参数。尝试在那里传递一个线性色彩空间。 - undefined
@FrankRupprecht 如果我们将 workingColorSpace 设置为 NSNull(),在内核中我们会得到伽马校正的值还是线性值? - undefined
@DeepakSharma 你应该获得与输入图像相同的伽马校正(或者没有伽马校正)。当你将workingColorSpace设置为NSNull()时,Core Image不会进行任何颜色转换。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接