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

问题描述 投票:0回答:2

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

这是我的代码

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

这是断点的结果。

enter image description here

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

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

enter image description here

看起来有伽玛校正?如何解决这个问题?有人帮忙吗

ios image-processing metal ciimage cikernel
2个回答
0
投票

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

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

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

linearSRGB
extendedLinearDisplayP3


0
投票

根据 Rupprechet 的说法,我找到了路。

        guard let filterOutput = filter.outputImage else { return nil }
        let context = CIContext(options:[.workingColorSpace: CGColorSpace(name: CGColorSpace.sRGB) as Any])
        guard let outputCGImage = context.createCGImage(filterOutput, from: filterOutput.extent) else { return nil }
© www.soinside.com 2019 - 2024. All rights reserved.