动态范围
人类视觉系统的一个重要观察结果是,相对于光的能量绝对数值,它对光的“模式”更为敏感。人眼并不是像光度计那样工作,它对光在空间、时间和光谱上的改变敏感。自然界的亮度范围(白色物体表面在光照下的测量值)大致位于
当人们观察显示器(照片或者书籍也是显示介质)时,怎样使得显示设备所展现出的实际场景给人的世界感受,与人直接观察相应实际场景的感受一致呢?CRT显示器作为最早的显示器类型,使用电子束激发屏幕内表面的荧光粉来显示图像。阴极射线管的输入电压和最终的亮度,并不是呈线性关系,而是呈指数关系。巧合的是,这种指数关系大致是人眼对亮度的感受的逆。假设CRT的输入是一系列等差数据,输入作用在阴极射线管的输入电压上,产生的亮度不是等差,被人眼观察后的感受又变为等差。
出于兼容的考虑,同时也为了提高传输图像的编码效率,即能够有更多地数据范围对应动态范围的暗部分,后来的其他类型显示器,都通过各自的方式保留了这一特性,这一特性被称为EOTF(电光转换函数,electrical optical transfer function)。在渲染过程中,计算位于线性空间中。线性空间中的加法操作,例如两束光照在白色朗伯体表面的同一位置,反射的颜色是两束光分别照在不同白色朗伯体的反射颜色之和,即
个人电脑显示器的标准转换函数是通过sRGB颜色空间来定义的,可以设置GPU在读取纹理和写入颜色缓存时自动进行相应转换。当然,也可以手工转换。常见的颜色表示是每个颜色通道若干bit(如8 bits),首先将其转换到[0.0, 1.0],经过转换函数之后,数值范围仍是[0.0, 1.0],转换函数如下:
上述公式可以近似为
sRGB颜色空间的gamma值为2.2,那么其他颜色空间的gamma值也是2.2吗?sRGB的gamma值为什么是2.2?这些问题的答案,和同时对比(simultaneous contrast)有关,先看下图。
两个小矩形的亮度,其实是一样的,但是在和围绕其的大矩形的对比之下,人眼感受到的亮度是不同的。如果大矩形是我们所处的环境,小矩形是我们看的图像,那么为了使两者的感受相同,就需要用不同的gamma值进行调整。gamma值的确定,就是对人眼所处环境亮度的一个假设。
- Gamma 2.2——明亮的环境,如光照明亮的办公室,头顶有灯,窗外是晴天。
- Gamma 2.35&2.4——和2.2相比偏暗的环境,如晚上在卧室看电视。
- Gamma 2.6——典型的如电影院。
HDR
在正常的观察条件下,人类视觉系统的动态范围可达100000:1,通过适应过程,可被感受到的动态范围会更大 。能够与人类视觉系统的感受能力相匹配的图像被称为是高动态范围(high dynamic range,HDR)。与之相对应的是标准动态范围(standard dynamic range,SDR),绝大部分的显示器都是SDR,它们使用sRGB颜色空间(电视机使用的是Rec. 709和Rec. 1886),最大亮度为
HDR的实现,需要数据和显示介质都满足HDR的要求。如果数据的动态范围偏窄,那不可避免的会丢失过亮或者过暗部分的细节。程序渲染产生满足HDR的数据自不必说,对真实场景获取HDR图像的方法之一,可以是拍摄多张动态范围偏窄但各自覆盖不同范围的图像,最终合成一张HDR图像。
对于HDR显示器,它们通常会使用Rec. 2020和Rec. 2100标准。Rec. 2020和sRGB相比色域更广,Rec. 2100则定义了两种非线性的EOTF:perceptual quantizer(PQ)和hybrid log-gamma(HLG)。HLG没有广泛应用于渲染场景,接下来讨论PQ,它的峰值亮度可以达到
从应用的角度看,有三条路径可以将图形转换到HDR显示器上,具体可用性依显示器和操作系统而定:
- HDR10——被广泛支持,颜色缓存为32位,R10G10B10A2,使用PQ非线性编码和Rec. 2020颜色空间。HDR10显示器的色调映射未标准化。HDR10+增加了动态元数据,可以每帧改变色调映射曲线。
- scRGB——只在Windows上被支持,通常使用sRGB的显像基色和最大亮度,但取值范围可以超过[0, 1]。颜色缓存使用R16G16B16,存储线性的RGB值。它可在驱动的帮助下,转换到HDR10的显示器。
- Dolby Vision——专利格式,使用自定义的每个通道12bit的颜色缓存,使用PQ非线性编码和Rec. 2020颜色空间,内置色调映射是标准化的。
当使用除scRGB之外的标准,应用需要将渲染空间的RGB值转换到Rec. 2020(3x3矩阵转换),并应用PQ OETF。
Tone Mapping
色调映射(tone mapping)或色调重建(tone reproduction)旨在将场景的辐亮度值转换为显示器的辐亮度值,在这一过程中,由于显示器的动态范围以及色域和实际相比,肯定要逊色很多,那么如何在给定显示器的参数和观察环境的前提下,使得人在看显示器时的感受,就如同在看实际场景一样,就是tone mapping要解决的问题。
正如之前所提到的,真实世界的动态范围(或者说人眼能感受到的动态范围)、相机能捕获的动态范围和显示器能展现的动态范围,三者差距明显。那么,该如何将上图的scene-referred的图像(来源可以是相机,也可以是程序渲染),转换为display-referred的图像呢?
方法一,通过缩放,直接将scene-referred的动态范围,映射到display-referred的动态范围。
这样得到的结果如下图所示,左侧为输入,右侧为输出。可以看到,输出给人的感受和输入的差异较为明显,整体偏暗,简单的缩放不能满足要求。输入图片的大部分像素的亮度都不是位于动态范围的两端,那么有没有可能充分利用显示器的动态范围来展现大部分输入的特征呢?
方法二,将display-referred的动态范围,线性映射到scene-referred的动态范围的一部分。
这样的映射关系,会导致输入动态范围的两端出现截断,即高于一定亮度变成白色,低于一定亮度变成黑色。
这样得到的结果如下图所示,左侧为输入,右侧为输出。可以看到,在输出的动态范围受限的前提下,这种方法保持了相对光强,但看上去对比度要变小。这是由于:
- Stevens Effect——随着亮度的降低,人眼感受到的对比度也会降低
- Hunt Effect——随着亮度的降低,人眼感受到的饱和度也会降低
- 显示光斑——屏幕漏光或者屏幕反光都会降低对比度
- Bartleson-Breneman Effect——随着周围环境亮度的降低,人眼感受到的对比度也会降低
在这种情况下,增大输出的对比度(方法三)就成为了自然的解决方法:
增大输出的对比度就带来了一个问题,明暗细节丢失的很厉害,如下图,左侧为方法二的输出,右侧为方法三的输出:
那么,如何在增大对比度的前提下,尽量保持明暗细节?将两端直接截断的折线改为S型曲线:
最后的结果相对令人满意,这就是tone mapping的大致过程,左侧为输入,右侧为输出(S型曲线实际也是胶片的tone mapping曲线,光化学胶片乳胶的属性是柯达和其他公司研究人员仔细调整过的):
“曝光”在摄影中指控制传感器(或胶片)接受到的光的量,在渲染中则可以表示施加在scene-referred图像上的一个线性缩放操作。tone mapping与曝光结合紧密,一般会预设scene-referred图像被正确地曝光过。对scene-referred图像先缩放(曝光),再tone mapping的过程是global tone mapping,在这个过程中每个像素都被相同地处理。与之相对的,local tone mapping则是考虑每个像素周围的像素和其他因素,对每个像素施加独立地操作。
色调重建变换通常表示为一维曲线,将scene-referred输入变换为display-referred输出。曲线可以独立应用于RGB值,也可以应用在亮度上。当曲线应用于RGB时,因为输出在[0, 1]范围内,所以输出值在display-referred的色域内,当曲线应用于亮度时就不一定了。对RGB进行非线性的变换会导致饱和度、色相和亮度的偏移。亮度的偏移是期望中的。为了抵消Stevens Effect而增强对比度的操作,会导致饱和度也被增强,从而抵消Hunt Effect。色相的偏移则是不需要的,通常需要在tone mapping之和进行额外的RGB调整。
常用的计算曝光值的技术依赖分析scene-referred的亮度值,通常使用上一帧的数据。早期实现中使用对数平均后的场景亮度,通过一系列降采样的后处理pass,最后得到单一数值。少数特别亮的像素对这种方法影响较大,使用亮度值的直方图,选择中位数,可以改善问题。上述技术的问题是驱动曝光的不应该是像素亮度,而应该是光源。用光源来决定曝光可行,因为大体上曝光就是为了抵抗光照。
参考资料
- Real-Time Rendering 4th Edition chapter 5&8
- Fundamentals of Computer Graphics 4th Edition chapter 20&21
- gamma settings
- HDRI
- HDR Display Support in Infamous Second Son and Infamous First Light (Part 2)
- Cinematic Color: From Your Monitor to the Big Screen
- From Scene to Screen," SIGGRAPH Color Enhancement and Rendering inFilm and Game Production course