Light and Color

"《Real-Time Rendering 4th》笔记——第八章 光与颜色"

Posted by Ciel on January 11, 2020

Light and Color

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

1光量

任何基于物理的渲染方法的第一步都是精确地量化光线。首先介绍了辐射测量学(Radiometry),因为它是光物理传输的核心领域。我们接着讨论了光度学(photometry),它处理的是由人眼灵敏度加权的光值。我们对颜色的感知是一种心理物理现象:对物理刺激的心理感知。颜色感知在色度学(colorimetry)一节中讨论。最后,我们讨论了RGB颜色值渲染的有效性。

1.1辐射测量

辐射测量学(Radiometry)研究的是电磁辐射的测量。正如将在9.1节中更详细地讨论的那样,这种辐射以波的形式传播。不同波长的电磁波(具有相同相位的两个相邻点之间的距离,例如两个相邻的峰值)往往具有不同的性质。在自然界中,电磁波的波长范围很广,从长度不到百分之一纳米的伽马波到长达数万公里的极低频(ELF)电波。人类能看到的光波只是这个范围的一小部分,从400纳米的紫光到700多纳米的红光。见图8.1。

8.1

原书图8.1,显示在整个电磁波谱范围内的可见光波长范围。

辐射量用于测量电磁辐射的各个方面:总体能量、功率(随时间变化的能量)和相对于面积、方向或两者的功率密度。这些数量列于表8.1。

t8.1

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

辐照度是辐射通量相对于面积的密度,即$d\Phi/dA$。辐照度是根据面积来定义的,面积可以是空间中想象的面积,但通常是物体的表面。它的单位是瓦特每平方米。

在讨论下一个量之前,我们需要先介绍立体角的概念,它是角概念的三维扩展。一个角度可以被认为是一个平面上连续的方向集的大小度量,其弧度的值等于这个方向集与半径为1的封闭圆相交的弧的长度。类似地,立体角测量三维空间中连续的方向集合的大小,用半径为1的封闭球体上的相交点的面积来测量(缩写为sr)。立体角由符号表示$\omega$。

在两个维度,一个2π弧度角覆盖整个单位圆。这延伸到三维空间,4π的立体角球面度将覆盖整个地区的单位球。一个立体角的大小可以在图8.2中看到。

8.2

原书图8.2,从球体的剖视图中删除的立体角为一个球面度的圆锥体。形状本身与测量无关。 球体表面的覆盖范围是关键。

现在我们可以引入辐射强度I,它是相对于方向的通量密度,更确切地说是立体角($d\Phi/d\omega$)。单位为瓦/每球面度。

最后,辐射强度L是单一射线中电磁辐射的量度。更准确地说,它被定义为辐射通量密度相对于面积和立体角($d^2\Phi/dAd\omega$)。这个面积是在垂直于射线的平面上测量的。如果辐射是应用到一个表面在其他方向,那么余弦校正因子必须使用。参考该校正系数,可能会遇到使用“投影面积”这一术语的辐射定义。

辐射率是传感器(如眼睛或照相机)测量的值(详细信息请参阅9.2节),所以它对于渲染来说是最重要的。计算着色方程的目的是计算从着色面点到摄像机的沿给定光线的亮度。沿着这条射线的L值是第5章中基于物理的量$C_{shaded}$的等价物。辐射的公制单位是瓦特每平方米每球面度。

环境中的辐射可以看作是五个变量(或六个,包括波长)的函数,称为辐射分布。其中三个变量指定位置,另外两个指定方向。这个函数描述了所有的光在空间中移动。一种理解渲染过程的方法是,眼睛和屏幕定义一个点和一组方向(例如,一条射线通过每个像素),然后在眼睛处对每个方向进行评估。第13.4节讨论的基于图像的渲染使用了一个相关的概念,称为光场light field。

在着色方程中,辐度通常表示为$L_o(x,d)$或$L_i(x,d)$,分别表示从x点发出或进入x点的辐射。方向向量d表示射线的方向,根据惯例,它总是指向远离x的方向。虽然在Li的情况下,这个约定可能有点令人困惑,因为d指向与光传播相反的方向,但是对于点积之类的计算是方便的。

辐射的一个重要特性是它不受距离的影响,忽略了大气的影响,如雾。换句话说,不管与观察者的距离有多远,一个表面都会有相同的亮度。距离越远,表面覆盖的像素越少,但每个像素处的表面辐射是恒定的。

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

8.3

原书图8.3,三种不同光波的光谱功率分布。顶部的SPD是一种绿色激光,其光谱分布非常窄。其波形类似于图9.1中的简单正弦波。中间的SPD用于由相同的绿色激光加上两个额外的激光组成的光,一个红色和一个蓝色。这些激光的波长和相对强度与显示中性白色的RGB激光投影显示器相对应。底部的SPD是标准的D65光源,这是一个典型的中性白色参考,用来代表户外照明。这样的SPD是典型的自然光,它的能量不断地散布在可见光谱上。

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

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

