Realtime Rendering 4th notes - chapter8

(转载请注明出处,谢谢咯)

"Unweave a rainbow, as it erewhile made
The tender-person’d Lamia melt into a shade. " — John Keats

前面章节中讨论的许多RGB颜色值表示光的强度和阴影。 在本章中,我们将了解由这些值测量的各种物理光量,为后续章节奠定基础,从更基于物理的角度讨论渲染。我们还将了解更多关于渲染过程经常被忽略的“后半部分”:将场景线性光量表示为最终显示颜色的转换。

8.1 Light Quantities(光量)

任何基于物理渲染方法的第一步是以精确的方式将光量化。 首先提出的是辐射度学,因为这是与光的物理传输有关的核心领域。我们接下来讨论光度测量,光度测量处理由人眼的灵敏度加权(衡量过)的光值。我们对颜色的感知是一种心理物理(psychophysical)现象:物理刺激的心理感知。颜色感知在比色法一节中讨论。最后,我们讨论了使用RGB颜色值进行渲染的有效性。

8.1.1 Radiometry (辐射度学)

辐射度学处理电磁辐射的测量。 将会在章节9.1中进行详细的讨论,这种辐射以波的形式传播。 不同波长(wavelengths)的电磁波——具有相同相位的两个相邻点之间的距离,例如,两个相邻峰值倾向于具有不同的特性。 在自然界中,电磁波存在于大范围的波长范围内,从长度小于百分之一纳米的伽马波到数万千米长的极低频(extreme low frequency,ELF)无线电波。 人类可以看到的波包含该范围的一小部分,从紫外光的约400纳米延伸到红光的700纳米多一点。见图8.1。

图8.1。可见光的波长范围,于完整电磁频谱内的位置。

辐射量的存在是为了电磁辐射的各个方面,包括:总能量、功率(随时间变化的能量)以及相对于面积、方向或两者兼有的功率密度。这些量汇总在表8.1中。

名称 符号 单位
辐射通量(radiant flux) $\Phi$ $watt(W)$
辐射照度(irradiance) $E$ $W/m^2$
辐射强度(radiant intensity) $I$ $W/sr$
辐射率(radiance) $L$ $W/(m^2sr)$
表格8.1. 辐射度量学中的量和单位。

在辐射度量学中,最基本的单位是辐射通量$\Phi$。辐射通量是辐射能量随时间的流动——功率,以瓦特(watt,W)为单位。

辐射照度(Irradiance)是单位面积的辐射通量,即$d\Phi/dA$。辐射照度的定义是关于一个区域的,这个区域可能是空间中的一个假想区域,但通常是一个物体的表面。它的单位是瓦特每平方米$(W/m^2)$。

在我们进入下一个量之前,我们需要首先介绍立体角(solid angle)的概念,它是角度概念的三维扩展。 角度可以被认为是平面中连续方向组的大小的度量,弧度值相当于该组方向在半径为1的封闭圆上组成的弧度的长。同样,一个立体角测量的是三维空间中连续方向集的大小,以立体空间(steradians,缩写为“$sr$”)表示,它们由半径为1的封闭球体上的交集区域定义。立体角度用符号$\omega$表示。

图8.2 圆锥从球体的剖面图上取下的一个球面度(steradian)为1的圆锥。形状本身与测量没什么关系,而球体表面覆盖的面积才是关键。

在二维中,一个$2\pi$弧度的角覆盖了整个单位圆。将其扩展到三维空间,一个$4\pi$个立体角的立体角度将覆盖整个单位球面。一个立体角的大小如图8.2所示。

现在我们可以引入辐射强度(radiant intensity),$I$,它是相对于方向的通量密度,更精确地说,对于立体角$(d\Phi/d\omega)$。单位是$w/sr$。

最后,辐射率,L,是一种测量单射线电磁辐射的方法。更精确地说,它是与面积和立体角度都相关的辐射通量密度$(d^2\omega/dAd\omega)$。这个面积是在垂直于光线的平面上测量的。如果在某一方向上的某一表面应用了辐射率,那么就必须使用余弦校正系数。你可能会遇见使用“投影区域”这个词,并参考校正因子来定义辐射率。

辐射率是传感器(如眼睛或相机)测量的东西(详见9.2节),因此它对于渲染是至关重要的。计算着色方程的目的是计算一个沿着给定光线的辐射率,从着色表面的点到相机。沿着这条射线的L的值是以物理为基础的第5章中量$C_{shaded}$的等价物。辐射量的标准单位是瓦特/平方米/球面度(w/㎡/球度面)。

环境中的辐射可以被认为是五个变量(或包括波长在内的六个变量)的函数,称为辐射分布(radiance distribution)。其中三个变量指定位置,另外两个指定方向。这个函数描述了在空间中任何地方的所有光。一种考虑渲染过程的方法是,眼睛和屏幕定义一个点和一组方向(例如,穿过每个像素的光线),这个函数在眼睛处对每个方向求值。基于图像的呈现,在第13.4节中讨论,使用了一个相关的概念,称为光场(light field)。

在着色方程中,辐射度通常以$L_o(\boldsymbol{x},\boldsymbol{d})$或$L_i(\boldsymbol{x},\boldsymbol{d})$的形式出现,这意味着辐射度分别从x点出去或进入x点。方向向量d表示光线的方向,按照惯例,它总是指向远离x的方向。虽然在$L_i$的情况下,这个规定可能会有些混乱,因为d点与光的传播方向相反,但是它便于计算,比如点积。

