Chapter 8 – Light and Color 光与颜色

我们在之前几章中学习的RGB颜色值光线的强度与颜色。在本章节中,我们将会学习由这些值所定义的光线的物理属性,并未之后的章节打下基础,以物理的角度学习渲染。同时,我们也将学习被大家所忽略的,但是渲染过程中不可缺少的另一个部分:将场景中线性的光线值转换为最终的显示颜色。

8.1 光量

任何基于物理渲染的方法的第一步都是对光量进行模拟。首先是学习radiometry(辐射度量),这一概念是光的物理传输的核心内容。之后,我们将学习光度photometry(光度测定),其与人类的眼睛所感受到的光线值有关。而我们对于颜色的感觉则是一个心理物理学现象:心理对于物理刺激的感知。我们将在colometry(比色)的小节中学习对于颜色的理解。最后,我们将学习使用RGB颜色值进行渲染的准确性。

8.1.1 Radiometry(辐射度量)

辐射度量,顾名思义,其涉及电磁辐射的测量。而我们将在第九章中进一步学习PBR,这一类辐射以波的形式进行传递。具有不同波长的电磁波(所谓波长,就是在统一阶段内两个毗邻的点的距离,例如,两个相邻的波峰)有着不同的属性。在现实世界中,电磁波有着各种各样的波长。而人类只能看见其中一小部分,从400纳米的紫色光到700纳米的红色光。如下图所示。

辐射度量能够测量不同类型电磁辐射:能量,功(一段时间内的能量),与基于区域,方向或者两者皆有的功的密度。这些单位都总结在下表中。

在辐射度量中,基本单位是辐射通量(radiant flux),Φ。辐射通量是一段时间内的辐射能量,单位为瓦特 (watts,W)

辐照度(irradiance)则是某一区域内的辐照通量的密度,例如,dΦ/dA。辐照度基于区域,面积进行定义,一般为物体的表面。其单位为瓦特每平米。

在我们学习下一个单位量之前将先了解solid angle(立体角),这是一个三维概念下的角度。立体角能够三维空间内一组连续的方向的尺寸,其单位为steradian(立体弧度,缩写为“sr”),立体角由ω表示。

在二维空间内,弧度2π将包含整个单位圆。在延伸到三维空间后,4π的立体弧度则能够包含整个单位球体。1立体弧度的尺寸如下图所示。

现在我们可以进一步学习辐照强度(radiant intensity)I,其是基于方向,更准确地说,是基于立体角(dΦ/dω)的辐射通量。其单位是瓦特每立体弧度。

最后是辐射率(radiance)L,其表示单一射线中的电磁辐射。更准确地说,它是基于面积与立体角的辐照通量的密度(d2Φ/dAdω)。该面积是与射线垂直的平面的面积。如果辐照率以某种方向通过物体的表面,那么我们需要使用余弦因子进行调整,计算出投影面积。

辐照率由眼睛或者camera测量(我们将在第九章中学习),所以这一变量对于渲染来说非常重要。而我们计算着色等式的目的就是计算射线的辐照率。因此,射线的辐照率L是第五章中的cshaded基于物理渲染的变量。而辐照率的单位是瓦特每平方米每立体弧度。

我们可以将辐照率认为是一个带有五个或者六个参数(包括,波长)的函数,其也被称为辐照率分布(radiance distribution)。其中的三个变量表示位置,另两个则表示方向。这个函数描述了空间中所有的光线。渲染的过程,我们可以理解为,眼睛与屏幕定义了一个坐标点以及一组方向(例如,光线穿过每一个像素),该函数将基于眼睛的位置计算每一个射线方向。而基于图像的渲染(我们将在第十三章中学习)使用了一个相关的理念,其被称为light field

在着色等式中,辐照率通常以Lo(x,d)或者Li(x,d)的形式出现,其表示辐照率从点x射出或者进入该点。方向向量d表示射线的方向,一般来说意味着射线从点xd的方向射出。但是在如果辐照率出现在Li(x,d)中,那么d表示的方向正好与之前相反,其是射线穿过点x的方向与光线的方向相反。

辐照率的一个重要的特点是其不受距离影响。换句话说,无论物体表面距离camera多远,其辐照率不会改变。如果物体距离camear较远,那么其覆盖的屏幕像素较少,但是其覆盖的像素的辐照率是不会改变的。

大多数光波都包含了不同的波长。通常这将以光谱功率(spectral power distribution,SPD)显示,其是一张图像表示在不同波长下的光能量的分布。下图展示了三个例子。除了中部与底部所显示的几个颜色,我们并不区分其他波长的不同。而我们将在之后的小节来学习颜色的可见性。

