Apple EDR + Metal

Andy Guo原创
  • Color
  • 三十分钟系列
  • Color
  • Color Science
  • 色彩空间
  • 色彩科学
  • ACES
  • EDR
  • Apple
  • Metal
大约 11 分钟

Apple EDR + Metal

最近被M1 Max 的新款MacBook Pro 搞得心里痒痒的,看到家里那台MBP(2012年中款),开始越来越慢,新系统也不能安装了(停留在10.15 了),就很想买一台……无奈,真的很贵!

众多更新特性中,最让大家觉得好评的就是那块mini-LED 的屏幕了!(不是刘海,是屏幕本身!)

HDR 了,又没有完全HDR

现在大多数的显示设备能力都是超过标准SDR( >100nit) 的,但是又没有完全达到HDR(≥1000nit)。对于多出来的这部分显示能力如何去使用,通常就有两种策略:

  • 直接映射

    0 = 显示器的“最暗”;1 = 显示器的“最亮

  • 尽可能的“准确”(假设显示器的设置是BT 1886)

    0 = 显示器能够显示出来并且最接近BT 1886 的亮度; 1 = 100nit

我们假设显示设备的能力是400 nit,那么这两种策略可以用下面的图示进行说明。

直接映射

尽可能准确

对于专业的内容创作者,肯定是希望尽可能的减少不确定性,那么如果想要准确还原SDR 的色彩,使用“尽可能准确” 这个策略。这样做的好处是,即使更换了其他显示设备,只要经过校准后,理论上可以看到“一致的颜色”。

不过这样,对于观众会有一些问题:

  • 我的显示设备其实已经超过了100nit,经过这样的校准之后,相当于 >100 nit 的部分就浪费了?

    (那我为什么要为这额外的能力花钱?)

  • 前面说过可以看到“一致的颜色”,只能在固定的监看条件下。而实际用户在观看的时候,环境还是比较恶劣的……

    (太阳下面看不清;晚上又会太刺眼;环境灯光色温偏差很大……)

动态的调整?

那有没有一种方法,可以尽可能用上超出SDR 的部分,同时还让SDR(0~100nit)中间的色彩保持“看起来一致”?很明显,这就需要使用到动态的调整方法。

一说到 Apple 的动态调整,估计第一个就会让人想起那个又爱又恨的 True Tone 技术。

这个技术就是利用感应环境,动态的调整显示的色彩。希望用户可以在不同条件下得到“相似的观感”。

让我们想象晚上关灯看手机的场景,可能屏幕0~50 nit 的范围就可以满足SDR 的“观感”,那么超出50 nit 的部分,我们是不是可以当作超过SDR 的部分使用?那么对应的code value 是不是可以 > 1.0 了?

Apple EDR

在消费领域,Apple 可是很会的。所以,他们推出了Apple EDR 这项技术。

刚看到这个技术的时候,我认为这也是某种将SDR 变成 HDR 的算法。通常这种算法都会(效果不太好):

  • 反差变大一些
  • 色彩饱和一些
  • 特定区域变得更亮一些、颜色变得更“讨喜”一些

来源:https://ai.baidu.com/forum/topic/show/990953

通常这些“增强”算法,往往都会让颜色发生比较大的变化,而不能忠实还原创作者的意图。

好在我冷静下来,看了WWDC 2021 对于Apple EDR 的介绍open in new window

定义

Apple EDR 是高动态范围的一种数值表现方式,也是一套色彩渲染管线

嗯,听起来是不是有点不知所云?嗯,我第一次看的时候也是这样,所以非常推荐好好看看 WWDC 的视频。

总之,Apple EDR 不是想象中那种“色彩增强动态范围” 的算法。

数值表现方法(code value)

实在懒得看也没有关系,其实主要的思路,在前面已经说出来啦。Apple EDR 作为数值表现最核心的几点:

  • 使用float,本质是linear intensity
  • 覆盖了人眼可见的所有的色彩范围
  • black = 0.0, reference_white = 1.0
  • [0, 1] 范围内,对应的是SDR 的亮度范围
  • > 1.0 的数值,对应的是HDR 的亮度范围