图8.3 SPDs(功率谱)是三种不同光波的光谱功率分布。最上面的功率谱来自一个绿色的激光器,它的光谱分布非常狭窄。中间的SPD是由相同的绿色激光和两个额外的激光(红色和蓝色)组成的光。这些激光的波长和相关强度相当于RGB激光投影机投出的自然白色光。底部的SPD是标准的**D65**光源,这是一个典型自然白色,可用于表示室外照明做参考。这种SPDs的能量在可见光谱中不断扩散,是自然采光的典型代表。

辐射的一个重要特性是它不受距离的影响,忽略了诸如雾这样的大气效应。换句话说,一个表面无论与观察者的距离有多远,都会有同样的亮度。当距离较远时,表面覆盖的像素较少,但每个像素的表面辐射是恒定的。

大多数光波包含了许多不同光波的混合。这是一个典型的可视化光谱功率分布(spectral power distribution,SPD),其中显示了光的能量是如何分布在不同波长的。正如图8.3所示的三个示例。值得注意的是,尽管在图8.3的中间和底部的SPD图像之间存在显著差异,但它们被认为是相同的颜色。很明显,人眼是较差的光谱仪。我们将在8.1.3节详细讨论色觉。

所有辐射量都有光谱分布。由于这些分布是波长上的密度,它们的单位是原始数量除以纳米。例如,辐照度的光谱分布单位是每平方米每瓦特每纳米。

由于完整的spd对于渲染来说是笨拙的,特别是在交互速率下,在实践中辐射量被表示为RGB三元组。在8.1.3节中,我们将解释这些三元组与光谱分布的关系。

8.1.2 (photometric)光度学

图8.4 光度曲线 (纵坐标:光视效率;横坐标:纳米波长)

辐射度量学只涉及物理量,而不考虑人类的知觉。一个相关的领域,光度学,像放射学一样,只是它用人眼的灵敏度来衡量一切。辐射计算的结果通过乘以CIE光度曲线(CIE photometric curve)转换为光度单位,CIE光度曲线是一条钟形曲线,以555nm为中心的,代表眼睛对各种波长的光的响应。参见图8.4。

换算曲线和测量单位是光度学理论和放射学理论的唯一区别。每个辐射量都有一个等效的光量。表8.2显示了每个的名称和单位。这些单位都具有预期的关系(例如,勒克斯lux是每平方米流明)。虽然从逻辑上讲,流明是基本单位,但是从历史角度上讲,烛光被定义为基本单位,并且其他单位都是由他派生出来的。在北美,照明设计师用被废弃的“英尺蜡烛”(foot-candle,fc)来测量照度,而不是勒克斯(lux)。在这两种情况下,光照度是大多数照度计测量的指标,在照明工程中具有重要意义。

亮度通常用来描述表面的明亮度。例如,高动态范围(HDR)电视屏幕的峰值亮度通常在500到1000尼特(nits)之间。相比之下,“晴空”的亮度约为8000尼特(nits),一个60瓦的灯泡约为12万个尼特(nits),地平线上的太阳约为60万个尼特(nits)。

1更准确的全称是“CIE光谱发光特性曲线”。 “明视的”指的是每平方公尺比3.4个大烛台更亮的照明条件。在这些条件下,眼睛的锥体细胞是活跃的。有一个相应的“暗视的”CIE曲线,中心在507纳米左右,这是指眼睛已经适应于每平方公尺低于0.034支烛台的暗状态——一个没有月光的夜晚或更暗的夜晚。在这些条件下,杆状细胞是活跃的。

放射量(Radiometric Quantity):单位 光照度(Photometric Quantity):单位
辐射通量:瓦特, $watt(W)$ 光通量:流明(lumen,lm)
辐射度:$W/m^2$ 照明度:勒克斯(lux,lx)
辐射亮度:$W/sr$ 发光强度:坎德拉(candela,cd)
辐射率:$W/(m^2sr)$ 亮度:$cd/M^2=nit$

表8.2:辐射测量和光度测量的数量和单位。

8.1.3 色度学

在8.1.1节中,我们已经看到我们对光的颜色的感知与光的SPD(光谱功率分布)密切相关。我们还看到这不是简单的一对一对应关系。图8.3中底部和中间的spd完全不同,但是被认为是完全相同的颜色。色度学研究的就是光谱功率分布与颜色感知的关系。

人类能分辨大约1000万种不同的颜色。对于颜色感知,眼睛在视网膜上有三种不同类型的锥体受体,每种受体对不同波长的光线有不同的反应。其他动物有不同数量的颜色受体,有时多达15个。因此,对于一个特定的SPD,我们的大脑只接收到来自这些受体的三种不同的信号。这就是为什么只有三个数字可以精确地表示任何颜色刺激。

但是哪三个数字呢? 国际色标委员会(CIE)提出了一套测量颜色的条件标准,并利用它们进行了配色实验。在颜色匹配中,三种颜色的灯投射在白色屏幕上,使它们的颜色叠加在一起形成一个色块。匹配的测试颜色投影在这个色块的旁边。测试色块的波长为单一波长。然后观察者可以使用校准到一个加权范围[-1, 1]的旋钮来改变三种颜色的光,直到测试颜色匹配为止。匹配一些测试颜色需要加负权重,这样的权重意味着相应的光被添加到波长的测试颜色斑块中。图8.5显示了三种灯光的一组测试结果,分别为r、g和b。这些光几乎是单色的,每一种光的能量分布都集中在以下波长中的一种。r: 645 nm, g: 526 nm, b: 444 nm。将每组匹配权重与测试波长相关联的函数称为颜色匹配函数(color-matching functions)。