上图为三种不同光波的光谱功率。顶部的光谱功率表示一种绿色的激光,其光谱分布非常窄。中间的光谱功率则表示由绿色激光,红色激光和蓝色激光所组成的光。这三种激光的波长和强度等同于RGB激光投影显示的白色。底部的光谱光谱功率则是标准的D65光源,其类似于户外的白色光。这一类的光谱功率,在可见的光谱中光能量能够连续传递,一般表示自然界中的光。

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

在渲染时,我们并不会使用所有的光谱功率而是使用RGB来表示辐射量。在之后的小节中,我们将为大家解释这三个变量是如何与光谱分布相关联的。

8.1.2 Photometry(光度测量)

上一小节中的radiometry(辐射度量)只与物理量有关,其并未考虑人类的感知。另一相关的领域,photometry(光度测量),其类似于辐射度量,但是其通过人类眼睛的敏感度来测量所有的变量。辐射量的计算结果将乘以CIE photometric curve(光度曲线)转换光度测量单位,该曲线表示眼睛对于不同波长的光的反应。如下图所示。

光度测量与辐射度量唯一的区别就是转换曲线以及测量单位。每一个辐射量都有其对应的光度量。下表显示了每一个命名与单位。

上表中所有的单位都有着转换关系(例如,lux表示每平方米的lumen)。虽然理论上说,lumen应该是基本单位,但是由于candela更早被科学家发现,因此其是基本单位,而其它的单位都继承自该单位。在北美,光照设计师使用使用foot-candle(fc)来测量照度而不是lux。

通常,我们使用luminance(亮度)来表示一个平面的明亮程度。例如,HDR(high dynamic range)电视屏幕的峰值亮度范围一般为500到1000nit。相比较,天空的亮度大约为8000nit,一个60瓦灯泡的亮度为120000nit,太阳光在地平线的亮度大约为600000nit。

8.1.3 Colorimetry(色度)

在之前的两个小节中,我们已经知道,光的颜色是与光的光谱功率(SPD)。同时,这两者也不是一一对应的关系(之前的三个光谱功率图中,中间以及底部的光谱功率完全不同,但是它们有着相同的颜色)。而色度(colorimetry)则表示了光谱功率与感官体验的颜色之间的联系。

人类能够分辨大约100万种不同的颜色。为了感知颜色,视网膜上有三种不同的锥受体,每一种锥受体处理不同波长的光。自然界中,其他动物有着不同数量的颜色受体,有些甚至拥有十五种锥受体。所以,对于一个给定的光谱功率,我们的大脑只会从视网膜上的锥受体接收三种不同的信号。这也是为什么我们可以使用RGB三个变量来准确地表示“任何”颜色。

但是为什么是“三”呢?CIE对颜色进行了测量以及匹配实验。在颜色匹配实验中,三个带有颜色的光投影至白色屏幕上,因此三种颜色互相叠加,并形成一个“补丁”。在这个“补丁”附近,我们将投影一个用于匹配检测的颜色,而该颜色的光只有一种波长。之后观察者可以调整三种颜色的光的权重范围[-1,1],直到“补丁”的颜色完全与测试颜色相匹配。下图显示了一种测试结果。

上图中的三种光几乎是单色的,它们的能量分布几乎集中在一个波长范围内:r为645nm,g为526nm,b为444nm。而每一种光的权重与测试颜色的波长的关系函数则被成为color-matching function(颜色匹配函数)

三个带有权重的r,g,b光并不能够直接表示所有可见的颜色,因为有时权重值为负数。CIE提供了三种不同的假设光源,它们的颜色匹配函数的权重对于所有可见波长的光都是正数。这些曲线将于原始的r,g,b颜色匹配函数相结合。这需要它们的光谱功率在某些波长下为负数,所以这些光源只存在于数学假设。这三种光源的颜色匹配函数为x(λ),y(λ),z(λ),如下图所示。颜色匹配函数y(λ)与我们在上一小节所示的光度曲线相同,通过该曲线,辐射量将转换为亮度。

而同时,这三个颜色匹配函数将通过乘法与积分来降低SPD(光谱功率,也就是s(λ))。

而X,Y,Z这三个值就表示了权重,并且在CIE XYZ空间内定义了一个颜色。一般来说,我们会将颜色分为亮度(luminance,brightness)色度(chromacity)。色度指的是一个颜色的属性,其与亮度无关。例如,两种蓝色,一种较暗一种较亮,它们可能拥有相同的色度,但是亮度却不同。