1.2光度学

辐射测量学只研究物理量,不考虑人的感知。一个相关的领域,光度学(photometry),就像辐射测量学,只是它是通过人眼的敏感度来衡量一切的。辐射计算的结果通过乘以CIE光度曲线转换为光度单位,CIE光度曲线是一条以555 nm为中心的钟形曲线,表示眼睛对各种波长的光的反应。参见图8.4。

8.4

原书图8.4,光度曲线。

转换曲线和测量单位是光度学理论和辐射测量理论的唯一区别。每个辐射量都有一个等效的米制光度量。表8.2显示了每一个的名称和单位。单位都有预期的关系(例如,勒克斯lux是光通量lumen每平方米)。虽然在逻辑上lumen应该是基本单位,但在历史上坎德拉candela被定义为一个基本单位,其他单位是从它派生出来的。在北美,照明设计师使用废弃的英制计量单位英尺烛光(foot-candle fc)来测量照度,而不是照度lux。无论哪种情况,illuminance都是大多数照度计所测量的,在照明工程中是很重要的。

t8.2

原书表8.2,辐射和光度的数量和单位。

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

1.3色度学

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

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

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

8.5

原书图8.5,r、g、b二度色彩搭配曲线,来自Stiles和Burch。这些配色曲线不能与用于配色实验的光源的光谱分布相混淆,因为光源是纯波长的。

这些函数给出了一种将光谱功率分布转换为三个值的方法。在给定单一波长的光的情况下,可以从图形,旋钮设置和创建的照明条件中读取三种彩色的照明设置,这些设置将使屏幕上的两个照明块都具有相同的感觉。对于任意的光谱分布,颜色匹配函数可以乘以每个结果曲线下的分布和面积(即,积分)给出相对的数量,设置彩色的光,以匹配感知到的颜色产生的光谱。相当不同的光谱分布可以解析为相同的三个权重,即,对于观察者而言,它们看起来相同。提供匹配权重的光谱分布称为元模型metamers。

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

8.6

原书图8.6,Judd-Vos-modified CIE(1978) 2度配色函数。注意,这两个$\overline{x}$是同一条曲线的一部分。

与前一套颜色匹配函数相同,$\overline{x}(\lambda),\overline{y}(\lambda),\overline{z}(\lambda)$是通过乘法和积分用来减少任何SPD $s(\lambda)$的三个数字:

e8.1

这些X、Y和Z三刺激值是在CIE XYZ空间中定义颜色的权重。把颜色分成亮度luminance(brightness)和色度chromaticity通常是很方便的。色度是指颜色与亮度无关的特性。例如,两种深浅不同的蓝色,一种暗的,一种亮的,可以有相同的色度,尽管在亮度上不同。

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

e8.2

8.7

原书图8.7,CIE RGB三原色的RGB颜色立方体显示在XYZ空间中,以及它在X + Y + Z = 1平面上的投影(紫色)。蓝色轮廓覆盖可能的色度值空间。从原点辐射出来的每条线都有一个恒定的色度值,只是亮度不同。

z值没有提供其他信息,因此通常省略它。色度坐标x和y的坐标图被称为CIE 1931色度图。参见图8.8。图中曲线的轮廓表示可见光谱的颜色所在,而连接光谱两端的直线称为紫色线。黑点表示光源D65的色度,这是一个常用的白色点——色度用来定义白色或无色(无色)刺激。

8.8

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

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

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

色度图描述了一个平面。第三个需要完全描述颜色的维度是Y值,亮度。这些定义了所谓的xyY坐标系。色度图对于理解如何在渲染中使用颜色以及渲染系统的限制非常重要。电视或计算机显示器通过使用R、G和B颜色值的某些设置来显示颜色。每个颜色通道控制一个显像基色,显像基色发出具有特定光谱功率分布的光。三原色的每一种都按其各自的颜色值进行缩放,并将它们叠加在一起,以创建观察者所感知到的单一光谱功率分布。

色度图中的三角形表示典型电视或计算机显示器的色域。三角形的三个角是三原色,三原色是屏幕可以显示的最饱和的红色、绿色和蓝色。色度图的一个重要特性是,这些有限的颜色可以用直线连接起来,以显示整个显示系统的极限。这些直线代表了通过混合这三种三原色可以显示的颜色的界限。白点表示当R、G和B的颜色值相等时,显示系统产生的色度。需要注意的是,显示系统的全部范围是一个三维体。色度图只显示了这个体积在二维平面上的投影。更多信息请参见Stone的书。