这些函数给出了一种将光谱功率分布转换为三个值的方法。给定单一波长的光,三种不同颜色的光的设置可以从图形、旋钮设置和创建的照明条件中读取,这些条件将让屏幕上的两个色块提供相同的感觉。对于任意的光谱分布,颜色匹配函数可以乘以极值,并且每个结果曲线下的面积(例如:积分)给出相对数量来设置彩色光以匹配光谱产生的感知颜色。明显不同的光谱分布可以分解为相同的三个分量,也就是说在观察者看来它们看起来是一样的。给出匹配权重值的光谱分布称为同色异谱色(metamers)。

图8.5。来自Stiles和Burch的r,g和b, 2度颜色匹配曲线。 这些颜色匹配曲线不应与颜色匹配实验中使用的光源的光谱分布混淆,后者是纯波长。

三个加权的r,g和b光不能直接表示所有可见颜色,因为它们的颜色匹配函数对于各种波长具有负权重。 CIE提出了三种不同的假设光源,其具有对所有可见波长都是正的颜色匹配函数。这些曲线是原始r,g和b颜色匹配函数的线性组合。这要求光源的光谱功率分布在某些波长处为负,因此这些光是不可实现的数学抽象。它们的颜色匹配函数表示为$x(λ)$,$y(λ)$和$z(λ)$,如图8.6所示。 颜色匹配函数$y(\lambda)$与光度曲线相同(图8.4),因为该曲线将辐射亮度转换为亮度。

图8.6。 Judd-Vos修改的CIE(1978)2度颜色匹配函数。 请注意,两个x是同一曲线的一部分。

与前一组颜色匹配函数一样,$x(λ)$,$y(λ)$和$z(λ)$用于通过乘法和积分将任何$SPD s(λ)$减少为三个数:

$$
X=\int^{780}_{380}s(\lambda)\overline{x}d\lambda,
;
Y=\int^{780}_{380}s(\lambda)\overline{y}(\lambda)d\lambda,
;
Z=\int^{780}_{380}s(\lambda)\overline{z}(\lambda)d\lambda.\tag{8.1}
$$

这些X,Y和Z三色值是在CIE XYZ空间中定义的颜色的权重。将颜色分成亮度和色度通常是方便的。色度是与其亮度无关的颜色特征。例如,尽管亮度不同,但两种蓝色,一种暗色和一种亮色可以具有相同的色相(chromaticity,色度)。

图8.7。 CIE RGB原色的RGB颜色立方体在XYZ空间中显示,其投影(紫色)显示在X + Y + Z = 1平面上。蓝色轮廓包围可能的色度值的空间。从原点辐射的每条线具有恒定的色度值,仅在亮度上变化。

为此,CIE通过将颜色投影到$X+Y+Z=1$平面上来定义二维色度空间。见图8.7。此空间中的坐标称为x和y,计算方式如下:

$$
x=\frac{X}{X+Y+Z},\\
y=\frac{Y}{X+Y+Z},\\
z=\frac{Z}{X+Y+Z}=1-x-y.\tag{8.2}
$$

z值不提供其他信息,因此通常省略。色度坐标x和y值的图表称为CIE 1931色度图。见图8.8。图中的曲线轮廓显示可见光谱的颜色所在的位置,连接光谱末端的直线称为紫色线(the purple line)。黑点表示光源D65的色度,这是一种常用的白点——用于定义白色或无色(achromatic)的色度。

图8.8。CIE 1931色度图。 曲线用相应纯色的波长标记。 白色三角形和黑点分别显示用于sRGB和Rec的色域和白点。709色空间。

总而言之,我们从一个实验开始,该实验使用了三个单波长光,并测量了需要多少光以匹配其他波长的光的外观。 有时这些纯的光必须添加到正在查看的样品中才能匹配。这给出了一组颜色匹配函数,它们被组合起来创建一个没有负值的新集合。有了这个非负的颜色匹配函数集,我们可以将任何光谱分布转换为定义颜色的色度和亮度的XYZ坐标,可以将其简化为xy以仅描述色度,保持亮度恒定。

给定一个色点(x, y),从白点穿过该点到边界(光谱或紫色线)绘制一条线。距离色点与距离区域边缘的比值是颜色的激发纯度(excitation purity)。区域边缘上的点定义了主波长(dominant wavelength)。图形学中很少遇到这些色度学上的术语。相反,我们使用饱和度(saturation)和色相(hue),它们分别与激发纯度和主波长松散地相关。在Stone和其他人的书中可以找到更精确的饱和度和色相定义。

色度图描述了一个平面。完全描述颜色需要第三个维度,Y值,也就是亮度。然后定义所谓的xyY坐标系。 色度图对于理解渲染中如何使用颜色以及渲染系统的限制非常重要。电视或计算机监视器通过使用R,G和B颜色值的一些设置来呈现颜色。每个颜色通道控制一个显示基色(display primary)发射具有特定光谱功率分布的光。三个原色中的每一个通过其相应的颜色值进行缩放,并且将它们相加在一起以产生观察者所感知的单个光谱功率分布。

色度图中的三角形表示典型电视或计算机监视器的色域(gamut)。三角形的三个角是原色,它是屏幕可以显示的最饱和的红色,绿色和蓝色。色度图的一个重要特性是这些限制颜色可以通过直线连接,以显示整个显示系统的极限。直线表示通过混合这三种原色可以显示的颜色限制。 白点表示当R,G和B颜色值彼此相等时由显示系统产生的色度。值得注意的是,显示系统的全部色域是三维体积。色度图仅显示该体积在二维平面上的投影。有关更多信息,请参阅Stone的书。