因此,CIE定义了一个二维的色度空间,将颜色投影到X+Y+Z=1的平面。如下图所示,CIE RGB的颜色立方体如上图所示(位于XYZ空间)。蓝色线条所包围的空间则表示所有可能的色度值。该空间的坐标轴为x和y,关系式如下所示:

一般来说,我们会忽略z值。下图中,曲线范围内表示了可见的颜色光谱,而连接曲线的直线咋被称为临界线(purple line)。中间黑色点则表示D65光源的色度,通常其被定义为白色(也被称为白点),或者说没有颜色。

总的来说,我们会使用三个单一波长的光源来匹配其他波长的光源,从中计算出每个光源的占比。有时候,这三种单一波长的光源需要加上一些采样量以匹配待检测的光源。这意味着我们需要使用一组颜色匹配函数来修正三种光源的权重值,以保证其不为负数。有了非负颜色匹配函数之后,我们可以将任何光谱分布转换至一个定义颜色的色度与亮度的XYZ坐标系中,之后我们将该坐标系投影至xy平面,其表示颜色的色度,并将亮度变为常量。

基于一个颜色点(x,y),从坐标系中的白点画一条线并穿过(x,y),直到边界(光谱或者临界线)。白点到颜色点的距离相较于白点到边界的距离就是该颜色的excitation purity(激发纯度??神马鬼??)。这些色度术语一般不会在图形学中使用。相反,我们会使用饱和度(saturation)色调(hue)

色度图是一个平面,而我们需要第三个维度来描述一种颜色,也就是Y,其代表亮度。加上之前提到的xy坐标系,其组成了xyY坐标系。色度图能够帮助我们理解颜色是如何进行渲染的,也让我们了解渲染系统的限制。电视机或者电脑屏幕通过使用RGB的颜色值来表示颜色。每一个颜色通道都控制了一个display primary(显像基色),该参数将使用一个特定的光谱功率来提亮光照。这三种显像基色将由对应的颜色值控制,这三个显像基色的累加值将形成一个光谱功率,而该光谱功率就是我们所看到的颜色。

色度图中的三角形表示电视机或者显示器的显示范围(gamut)。三角形的三个顶点则表示显示设备所能表现的饱和度最高的红色,绿色以及蓝色。而三角形的三边则表示三个显像基色组合后所能显示的颜色的范围。之前我们提到的色度图中的白点则表示,当三个显像基色相同时所生成的颜色。我们需要注意,显示系统,例如,电视机或者显示器的完整的显示范围是一个三维空间的范围(可以将其想象为一个体积范围)。而色度图只展示了该范围在二维平面上的投影。

在图形学渲染中,我们会使用到多个RGB空间,它们都由三个显像基色以及一个白点定义。为了比较这几个不同的RGB空间,我们将使用另一个色度图,其被称为CIE 1976 USC(uniform chromaticity scale,统一色度范围)。如下图所示,其展示了三种RGB颜色空间,分别为sRGB,DCI-P3,ACEScg。

在上述三种颜色空间中,实时渲染中一般会使用sRGB。我们需要注意,在本小节中,我们所提及的“sRGB颜色空间”指的是拥有sRGB基色以及白点的线性颜色空间,其并不是我们在第五章学习的非线性sRGB颜色编码。大多数显示器都是基于sRGB颜色空间设计的,而该颜色空间的基色以及白点也被应用于Rec. 709颜色空间,而该颜色空间常用于高清电视,因此在电视游戏行业中更为常见。然而,越来越多的显示设备使用更广的显示范围。一些用于照片处理的显示器会使用Adobe 1998颜色空间。同时上图中的DCI-P3颜色空间,其最初多用于电影行业,也被更广泛地用于民用显示的领域。Apple已经在其产品线中使用该颜色空间。虽然UHD对应的视频内容应该使用Rec. 2020颜色空间,但是实践中也会使用DCI-P3作为UHD的颜色空间。上图并未包含Rec. 2020的颜色范围,但其实际范围比较接近图中的ACEScg。ACEScg颜色空间由Academy of Motion Picture Arts and Sciences(AMPAS)研发,其主要针对电影行业的计算机图形渲染。该颜色空间并不是作为显示设备的颜色空间,而是用于渲染的颜色空间,也就是说在渲染完成之后,颜色值将被转换为适用于显示的颜色空间。

