自定义 Metal CIFilter 中 RGB 通道的值范围是多少?

Posted

技术标签:

【中文标题】自定义 Metal CIFilter 中 RGB 通道的值范围是多少?【英文标题】:What is value range of RGB channels in custom Metal CIFilter? 【发布时间】:2021-11-23 17:48:05 【问题描述】:

如果在 Metal 中有以下 CIKernel 过滤器:

namespace coreimage

    float4 FilterA(sampler src, float exponent, float intensity)
    
        float4 srcSample = src.sample(src.coord());

        float r = min(srcSample.r, 2.0) / 2.0;
        srcSample.r = 2.0 * (pow(r, exponent) * intensity);
        srcSample.g = 0.0;
        srcSample.b = 0.0;

        return srcSample;
    

我在某处读到 RGB 通道的值范围是 0.0 ... 2.0。然而,Simon J Gladman 的“Core Image for Swift”一书似乎建议最大值为 1.0。

当我假设最大值为 1.0 并将上面的一行更改为 float r = min(srcSample.r, 1.0) 时,我得到不同的输出。

如果范围确实是 0.0 ... 2.0,这是否适用于传递到 CIKernelCIColorKernelCIWarpKernel 的所有图像?

那么,阅读this,色彩空间对RGB值范围有影响吗?

如果返回超出范围的 RGB 值会怎样?它们是被剪裁到范围内还是原封不动地传递给行中的下一个过滤器?

【问题讨论】:

【参考方案1】:

这取决于很多因素:

    图像处理技术(SDRHDR & apple EDR)。 显示器的特性(nits,...)。 图像色彩空间(kCGColorSpaceITUR_2020_PQ_EOTFDisplay P3sRGB扩展的 sRGB)。 ...

对于 SDR 技术,颜色浮点范围为 0.0 - 1.0

0.0代表黑色 1.0代表白色

对于 HDR 和 EDR 技术,颜色浮动点范围为 0.0 - (v > 1)

v = 最高 3.2(1600 尼特显示)

我强烈推荐观看此视频Explore HDR rendering with EDR。

【讨论】:

以上是关于自定义 Metal CIFilter 中 RGB 通道的值范围是多少?的主要内容,如果未能解决你的问题,请参考以下文章

通过自定义 CIFilter 运行图像时 CIImage 属性丢失

CIFilter 不回答自定义过滤器的 kCIAttributeDescription

金属版 CIFilter 是不是可用于 A7 处理器

如何将 Vignette CIFilter 应用于 iOS 中的实时摄像机源?

用于 OS X 应用程序的带有屏蔽 CIFilter 的 NSView

看到一些默认 CIFilter 的实现了吗?