渲染中有几个值得注意的RGB空间,每个空间由R,G和B原色和白点定义。为了比较它们,我们将使用不同类型的色度图,称为CIE 1976 UCS(uniform chromaticity scale)图。该图是CIELUV颜色空间的一部分,CIEUV颜色空间由CIE(以及另一个颜色空间CIELAB)采用,旨在为XYZ空间提供更多感知统一的替代方案。在CIE XYZ空间中,两个一样的颜色对可以在距离上有最多不同20倍。CIELUV对此进行了改进,使比率降至最多四倍。为了比较RGB空间的色域,这种增加的感知均匀性使得1976年的图表比1931年更好。最近,对感知统一色彩空间的持续研究产生了ICTCP和Jzazbz空间。这些色彩空间在感知上比CIELUV更均匀,特别是对于现代显示器典型的高亮度和饱和色彩。然而,基于这些色彩空间的色度图尚未被广泛采用,因此我们在本章中使用CIE 1976 UCS图,例如图8.9的情况。

图8.9。CIE 1976 UCS图显示了三个RGB颜色空间的原色和白点:sRGB,DCI-P3和ACEScg。sRGB图可用于Rec.709也是如此,因为两个颜色空间具有相同的原色和白点。

在图8.9所示的三个RGB空间中,sRGB是迄今为止在实时渲染中最常用的。值得注意的是,在本节中,我们使用 "sRGB颜色空间"来指代具有sRGB原色和白点的线性颜色空间,而不是第5.6节中讨论的非线性sRGB颜色编码。大多数计算机监视器专为sRGB色彩空间设计,同样的原色和白点适用于Rec.709色彩空间,用于高清电视显示器,因此对于游戏机非常重要。但是,更多的显示器正在制作更宽的色域一些用于照片编辑的计算机显示器使用Adobe 1998色彩空间(未显示)。最初为故事片制作而开发的DCI-P3色彩空间正在被广泛使用。苹果公司在iPhone产品线中采用了这种色彩空间,其他制造商也纷纷跟进。虽然超高清(UHD)内容和显示器被指定使用极宽的Rec.2020色彩空间,但在很多情况下也会采用DCI-P3作为UHD的颜色空间。2020没有在图8.9中显示,但它的色域非常接近图中的色彩空间ACEScg。ACEScg色彩空间由电影艺术与科学学院(AMPAS)开发,用于电影计算机图形渲染。它不是用作显示颜色空间,而是用作渲染的工作颜色空间,在渲染后将颜色转换为适当的显示颜色空间。

虽然目前sRGB色彩空间在实时渲染中无处不在,但会有越来越多使用更宽的色彩空间。 最直接的好处是针对宽色域显示器的应用程序,但即使是使用sRGB或Rec.709显示的应用程序也有优势。当在不同的颜色空间中执行时,诸如乘法的常规渲染操作给出不同的结果,并且有证据表明在DCI-P3或ACEScg空间中执行这些操作比在线性sRGB空间中执行它们产生更准确的结果。

从RGB空间到XYZ空间的转换是线性的,可以使用从RGB空间的原色和白点导出的矩阵来完成。通过矩阵求逆和串联,可以导出矩阵以从XYZ转换到任何RGB空间,或者在两个不同的RGB空间之间转换。注意,在这种转换之后,RGB值可以是负值或大于1。这些是超出色域的颜色,即在目标RGB空间中不可再现。可以使用各种方法将这些颜色映射到目标RGB色域中。

一种常用的转换是将RGB颜色转换为灰度亮度值。由于亮度与Y系数相同,因此该操作仅是RGB到XYZ转换的“Y部分”。 换句话说,它是RGB系数和RGB到XYZ矩阵的中间行之间的点积。在sRGB和Rec.709的情况下,等式为:

$$
Y=0.2126R+0.7152G+0.0722B\tag{8.3}
$$

这再次让我们重温光度曲线,如图8.4所示。该曲线表示标准观察者的眼睛如何响应各种波长的光,乘以三原色的光谱功率分布,并且每个结果曲线都是整合的。得到的三个权重是上述亮度方程的形式。灰度强度值不等于红色,绿色和蓝色的原因是因为眼睛对各种波长的光具有不同的灵敏度。

比色法可以告诉我们两种颜色刺激是否匹配,但它无法预测它们的外观。给定XYZ颜色刺激的出现在很大程度上取决于诸如照明,周围颜色和先前条件等因素。诸如CIECAM02的颜色外观模型(Color appearance models,CAM)试图处理这些问题并预测最终的颜色外观。

颜色外观建模(Color appearance modeling)是更广泛的视觉感知领域的一部分,包括诸如masking之类的效果。 这是放置在物体上的高频率,高对比度图案倾向于隐藏瑕疵的地方。换句话说,诸如波斯地毯之类的纹理将有助于伪装色带和其他着色伪像,这意味着需要为这些表面花费较少的渲染工作。

8.1.4 Rendering with RGB Colors(使用RGB颜色渲染)

严格地说,RGB值代表感知而不是物理量。使用它们进行基于物理的渲染在技术上是一个类别错误。正确的方法是对光谱量执行所有渲染计算,通过密集采样或投影到合适的基础上表示,并且仅在结束时转换为RGB颜色。

