我希望使用
CAMetalLayer
/MTKView
在 iOS 上显示 HDR 图像。我看到 AVCaptureVideoPreviewLayer
或 AVPlayerLayer
等 CALayers 具有显示 HDR 内容的能力。然而,看起来这些层可能正在使用 EDR API 来实现这一点。然而 this Apple 工程师的回答表明不可能在 MTKView
. 中完全显示它
我想 iPhone 显示屏可能无法完全显示 HDR 图像,并且可能正在做某种从 HDR 到 EDR 的色调映射(据说这是苹果自己的 HDR 表示)。
我需要了解,就显示 HDR 内容而言,与内置的
MTKView
子类(例如 CALayer
或 AVCaptureVideoPreviewLayer
相比)的功能是否有限? ThisWWDC 视频表明 HDR 内容可以正确显示(或任何
AVPlayerLayer
可以显示的最佳效果)。CALayer
显示 EDR(或 HDR,见下文)内容。该设置显示在 9:18 的
您链接的视频中。
MTKView
请注意,您负责将内容渲染到与设置的颜色空间相匹配的视图的可绘制对象中。您还可以根据要显示的内容调整色彩空间,例如,如果您的 HDR 图像在该色彩空间中,则将其设置为
// Opt into using EDR
let layer = self.layer as? CAMetalLayer
layer?.wantsExtendedDynamicRangeContent = true
// Use half-float pixel format
layer?.pixelFormat = .rgba16Float
// Use extended linear display P3 color space
layer?.colorspace = CGColorSpace(name: CGColorSpace.extendedLinearDisplayP3)
。或者你可以使用像 Core Image 这样的框架来帮助你在不同的颜色空间和格式之间进行颜色匹配。
我还建议您查看有关此主题的其他 WWDC 视频:
Apple 所说的
Extended Dynamic Range (EDR) 不仅仅是 Apple 对 HDR 的表示。这是超出标准范围(由 sRGB 定义)的颜色值的总称。这包括宽色域色彩空间(如 Display P3 或 BT-2020),以及扩展的 brightness 值(例如,当标准白色值 .itur_2020
将以 500 尼特亮度显示时,明亮的扩展白色
[1.0, 1.0, 1.0]
将显示为 1000 尼特)。他们选择了 EDR 这个术语,因为 HDR 可以表示很多不同的东西,这取决于上下文(扩展亮度、曝光融合、色彩空间等)。
Explore HDR rendering with EDR对此给出了很好的解释。我还建议您查看支持 Apple Pro Display XDR 技术讲座,以了解有关 EDR 格式、色彩空间和动态余量的更多信息。