这里举个官方的例子A。

如果有一台Pro Display XR 的显示器,然后将reference white 设定在500 nit,由于Pro Display XR 的显示器的峰值亮度是1600nit,因此EDR

code value = 1600 / 500 = 3.2

再举一个例子B。

如果你的显示器极限亮度 600nit,你把reference white 设定为100 nit,那么EDR

code value = 600 / 100 = 6.0

由于 > 1.0 的部分是headroom(超过SDR 的亮度范围)。因此例子B中 EDR 范围是 0~6.0 的显示设备,理论可以显示的动态范围甚至会超过例子A 中的Pro Display XR

这种动态EDR code value 的方式,个人觉得很棒!充分利用了显示设备的能力,也照顾到了环境监看的变化!

渲染管线

光有数值是没用的,还需要好的渲染管线进行支撑。这就好比 ACES 的图像也是float,但是使用不同的DRT 最终会得到不同的观感。此时,可以认为EDR 就是一种色彩渲染管线,将EDR 的数值计算得到最终应该显示的亮度值。

个人感觉使用公式说明,更加准确有效!

  • x 表示PQcode value
  • R 表示的监看环境
  • D 表示显示器的极限能力
  • e 表示得到的EDR code value
  • y 表示最终的亮度

第一步,通过函数f,将PQ 的码值转换到EDR code value

第二步,函数g 完成e 到最终显示亮度的转换。这个时候,我们可以认为函数g 就是某种tone-mapping 算法。

有趣的是,Apple 对于影视行业常用的色彩空间,提供了默认的函数g。同时,也留下了很多自由给开发人员,你可以自定义tone mapping 函数g,来实现自己的DRT

【要不要开坑,写一个自己的DRT?】

继续深入!Metal!

既然Apple EDR 看起来不错,那么如何才能使用上呢?为了加大难度,这里选择Metal

Apple 因为不能使用N卡,所以就和CUDA 无缘了…… 加上Apple 对于OpenGL也是不怎么上心维护,所以要想发挥M1 Max 的GPU 实力,可能需要去研究一下Metal

https://developer.apple.com/documentation/metal/open in new window

Metal 作为一个现代GPU 框架,可以非常高效的完成渲染、计算、并行化等处理工作。我们认为图像其实就是2D Texture,那么通过编写各种Shader,就可以实现各种有趣的事情:

  • 图像处理
  • LUT 计算
  • 视频编解码

前段时间,Davinci Resolve 17.4 适配 M1 之后,提升4x 性能,好像就是利用Metal 重写了引擎。

Metal 有点难,需要的技能树还是有点多的……所以我也没有太搞清楚,只能稍微搞一搞,写一个用于验证Apple EDR 的demo 程序。希望自己以后可以学明白,把以前很多CPU 上需要跑很久的算法通过GPU 稍微加速一下。

使用2018年的 Macbook Pro,就能够在屏幕上看到 2.0 的数值和 1.0 是有区别的。但是系统的取色却没有区别……如果同时再调整 Mac 的屏幕亮度,会发现 2.0 和1.0 之间的区别还会变化……

总之,挺神奇的。

最后

  • 曾经在手机上复制,不能在电脑上粘贴,现在变成了现实
  • 曾经在不能在图片中复制文字,现在也变成了现实
  • ……

曾经都认为不可能在显示器上看到“比白更白”,随着科技的变化,这变成了现实。

这个能力我们可以辩证的来看。对于内容创作,还是应该在标准可控的环境中进行。但是对于观看来说,如果不管什么环境下,你都能够体验到和内容创作者接近的色彩,那么这就是一项好的技术!

二者并不矛盾。

凑足26999 赞,我就去买一台M1 Max 的 Macbook Pro

温馨提示

现在有 Andy 十分钟色彩科学合集售卖open in new window

十分钟色彩科学面包多二维码

购买后加微信muyanru345,拉入Andy 铁粉儿群,可在群里对学习工作中的色彩疑问进行讨论。

上次编辑于:
贡献者: muyanru