例如,最常见的渲染操作之一是计算从对象反射的光。物体的表面通常比其他波长更能反射某些波长的光,如光谱反射率曲线所述。计算反射光颜色的严格正确方法是将入射光的SPD乘以每个波长的光谱反射率,得到反射光的SPD,然后将其转换为RGB颜色。相反,在RGB渲染器中,灯光和曲面的RGB颜色相乘,以给出反射光的RGB颜色。在一般情况下,这不会给出正确的结果。为了说明,我们将看一个极端的例子,如图8.10所示。

图8.10。顶部曲线显示了设计用于投影屏幕的材料的光谱反射率。下面的两个图显示了具有相同RGB颜色的两个光源的光谱功率分布:中间图中的RGB激光投影仪和底部图中的D65标准光源。 屏幕材料将反射来自激光投影仪的大约80%的光,因为它具有与投影仪原色对齐的反射峰。 但是,它将反射不到20%的D65光源光,因为大部分光源的能量都在屏幕的反射峰值之外。 此场景的RGB渲染将预测屏幕将反射两种灯光的相同强度。

我们的示例显示了一个用于激光投影仪的屏幕材料。它在与激光投影仪波长匹配的窄带中具有高反射率,对于大多数其他波长具有低反射率。 这使其反射来自投影仪的大部分光线,但吸收来自其他光源的大部分光线。 在这种情况下,RGB渲染器将产生严重错误。

但是,图8.10所示的情况远非典型。实际中遇到的表面的光谱反射率曲线更平滑,如图8.11中所示。典型的光源SPD类似于D65光源,而不是示例中的激光投影仪。当光源SPD和表面光谱反射率都是平滑的时,RGB渲染引入的误差相对很小。

图8.11。 一个黄色香蕉的光谱反射率

在预测渲染(predictive rendering)应用程序中,这些微妙的错误可能很重要。例如,两个光谱反射率曲线在一个光源下可以具有相同的颜色外观,而不是另一个光源。例如,在绘制修复的车身部件时,这个问题,称为同色异谱失效(metameric failure)或光源同色异谱(illuminant metamerism),是一个严重的问题。在尝试预测此类效果的应用程序中,RGB渲染不合适。

然而,对于大多数渲染系统,尤其是那些不旨在产生预测模拟的交互式应用系统中,RGB渲染的效果令人惊讶。即使是离线渲染最近才开始采用光谱渲染,但它还远未普及。

本节仅涉及颜色科学的基础知识,主要是为了让人们了解光谱与颜色三元组的关系,并讨论器件的局限性。相关主题将渲染场景颜色转换为显示值,将在下一节中讨论。


8.2 Scene to Screen(场景到屏幕)

本书接下来的几章主要讨论基于物理的渲染问题。给定虚拟场景,基于物理的渲染的目标是计算场景中存在的辐射,如果它是真实的。然而,在那时,工作还远未完成。显示器的帧缓冲区中的最终结果像素值仍然需要确定。 在本节中,我们将介绍关于此的一些注意事项。

8.2.1 High Dynamic Range Display Encoding(HDR显示编码)

本节中的内容基于第5.6节,其中包含显示编码。 我们决定将高动态范围(HDR)显示的覆盖推迟到本节,因为它需要有关主题的背景知识,例如色域,这些在本书的那一部分尚未讨论过。

第5.6节讨论了标准动态范围(SDR)监视器的显示编码,SDR监视器通常使用sRGB显示标准,SDR电视使用Rec.709和Rec.1886年的标准。两组标准具有相同的RGB色域和白点(D65),以及有些相似(但不相同)的非线性显示编码曲线。它们也具有大致相似的参考白色亮度水平(对于sRGB为$80cd/m^2$,对于Rec.709/1886为$100cd/m^2$)。监视器和电视制造商并没有密切关注这些亮度规格,他们实际上倾向于制造具有更亮白色水平的显示器。

HDR显示使用Rec.2020和Rec.2100标准。Rec.2020定义了一个具有明显更宽色域的色彩空间,如图8.12所示,以及与Rec.709和sRGB颜色空间相同的白点(D65)。Rec.2100定义了两种非线性显示编码:感知量化器(perceptual quantizer, PQ)和混合对数伽马(hybrid log-gamma, HLG)。 HLG编码在渲染情况下使用不多,因此我们将重点关注PQ,它定义了峰值亮度值$10,000cd/m^2$。

从应用程序方面,有三条路径将图像传输到HDR显示器,但根据显示器和操作系统的不同,并非所有三个路径都可用:

图8.12。CIE 1976 UCS图显示的Rec.2020和sRGB/Rec的色域和白点(D65)。709色空间。 还显示了DCI-P3色彩空间的色域用于比较。
  1. HDR10 —— 在HDR显示器以及PC和控制台操作系统中支持广泛。帧缓冲区格式为每像素32位,每个RGB通道有10个,alpha通道2个无符号整数位。它使用PQ非线性编码和Rec.2020色彩空间。每个HDR10显示模型都执行自己的色调映射,这并不是标准化或可记录的。
  2. scRGB(线性变体)—— 仅在Windows操作系统上受支持。名义上它使用sRGB原色和白色级别,但两者都可以超过,因为标准支持小于0且大于1的RGB值。帧缓冲格式为每通道16位,并存储线性RGB值。 它可以与任何HDR10显示器一起使用,由驱动程序转换为HDR10。它主要用于方便和向后兼容sRGB。
  3. 杜比视界(Dolby Vision) —— 专有格式,尚未在显示器或任何控制台上广泛支持(撰写本文时)。它使用自定义12位每通道帧缓冲格式,并使用PQ非线性编码和Rec.2020色彩空间。显示内部色调映射在模型中标准化(但未记录)。

Lottes指出实际上有第四种选择。如果仔细调整曝光和颜色,则HDR显示可以通过SDR信号通路以取得效果良好。

