【问题标题】:Custom Metal CIKernel return fixed color produces different color自定义 Metal CIKernel 返回固定颜色产生不同的颜色
【发布时间】:2021-09-02 18:37:41
【问题描述】:

我有一个 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轴是结果)

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

【问题讨论】:

    标签: ios image-processing metal ciimage cikernel


    【解决方案1】:

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

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

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

    【讨论】:

    • 我应该在哪里指定这个色彩空间? CISampler ?
    • 我正在开发一个色调曲线功能,我发现曲线映射的最终颜色与Photoshop的结果不同,我认为我的曲线是正确的,我想弄清楚是什么不同,发现了这个.例如,我的曲线从 100 变为 16,所以内核采样中的某些颜色可能是 100,然后应该输出 16,对吗?但是最终的颜色是64,整个图像的颜色不是我想要的。
    • 如何渲染 CIImage?几乎所有 CIContext 的渲染 API 都有一个 colorSpace 参数。尝试在那里传递一个线性色彩空间。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 2018-02-14
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多