自定义金属 CIKernel 返回固定颜色产生不同的颜色

问题描述

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

这是我的代码

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

这是断点的结果。

enter image description here

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

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

enter image description here

好像有伽马校正?如何解决这个问题?有谁帮忙

解决方法

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...