除了scRGB之外的任何选项,作为显示编码步骤的一部分,应用程序需要将像素RGB值从渲染工作空间转换为Rec.2020 —— 这需要一个3×3矩阵变 —— 并应用PQ编码,这比Rec.709或sRGB编码函数成本要高一些。Patry给出了PQ曲线的廉价近似值。在HDR显示器上合成用户界面(UI)元素时需要特别小心,以确保用户界面清晰易读并且处于舒适的亮度级别。

8.2.2 Tone Mapping(色调映射)

在5.6节和8.2.1节中,我们讨论了显示编码,即将线性辐亮度值转换为显示硬件的非线性代码值的过程。显示编码应用的功能与显示器的电光学传递函数(EOTF)相反,可确保输入线性值与显示器发出的线性辐射亮度相匹配。 我们之前的讨论掩盖了渲染和显示编码之间发生的重要步骤,我们现在准备探索这一步骤。

图8.13。合成(渲染)图像的成像管线。我们渲染线性场景引用辐射值,色调映射转换为线性显示引用值。显示编码应用反EOTF将线性显示值转换为非线性编码值(代码),这些值将传递给显示器。最后,显示硬件应用EOTF将非线性显示值转换为从屏幕发射到眼睛的线性辐射。

色调映射是将场景辐射值转换为显示辐射值的过程。 在此步骤中应用的变换称为端到端传递函数或场景到屏幕变换。 图像状态的概念是理解色调映射的关键。有两种基本的图像状态。参考场景辐射值来定义场景引用图像,并且参考显示辐射值来定义显示引用图像。 图像状态与编码无关。 任一状态的图像可以线性或非线性地编码。 图8.13显示了图像,色调映射和显示编码如何在成像管线中组合在一起,处理从初始渲染到最终显示的颜色值。

关于色调映射的目标存在几种常见的误解。它并不是为了确保场景到屏幕的变换保持不变,在显示器处完美地再现场景辐射值。它也不会把场景的高动态范围中的每一点信息“压缩”到显示器的较低动态范围中,尽管考虑到场景和显示器动态范围之间的差异确实起着重要作用。

为了理解色调映射的目标,最好将其视为图像再现的一个例子。 图像再现的目的是在给定显示特性和观看条件的情况下,如果观察原始场景,观看者将具有的感知印象,创建尽可能接近地再现的显示的图像。见图8.14。

图8.14。 图像再现的目的是确保由再现(右)引起的感知印象尽可能接近原始场景(左)的感知印象。

存在一种具有略微不同目标的图像再现。优选图像再现(Preferred image reproduction)旨在创建在某种意义上比原始场景看起来更好的显示引用图像。优选图像再现将在后面的8.2.3节中讨论。

考虑到典型场景中的亮度范围超过显示能力几个数量级,再现与原始场景类似的感知印象的目标是具有挑战性的。 场景中至少一些颜色的饱和度(纯度)也可能远远超过显示能力。 然而,摄影,电视和电影确实设法产生令人信服的原始场景的感知形象,文艺复兴时期的画家也是如此。 通过利用人类视觉系统的某些属性,可以实现这一成就。

视觉系统补偿绝对亮度的差异,称为适应的能力。由于这种能力,尽管再现的亮度小于原始的1%,但是在昏暗的房间中在屏幕上显示的室外场景的再现可以产生与原始场景类似的感知。但是,由适应所提供的补偿是不完善的。 在较低的亮度水平下,感知的对比度降低(the Stevens effect,史蒂文斯效应),感知的“色彩”(the Hunt effect,亨特效应)也是如此。

然而,这种对比度的增加加剧了现有问题。由于场景的动态范围通常远大于显示器的动态范围,因此我们必须选择一个较窄的亮度值窗口来重现,该窗口上方和下方的值被剪切为黑色或白色。提升对比度进一步缩小了这个窗口。 为了部分抵消暗和亮值的削波,使用roll-off来补回一些阴影和高光细节。

所有这些都产生了S形(sigmoid)色调再现曲线,类似于光化学膜提供的曲线。这不是偶然的。柯达和其他公司的研究人员仔细调整了光化学薄膜乳液的性质,以产生有效和令人愉悦的图像再现。由于这些原因,形容词“filmic”经常出现在色调映射的讨论中。

曝光的概念对于色调映射至关重要。 在摄影中,曝光是指控制落在胶片或传感器上的光量。然而,在渲染中,曝光是在应用色调再现变换之前对场景引用图像执行的线性缩放操作。曝光的棘手方面是确定要应用的缩放因子。 色调再现变换和曝光紧密结合在一起。通常设计色调变换,期望它们将以某种方式的曝光应用于场景引用图像。

通过曝光缩放然后应用色调再现变换的过程是一种全局色调映射,其中相同的映射应用于所有像素。相反,局部色调映射过程基于周围像素和其他因素使用不同的像素到像素的映射。 实时应用程序几乎完全使用全局色调映射(有一些例外),因此我们将重点关注此类型,讨论第一次色调再现变换然后曝光。

重要的是要记住,场景引用图像和显示引用图像是根本不同的。物理操作仅在对场景引用的数据执行时有效。由于显示限制和我们讨论的各种感知效果,在两个图像状态之间总是需要非线性变换。

Tone Reproduction Transform(色调再现变换)