虽然先满足大多数实时渲染的应用仍在使用sRGB颜色空间,但是其他显示范围更广的颜色空间的使用率正在慢慢上升。对于那些支持更广的显示范围的应用,好处是显而易见的,同时对于那些使用sRGB或者Rec. 709的应用也有益处,颜色的显示效果将变得更准确。

由RGB空间至XYZ红箭的转换是线性的,我们可以通过RGB空间的基色与白点求出矩阵,来进行该转换。而通过逆矩阵,我们可以实现XYZ空间和RGB空间的相互转换。需要注意的是,转换之后的RGB值可能是负数或者大于1,那么这些颜色都属于显示范围之外的颜色。

一个常用的转换是将RGB颜色变为灰度亮度值。因为颜色的亮度等同于系数Y,所以这一转换就是RGB至XYZ中Y轴部分的转换。换句话说,这一转换就是RGB系数与RGB-XYZ转换矩阵中中间那一行的点乘运算。对于sRGB和Rec. 709来说,其等式为:

让我们再次回到前两个小节中学习的光度曲线(photometric curve),其表示眼睛对于不同波长的光线的反应,其将乘以光谱功率中的三个基色,之后求出的每一条新的曲线都将进行积分。之后计算出的三个权重值则组成了上述亮度等式。由于眼睛对于不同波长的光线有着不同的敏感度,所以RGB每个基色前的系数是不同的。

色度能够告诉我们两种颜色是否匹配,但是其并不能告诉我们两个颜色的实际表现。而一个XYZ颜色的表现极大地取决于各种因素,例如光照,周边的颜色以及之前的状态。Color appearance models(CAM,颜色表现模型),例如CIECAM02,则试着告诉我们每一种颜色最终的表现。

8.1.4 使用RGB颜色进行渲染

严格意义上讲,RGB值代表了一种感知而非某种物理量。使用它们进行PBR(physically based rendering,基于物理的渲染)本身就是一种错误。正确的方法应该是基于光谱的数据进行所有的渲染计算,并在最后再进行RGB转换。

例如,在渲染过程中计算物体的反射光。物体表面可能更容易反射某一种波长的光线,该属性被称为spectral reflectance curve(光谱反射曲线)。严格意义上,正确计算反射光的颜色需要将入射光的SPD(光谱功率)乘以每个波长下的光谱反射,之后我们就能得到反射光的SPD,在将其转换为RGB颜色。但是,在RGB渲染系统中,光线的RGB颜色将乘以物体表面的RGB颜色,以此求出反射光的RGB。大多数情况下,这一种计算方式并不能得到正确的结果。为了便于大家理解,我们将展示某些极端情况下的例子,如下图所示。

上图中,顶部的红色曲线是物体表面材质的光谱反射。下面两张图则表示两个拥有相同RGB颜色的光源的光谱功率:中间的是一个RGB激光投影器,底部则是D65标准光源。物体表面将会反射激光投影器中80%的光线,因为其反射曲线的波峰正好与激光的基色相匹配。但是物体只能反射20%来自D65光源的光线,因为在大多数波长下,材质的反射曲线都位于较低的位置。

我们上述例子中的材质可以认为是用于激光投影仪的屏幕。其在激光光源的波长段拥有较高的反射,同时在其他波长段的反射率则较低。因此,该材质能够反射大多数来自于激光的光线并吸收大多数其他光源的光线。如果我们使用RGB进行渲染,那么显然会造成各种错误。

但是上述例子只是我们为了便于大家理解所列举的特例。在实践中,大多数材质的光谱反射曲线都较为平滑,如下图所示。同时,大多数光源的光谱功率都类似于D65光源而不是上文中的激光投影仪。由于光源的SPD与物体表面的光谱反射都较为平滑,因此RGB渲染所造成的误差也较小。

在某些渲染应用中(例如,predictive rendering),上文中我们所提到的那些由RGB造成的微小误差将变得尤为重要。例如,在某个光源下,两种材质的光谱反射曲线所得到的结果是一样的,但是当位于另一种光源下时,其反射效果则完全不同。在我们进行车体修复的喷绘处理时,这些微小的误差将造成严重的问题。因此RGB渲染不适用于这一类的应用。

但是,对于大多数的渲染系统,尤其是那些可交互的应用,其目标并不是为了进行仿真,而RGB仍然能提供较好的效果。即使是电影行业的离线渲染,也只是在最近开始使用光谱渲染,而该技术也远远没有达到普及的程度。

本小节只是为大家略微讲解一些颜色科学的基础知识,主要希望大家能够理解光谱与颜色之间的联系以及硬件设备的一些限制。我们将在下一小节学习,渲染后场景的颜色转换为显示值。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据