【问题标题】:How to correctly handle HDR10 in custom Metal Core Image Kernel?如何在自定义 Metal Core Image Kernel 中正确处理 HDR10?
【发布时间】:2021-06-28 21:45:55
【问题描述】:

我有一个自定义 Metal Core Image 内核(使用 CIImageProcessorKernel 编写),我正在尝试使其与 HDR 视频(HDR10 PQ 开始)正常工作。

我了解对于 HDR 视频,进入着色器的 rgb 值可能低于 0.0 或高于 1.0。但是,我不明白视频中的 10 位整数值(即 0-1023)是如何映射到浮点数的。

浮点的最小值和最大值是多少? IE。 1023(纯白色)像素在着色器中的浮点数会是什么。

在 WWDC20 session 10009, 11:32 使用 AVFoundation 编辑和播放 HDR 视频,有一个 Core Image Metal 内核的示例,它不支持 HDR,因此无法工作。它通过从 1.0 中减去它们来反转输入的值,当 1.0 不是最大可能值时,这显然会崩溃。这应该如何实现以支持 HDR?

extern “C” float4 ColorInverter(coreimage::sample_t s, coreimage::destination dest) {  
    return float4(1.0 - s.r, 1.0 - s.g, 1.0 - s.b, 1.0);
}

【问题讨论】:

    标签: ios video-processing metal core-image hdr


    【解决方案1】:

    在您的内核中,颜色通常被标准化为[0.0 ... 1.0]基于底层颜色空间。因此,即使值存储在纹理中的 10 位 inters 中,您的着色器也会将它们作为标准化浮点数获取。

    我强调了上面的颜色空间,因为它在将颜色从源转换为那些标准化值时使用。当您使用默认的 sRGB 颜色空间时,来自 HDR 源的广色域不适合 sRGB [0.0 ... 1.0] 光谱。这就是为什么您可能会在内核中获得超出该范围的值。这在大多数情况下实际上很有用,因为大多数为 sRGB 设计的过滤器操作在那时仍然有效。然而,上面的颜色反转示例不是。

    据我所知,这里有两个选择:

    您可以将您正在使用的CIContextworkingColorSpace 更改为输入的HDR 色彩空间:

    let ciContext = CIContext(options: [.workingColorSpace: CGColorSpace(name: CGColorSpace.itur_2020)!])
    

    那么在你的内核中所有颜色值都应该被限制为[0.0 ... 1.0],其中0.0是最暗的HDR颜色值,1.0是最亮的。然后,您可以使用1.0 - x 安全地执行反转。但是,请记住,其他一些过滤器将不会产生正确的结果,因为它们假定输入是(线性)sRGB——Core Image 的默认值。

    第二个选项是您将输入转换(“颜色匹配”)到正确的颜色空间之前将其传递到您的内核并再次返回到工作空间之前返回:

    let colorSpace = CGColorSpace(name: CGColorSpace.itur_2020)!
    let colorMatchedInput = inputImage.matchedFromWorkingSpace(to: colorSpace)
    let kernelOutput = myKernel.apply(..., [colorMatchedInput, ...])
    return kernelOutput.matchedToWorkingSpace(from: colorSpace)
    

    【讨论】:

    • 我知道这将是其中之一,在我了解了它的工作原理之后,我很难理解它是如何令人困惑的,而你的回答让我明白了这一点位置。谢谢!
    • @Frank 你知道除了 CALayer(AVCaptureVideoPreviewLayer 或 AVSampleBufferDisplaylayer)以外的任何方式来显示 HDR 内容吗? MTKView 无法显示所有的 HDR 颜色。
    • MTKView绝对可以显示HDR内容。您需要将colorPixelFormat 设置为.bgr10_xr_srgb 并确保使用广色域色彩空间进行渲染。
    • 这个线程是关于什么的 - developer.apple.com/forums/thread/649789
    • 当我设置 .bgr10_xr_srgb colorPixelformat 时出现空白屏幕,是否对显示 hdr 示例缓冲区的示例代码有任何引用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多