色调再现变换(Tone reproduction transforms)通常表示为将场景引用输入值映射到显示引用输出值的一维曲线。这些曲线可以独立地应用于R,G和B值或亮度。在前一种情况下,结果将自动显示在显示色域中,因为每个显示器提供的RGB通道值将介于0和1之间。但是,在RGB通道上执行非线性操作(尤其是剪切)可能会导致饱和度和色调发生偏移,除了所需的亮度变化。Giorgianni和Madden指出,饱和度的变化在感知上是有益的。大多数再现变换使用提升对比度(contrast boost)来抵消史蒂文斯效应(以及环绕和观看眩光效果),同事将抵消亨特效应。然而,色调偏移(hue shifts)通常被认为是不合需要的,并且现代色调变换试图通过在色调曲线之后应用额外的RGB调整来减少它们。

通过将色调曲线应用于亮度,可以避免(或至少减少)色调和饱和度偏移。但是,显示引用的颜色可能超出了显示器的RGB色域,在这种情况下,需要将其重新映射回来。

色调映射的一个潜在问题是将非线性函数应用于场景引用的像素颜色可能会导致某些抗锯齿技术出现问题。 第5.4.2节讨论了这个问题(以及解决它的方法)。

Reinhard色调再现算子(Reinhard tone reproduction operator)是用于实时渲染的早期色调变换之一。它使较暗的值大部分保持不变,而较亮的值渐近地变为白色。Drago等人提出了一种类似的色调映射算子。 能够调整输出显示亮度,这可能使其更适合HDR显示。Duiker创建了柯达电影响应曲线的近似值,用于视频游戏。此曲线后来由Hable修改以添加更多用户控件,并用于游戏Uncharted 2。Hable在此曲线上的演示具有影响力,导致在几个游戏中使用“Hable filmic curve”。Hable后来提出了一条新曲线,与之前的工作相比具有许多优点。

Day呈现出一种S形色调曲线,用于Insomniac Games的游戏,以及游戏“使命召唤:高级战争”。 Gotanda创造了色调变换,模拟电影和数码相机传感器的响应。 它们在游戏Star Ocean 4和其他游戏中得以应用。 Lottes指出,显示器闪光对显示器的有效动态范围的影响是显着的,并且高度依赖于室内照明条件。因此,为色调映射提供用户调整很重要。他提出了一种可以调整的色调再现变换,支持可以与SDR以及HDR显示器一起使用。

学院色彩编码系统(Academy Color Encoding System,ACES)由美国电影艺术与科学学院的科学技术委员会创建,作为管理电影和电视行业色彩的标准。ACES系统将场景到屏幕转换分为两部分。第一个是参考渲染变换(reference rendering transform,RRT),它将场景引用值转换为标准的,设备中立的输出空间中的显示引用值,称为输出颜色编码规范(output color encoding specification,OCES)。第二部分是输出设备变换(output device transform,ODT),它将颜色值从OCES转换为最终显示编码。有许多不同的ODT,每个ODT都是针对特定的显示设备和观看条件而设计的。RRT和合适的ODT的串联创建了整体变换。这种模块化结构便于处理各种显示类型和观看条件。Hart建议对需要支持SDR和HDR显示的应用进行ACES色调映射变换。

尽管ACES设计用于电影和电视,但其变形在实时应用中的使用越来越多。默认情况下,在虚幻引擎中启用ACES色调映射,Unity引擎也支持它。Narkowicz给出了符合SDR和HDR ODT的ACES RRT的廉价曲线,Patry也是如此。Hart提供了ACES ODT的参数化版本,以支持一系列设备。