有几个有趣的RGB空间用于渲染,每个空间由R、G和B三原色和一个白点定义。为了比较它们,我们将使用一种不同类型的色度图,称为CIE 1976 UCS(uniform chromaticity scale均匀色度标度)图。该图是CIELUV颜色空间的一部分,CIE(以及另一个颜色空间CIELAB)采用该颜色空间的目的是为XYZ空间提供更一致的替代方案。在CIE XYZ空间中,可以感觉到相同数量的颜色对在距离差异最多可以达到20倍。CIELUV对此进行了改进,使比率最多降低了四倍。这种更高的感知均匀性使得1976年的图表比1931年的图表更好地用于比较RGB空间的色域。对感知一致的颜色空间的持续研究最近产生了$IC_TC_P$和$J_za_zb_z$空间。与CIELUV相比,这些颜色空间在感知上更均匀,特别是对于现代显示器的高亮度和饱和颜色。然而,基于这些颜色空间的色度图还没有被广泛采用,因此我们在本章中使用CIE 1976 UCS图,如图8.9。

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色彩空间正在得到更广泛的应用。Apple在从iphone到mac的产品线中都采用了这种颜色空间,其他制造商也纷纷效仿。尽管将超高清(UHD)内容和显示指定为使用超宽色域Rec.2020颜色空间,但在许多情况下,DCI-P3也被用作UHD的实际颜色空间。图8.9没有显示Rec. 2020,但是它的色域非常接近图中第三个颜色空间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

这又回到了图8.4的光度曲线。这条曲线代表了一个标准观察者的眼睛如何对不同波长的光做出反应,它乘以三个三原色的光谱功率分布,每条结果曲线都被整合。这三个结果的权重构成了上面的亮度方程。灰度强度值不等于红色、绿色和蓝色的原因是眼睛对不同波长的光有不同的敏感度。

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

颜色外观建模是更广泛的视觉感知的一部分,其中包括诸如遮罩之类的效果。在此放置在物体上的高频,高对比度的图形往往会掩盖瑕疵。换句话说,诸如波斯地毯的纹理将有助于掩盖色带和其他阴影伪像,这意味着需要为此类表面花费较少的渲染工作。

1.4使用RGB颜色渲染

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

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

8.10

原书图8.10,顶部的图显示了一种用于投影屏幕的材料的光谱反射率。下面两个图显示了两种RGB颜色相同的光源的光谱功率分布:中间的图是RGB激光投影仪,下面的图是D65标准光源。屏幕材料将反射约80%的激光投影仪发出的光,因为它的反射率峰值与投影仪的原色成一直线。但是由于大多数光源的能量都在屏幕的反射率峰值之外,因此它将反射不到D65光源发出光的20%。该场景的RGB渲染将预测屏幕将为两种光反射相同的强度。

我们的例子展示了一种设计用于激光投影仪的屏幕材料。它在与激光投影仪波长相匹配的窄波段上具有高的反射率,而在大多数其它波长上具有低的反射率。这导致它反射大部分来自投影仪的光,但吸收大部分来自其他光源的光。在这种情况下,RGB渲染器会产生严重的错误。

然而,图8.10所示的情况远非典型。在实际应用中遇到的光谱反射曲线要光滑得多,如图8.11所示。典型的光源spd类似于D65光源,而不是在例子中的激光投影仪。当光源SPD和表面光谱反射率均为光滑时,RGB渲染引入的误差相对较小。

8.11

原书图8.11,黄香蕉的光谱反射率

在预测渲染应用程序中,这些细微的错误可能很重要。例如,两个光谱反射率曲线在一个光源下可能有相同的颜色外观,但在另一个光源下却没有。这一问题被称为异色故障或发光体异色现象,例如在油漆修复后的汽车车身部件时就会有明显问题。RGB渲染在预渲染这种类型效果的应用程序中是不合适的。

然而,对于大多数的渲染系统,特别是那些交互应用程序,它们的目的不是产生预测模拟,RGB渲染工作得出奇的好。即使是电影离线渲染也只是最近才开始使用光谱渲染,它还远远没有普及。

本节只涉及到颜色科学的基础知识,主要是为了使人们意识到光谱与颜色三联体的关系,并讨论设备的局限性。下一节将讨论与此相关的主题,即如何转换渲染的场景颜色来显示值。

2场景到屏幕

本书接下来的几章主要讨论基于物理的渲染问题。给定一个虚拟场景,基于物理的渲染的目标是计算在真实场景中出现的亮度。然而,在这一点上,工作还远远没有完成。最后的结果——显示的framebuffer中的像素值——仍然需要确定。在这一节中,我们将讨论与此决定有关的一些注意事项。

2.1高动态范围显示编码

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