使用HDR显示的色调映射需要注意,因为显示器也将应用他们自己的一些色调映射。Fry提供了Frostbite游戏引擎中使用的一组色调映射变换。它们为SDR显示器应用了相对激进的色调再现曲线,对于使用HDR10信号的显示器(具有基于显示器的峰值亮度的一些变化)使用相对柔和的色调再现曲线,使用Dolby Vision的显示器没有色调映射(换句话说,它们依赖于显示器应用的内置Dolby Vision色调映射。 Frostbite色调再现变换被设计为中性,没有明显的对比度或色调变化。目的是通过颜色分级应用任何所需的对比度或色调修改(第8.2.3节)。为此,色调再现变换应用于ICTCP色彩空间,其设计用于色度和亮度轴之间的感知均匀性和正交性。Frostbite变换对亮度进行色调映射,并随着亮度下降显示白色而逐渐降低色度。这提供了一个没有色相变化的干净变换。

具有讽刺意味的是,由于asset(例如火焰效果)被编写为利用其先前变换中的色调变化的样子,Frostbite团队最终修改了变换,使用户能够将某种程度的色调变换重新引入显示 - 参考颜色。 图8.15显示了Frostbite变换与本节中提到的其他几个变换的比较。

图8.15。应用了四种不同色调变换的场景。 差异主要见于圆圈区域,其中场景像素值特别高。 左上:clipping(加上sRGB OETF);右上角:Reinhard;左下:Duiker;右下:Frostbite(色调保留版)。 Reinhard,Duiker和Frostbite转换了所有通过剪裁丢失的高光信息。然而,Reinhard曲线倾向于使图像的较暗部分去饱和,而Duiker变换增加了较暗区域的饱和度,这有时被认为是理想的特性。通过设计,Frostbite变换保留了饱和度和色调,避免了在其他三个图像的左下圆圈中可以看到的强烈的色调偏移。(图片由c 2018 Electronic Arts Inc.提供)
Exposure(曝光)

用于计算曝光的常用技术依赖于分析场景引用的亮度值。为避免卡顿,通常通过对前一帧进行采样来完成此分析。

根据Reinhard等人的推荐,在早期实现中使用的一个度量标准是对数平均场景亮度( log-average scene luminance)。通常,通过计算帧的对数平均值来确定曝光。通过执行一系列下采样后处理过程来计算该对数平均值,直到计算出帧的最终单个值。

使用平均值往往对异常值过于敏感,例如,少量明亮像素可能影响整个帧的曝光。随后的实现通过改为使用亮度值的直方图来改善该问题。而不是平均值,直方图允许计算中值,这更加稳健。直方图中的附加数据点可用于改善结果。 例如,在The Orange Box(by Valve)中,基于第95百分位数和中位数的启发式方法用于确定曝光。Mittring描述了使用计算着色器生成亮度直方图的方法。

到目前为止所讨论的技术的问题在于像素亮度是用于驱动曝光的错误度量。如果我们看一下摄影实践,例如安塞尔亚当斯的区域系统以及如何使用入射光度计来设置曝光,很明显,最好单独使用照明(没有表面反照率的影响)来确定曝光。这样做是有效的,因为在第一次近似中,摄影曝光用于抵消照明。这导致主要显示对象的表面颜色的印刷品,其对应于人类视觉系统的颜色恒定性属性。以这种方式处理曝光也可确保将正确的值传递给色调变换。例如,电影或电视行业中使用的大多数色调变换被设计为将曝光的场景引用值0.18映射到显示引用值0.1,期望0.18表示18%的灰卡。主导场景照明。

虽然这种方法在实时应用程序中尚未普及,但它开始被视为使用。例如,游戏合金装备V:地面零点具有基于照明强度的曝光系统。在许多游戏中,基于已知的场景照明值,为环境的不同部分手动设置静态曝光水平。这样做可以避免意外的曝光动态变化。

8.2.3 Color Grading(颜色分级)

在8.2.2节中,我们提到了首选图像再现的概念(preferred image reproduction),即产生在某种意义上比原始场景看起来更好的图像的想法。通常,这涉及对图像颜色的创造性操纵,这一过程称为颜色分级。

数字色彩分级已经在电影行业中使用了一段时间。早期的例子包括电影O Brother,Where Art Thou?(逃狱三王,2000)和Amélie(天使爱美丽,2001)。 颜色分级通常通过交互式操作示例场景图像中的颜色来执行,直到实现所需的创意“外观”。然后在镜头或序列中的所有图像上重新应用相同的操作序列。从电影到游戏,颜色分级现在被广泛使用。

Selan展示了如何从颜色分级或图像编辑应用程序“烘焙”任意颜色转换到三维颜色查找表(LUT)。这些表格通过使用输入R,G和B值作为x-,y-和z-坐标用于在表格中查找新颜色,因此可以用于从输入到输出颜色的任何映射,直到LUT分辨率的限制。Selan的烘焙过程首先采用一个统一的LUT(映射把所有输入颜色都转换为相同的颜色)并“切片”它以创建一个二维图像。然后将这个切片的LUT图像加载到颜色分级应用程序中,并将定义所需创意外观的操作应用于它。需要仅将颜色操作应用于LUT,避免模糊等空间操作。然后将编辑后的LUT保存,“打包”到三维GPU纹理中,并在渲染应用程序中使用,以对其应用相同的颜色转换。飞到渲染像素。我使用最小二乘最小化时,wanicki提供了一种在LUT中存储颜色变换时减少采样误差的巧妙方法。

图8.16。游戏Uncharted 4中的场景。顶部的屏幕截图没有颜色分级。其他两个屏幕截图均应用了颜色分级操作。为了说明的目的,选择极端的颜色分级操作(乘以高度饱和的青色)。在左下方的屏幕截图中,颜色分级应用于显示器引用(post-tone-mapping)图像,并且在右下方屏幕截图中,将其应用于场景引用(pre-tone-mapping)图像。

在后来的出版物中,Selan区分了两种执行颜色分级的方法。在一种方法中,对显示引用图像数据执行颜色分级。 另一方面,对通过显示变换预览的场景引用数据执行颜色分级操作。 尽管显示器引用的颜色分级方法更容易设置,但是对场景引用的数据进行分级可以产生更高保真度的结果。

当实时应用程序首次采用颜色分级时,显示器引用的方法占主导地位。然而,由于其更高的视觉质量,场景引用的方法已经获得了提拔。见图8.16。将颜色分级应用于场景引用数据还提供了通过将色调映射曲线烘焙到分级LUT中来节省一些计算的机会,如游戏Uncharted 4中所做的那样。

在LUT查找之前,场景引用的数据必须重新映射到范围[0,1]。 在Frostbite引擎中,感知量化器OETF用于此目的,尽管可以使用更简单的曲线。Duiker使用对数曲线,Hable建议使用一次或两次应用的平方根运算符。

Hable概述了常见的颜色分级操作和实现注意事项。

Further Reading and Resources

对于比色法和色彩科学,“圣经”是Wyszecki和Stiles的《Color Science》。其他良好的色度参考包括Fairchild的《HuntMeasuring Colour》和《Color Appearance Models》。

Selan的白皮书很好地概述了图像再现和“场景到屏幕”问题。 想要更多地了解这个主题的读者会发现Giorgianni和Madden的《Digital Color Management》和 Hunt的《The Reproduction of Colour》是很好的参考。安塞尔·亚当斯摄影系列中的三本书Ansel Adams Photography Series,尤其是《The Negative》,提供了对电影摄影艺术和科学如何影响图像再现理论和实践的理解。 最后,Reinhard等人著作《Color Imaging:Fundamentals and Applications》一书对整个研究领域进行了全面的概述。

(chapter 8 end.)