RTR-Chapter9上

光的物理学

  在物理光学(physical optic)中,光被认为是一种电磁横波(electromagnetic transverse wave),它使得电场(electric field)和磁场(magnetic field)在其传播方向的垂直面上来回振荡。电场和磁场的振荡是耦合的,二者的矢量相互垂直,并且长度之比也是固定的,这个比值等于相位速度(phase velocity)。

  图9.1展示了一个简单的光波,事实上,这是最简单的一种,即一个完美的正弦函数。这个波只有一个波长(wavelength),使用希腊字母 λ \lambda λ进行表示。在章节8中我们提到,人眼所感知到的颜色,与光线的波长密切相关,因此,具有单一波长的光被称为单色光(monochromatic light)。然而在实践中所遇到的大多数光都是多色光(polychromatic light),即它们包含了许多不同的波长。

在这里插入图片描述

图9.1:光是一种电磁横波。电场和磁场的矢量垂直于光线的传播方向,并以90度夹角相互振荡。本图中所展示的是最简单的光波,它是单色光(仅有一个固定的波长λ),并且是线性偏振的(电场和磁场各自沿着一条直线进行振荡)。

  之所以我们说图9.1所展示的光波是简单的,是因为它是线性偏振(linearly polarized)的。这意味着对于空间中的一个不动点,电场和磁场都沿着一条直线来回运动;相比之下,在这本书中,我们所关注的是更加普遍的非偏振光(unpolarized light)。在非偏振光中,电场和磁场会在垂直于传播方向的所有方向上均匀分布。尽管这种单色的、线性偏振的光波是很简单的,但是理解它们的行为仍然十分有用,因为任何光波都可以被分解成这种简单波的组合。

  如果我们以一个给定的相位(例如偏振峰值),对波上的一个点进行追踪,我们将看到它会以一个恒定的速度在空间中进行移动,这就是波的相位速度(phase velocity)。对于真空中的光波而言,其相位速度为 c c c,通常被称为光速,大约是每秒30万公里。

  在章节8中,我们讨论了可见光的波长分布,单个波长的大小大约在400纳米-700纳米,这个长度大约是一根蜘蛛丝的一半到三分之一左右,而一根蜘蛛丝还不到人类头发直径的五分之一,如图9.2所示。在光学中,通常都会使用相对于波长的尺度来描述尺寸大小,例如:我们会说蜘蛛丝的宽度大约为 2 λ − 3 λ 2\lambda - 3\lambda 2λ3λ(即2-3倍的波长),头发的宽度为 100 λ − 200 λ 100\lambda - 200\lambda 100λ200λ

在这里插入图片描述

图9.2:左图展示了不同波长的可见光与一根蜘蛛丝,蜘蛛丝的长度略微超过1微米。右图是一根蜘蛛丝和一根人类头发的直径对比。

  光波会携带能量,这个能量流的强度等于电场强度和磁场强度的乘积,由于电场和磁场交替振荡,二者强度是成比例的,因此光线能量流的强度与电场强度的平方成正比。这里我们会关注电场,这是因为电场对物质的影响要比磁场大得多。在渲染中,我们关注的是随着时间变化的平均能量流,它与振幅的(amplitude)平方成正比,这个平均能量流的强度就是irradiance,通常使用字母 E E E来进行表示。我们在章节8中介绍了irradiance和其他光量的关系。

  光波会以线性的方式进行叠加,总体波是各个分量波之和。然而,由于irradiance和振幅的平方成正比,这似乎导致了一个悖论,例如:将两个相同的光波进行叠加,会不会导致irradiance“1+1=4”的情况?由于irradiance描述的是能量流,这会不会违反能量守恒能量?对于这两个问题,前者的答案是“有时会”,而后者的答案则是“不会”。

  为了对刚才的两个问题进行说明,我们来看看以下这个简单的例子:现在有 n n n个单色光要进行叠加,除了相位之外,其他的属性完全相同。这 n n n个波的振幅均为 a a a,使用 E 1 E_1 E1来表示每个波的irradiance, E 1 E_1 E1 a 2 a^2 a2成正比,也就是说, E 1 = k a 2 E_1=ka^2 E1=ka2,其中 k k k是常数。

  图9.3展示了三种不同的叠加情况。左图中,所有的波都具有相同的相位,叠加之后会相互加强,其irradiance是单个波的 n 2 n^2 n2倍,是 n n n个独立波irradiance之和的 n n n倍,这种情况被称为相长干涉(constructive interference)。在中间的图中,每一对波都处于相反的相位,两两相互抵消,叠加之后的振幅和irradiance均为0,这种情况被称为相消干涉(destructive interference)。

在这里插入图片描述

图9.3: n  n n个具有相同频率、相同偏振和相同振幅的单色光,它们以三种不同的方式进行叠加。从左到右分别是:相长干涉,相消干涉和不相干叠加。每种情况的下面都展示了对应组合波的振幅和irradiance。

  相长干涉和相消干涉是两种特殊的相干叠加(coherent addition),即波峰和波谷以一种一致的方式进行排列。根据相对相位关系的不同, n n n个相同波相干叠加生成的组合波,其irradiance为单个波的 0 − n 2 0-n^2 0n2倍。

  然而通常来说,波都是以不相干的的方式进行叠加的(incoherent addition),这意味着它们的相位都是相对随机的,如图9.3右侧所示。在这种情况下,组合波的振幅为 n a \sqrt{n}a n a,其irradiance等于 n n n个独立波的irradiance线性叠加,这正如我们所期望的那样。

  看起来相长干涉和相消干涉违反了能量守恒定律,但实际上并没有。这是因为图9.3并没有展示完整的情况——它仅仅展示了波在一个位置上的相互作用。当波在空间中进行传播的时候,它们之间的相位关系会发生变化,如图9.4所示。在某些位置上会发生相长干涉,组合波的irradiance会大于单个波irradiance之和;而在某些位置上则会发生相消干涉,组合波的irradiance会小于单个波irradiance之和。这并不违反能量守恒定律,因为通过相长干涉而获得的能量,与通过相消干涉而损失的能量是相等的。

在这里插入图片描述

图9.4:图中展示了两个单色光,它们以相同的频率从两个点源进行传播。两个波在空间的不同位置上,会发生相长干涉和相消干涉。

  当物体中的电荷发生振荡时,就会发出电磁波,而引起振荡的部分能量(热能、电能、化学能)会被转化为光能,然后从物体上辐射出去。在渲染中,这样的物体会被视为光源。

  当光波被发射出来之后,它们穿过空间,直到遇到一些可以相互作用的物质。大多数光与物质交互作用,其核心现象都很简单,与上面所讨论的发射情况非常类似。振荡的电场会推动和拉动物质中的电荷,使它们也依次发生振荡。振荡的电荷会发射出新的光波,这个过程会将入射光波的一些能量重新定向到新的方向。这个作用过程被称为散射(scattering),它是各种光学现象的基础。

  散射出的光波与原始光波具有相同的频率。通常情况下,当原始光波包含多个频率的光波时,每个频率的光波都会单独与物质发生作用。而对于某个频率的入射光,也不会对其他频率的散射光产生能量贡献,除了一些特定和相对罕见的情况之外,例如荧光(fluorescence)和磷光(phosphorescence),我们不会在本书中讨论这些情况。

  一个孤立的分子会使光波向着各个方向进行散射,并使光的强度发生一些方向性的变化。但是更多的光线还是会沿着接近原始传播轴的方向进行散射,包括向前的方向或者向后的方向。分子作为散射体(scatterer)的有效性(分子附近的光波被散射的可能性),会随着波长的变化而发生很大的改变。

  在渲染中,我们主要关心的是包含许多分子的集合,光线在与这些聚集体发生相互作用的时候,其结果可能会与孤立分子的情况有所不同。从附近分子散射出的光波通常是相干的,因此会相互干涉,因为它们大概率都具有相同的入射波。本小节的剩余部分将专门讨论若干种多分子散射的特殊情况。

粒子

  在理想气体(ideal gas)中,分子之间互不影响,即它们的相对位置是完全随机且不相关的,虽然这是一种抽象概念,但是对于标准大气压下的空气而言,这是一个相当好的模型。在这种情况下,从不同分子散射出的波,其相位差异是随机且不断变化的,因此这些散射波是不相干的,其能量呈线性叠加,如图9.3右侧所示。即从 n n n个分子散射出的总光能,是单分子散射的 n n n倍。

  相反,如果分子紧密地排列在比光波长小得多的团簇(cluster)中,那么每个团簇中的散射光波都是同相位的,即会发生相长干涉,如图9.3左侧所示。即从由 n n n个分子组成的团簇散射出的总光强,是单分子散射的 n 2 n^2 n2倍,也是相同数量分子在理想气体散射中的 n n n倍。这种关系意味着,对于一种密度恒定的物质,将分子聚集成团簇,将会显著增加散射光的强度。在保持整体分子密度不变的情况下,增加每个团簇的大小,将会进一步增加散射光的强度,直到团簇的直径接近光的波长,当超过这个临界值的时候,额外增加团簇的大小将并不会进一步增加散射光的强度。

  这个过程解释了为什么云和雾的散射光是如此强烈。因为这两种现象都是由冷凝(condensation)产生的,所谓冷凝,是指空气中的水分子聚集成越来越大的团簇的过程。这会显著增加光的散射,即使水分子的总体密度并没有发生变化。

  当我们在讨论光线散射的时候,粒子(particle)这个术语同时代表了孤立的分子与包含多个分子的团簇。由于直径小于波长的多分子粒子散射,是孤立分子散射的增强版本(由于相长干涉),因此它会表现出相同的方向性变化和波长依赖性。这种类型的散射在大气粒子中被称为瑞利散射(Rayleigh scattering),在固体中则被称为丁达尔散射(Tyndall scattering)。

  当粒子的大小超过光波长的时候,散射波在不再是同相的,这会改变散射的性质。散射光的方向越来越倾向于前向(即光波的原始传播方向),此时波长的依赖性会降低,直到所有的可见光波长都被均匀散射,这种类型的散射被称为米氏散射(Mie scattering)。

介质

  光在均匀介质(homogeneous medium)中进行传播是另一种重要的情况,均匀介质是指一个充满均匀分布的相同分子的空间。这里所说的均匀分布,并不是指分子间距要像晶体一样完全规则,如果液体和非晶体是纯净物(所有的分子都是相同的),并且没有间隙或者气泡的话,也可以认为它们在光学上是均匀的。

  在均匀介质中,散射波会整齐排列,除了沿着最初的传播方向之外,它们会在所有方向上都会产生相消干涉。当原始波与所有的单分子散射波结合之后,最终的结果与原始波基本相同,只有相位速度和振幅(在某些情况下)会有所不同。最后叠加的结果并不会表现出任何散射现象,因为散射现象已经被相消干涉有效抑制了。

  原始波和新波的相位速度之比,决定了介质的光学特性,这被称为折射率(index of refraction,IOR),通常使用字母 n n n来进行表示。有些介质是具有吸收性的(absorptive),它们会将部分光能转换为热量,这会导致光波的振幅随着距离呈指数级下降,这个下降率由衰减率(attenuation index)定义,使用希腊字母 κ ( k a p p a ) \kappa (kappa) κ(kappa)来进行表示。 n n n κ \kappa κ通常会随波长的变化而变化;这两个数字在一起,完整定义了一个介质会如何影响给定波长的光,它们通常被组合成一个复数 n + i κ n+i\kappa n+,称为复折射率(complex index of refraction)。折射率对分子级别上的光相互作用细节进行了抽象,使得介质可以被视为一个连续的空间体积,这大大简化了模型的复杂度。

  虽然光的相位速度并不会直接影响物体外观,但是相位速度的变化则会对外观产生影响,我们稍后会进行解释。另一方面,光的吸收会对视觉效果产生直接影响,因为它降低了光的强度,并且也可以改变光的颜色(如果波长发生变化的话)。图9.5展示了一些光线吸收的例子。

在这里插入图片描述

图9.5:四个装有不同吸收性质液体的小容器。从左到右分别是:纯净水,石榴汁,茶,咖啡。

  非均匀介质通常可以建模为嵌有散射粒子的均匀介质。相消干涉抑制了均匀介质中的散射现象,这是由分子的均匀排列所引起的;非均匀介质中的粒子排列并不均匀,从而会导致它们产生散射光波。分子分布中的任何局部变化,都将打破相消干涉的模式,从而允许散射光波进行传播;这种局部变化可以是一个不同分子类型的分子团,或者是气隙、气泡、密度变化等;在任何情况下,它都会像前面讨论的粒子那样,对光波进行散射,其散射性质同样取决于分子团的大小。即使是气体也可以这样进行建模,在气体情况下,“散射粒子”是由分子持续运动所引起的瞬态密度涨落(transient density fluctuation)。这个模型可以为气体建立一个具有意义的折射率 n n n,这有利于理解它们的光学性质。图9.6展示了几种光线散射的例子。

在这里插入图片描述

图9.6:从左到右分别是:水,加了几滴牛奶的水,加了大约10%牛奶的水,全脂牛奶,乳白色玻璃。大多数牛奶的散射粒子都要比可见光的波长大,因此它的散射主要是无色的,在中间的图像上有明显的淡蓝色。在最右侧图像中,乳白色玻璃中的散射粒子要比可见光的波长小,因此蓝光的散射强度要比红光强;同时由于明暗背景的分割,透射光在左边更加明显,而散射光则在右边更加明显。

  散射和吸收现象都与尺度有关。在小场景中不产生任何明显散射的介质,在较大的尺度上也可能会有相当明显的散射现象。例如:当在房间内观察一杯水时,光在空气中的散射与在水中的吸收是几乎不可见的;然而在一个较大尺度的环境中,这两种效果可能都会十分显著,如图9.7所示。

在这里插入图片描述

图9.7:左图中:在超过几米的范围内,水会对光产生强烈的吸收作用,尤其是红光,因此整体看起来会很蓝。右图中:光在没有严重空气污染或者雾的情况下,也会在数英里尺度的空气中发生散射。

  在一般情况下,介质的外观由散射作用和吸收作用的某种组合所决定,如图9.8所示。散射的程度决定了灰暗的程度,较高的散射会产生不透明的外观。除了一些比较罕见的情况之外(如图9.6中的乳白色玻璃),固体介质和液体介质中的粒子尺寸,往往大于光的波长,并且倾向于均匀散射所有可见波长的光,因此,物体的颜色通常都是由吸收作用的波长依赖性所引起的。而介质的亮度则是由光线散射和光线吸收这两种现象共同作用的结果。特别是白色,它是高散射和低吸收结合的结果。

在这里插入图片描述

图9.8:具有不同吸收作用和散射作用组合的液体容器。

表面

  从光学角度来看,物体的表面(surface)是一个二维界面,它分隔了具有不同折射率的空间体积。在一般的渲染情况下,由空气组成的外部空间,其折射率约为1.003,为简单起见,通常假设空气的折射率为1;而内部空间的折射率则取决于构成物体的物质。

  当光波遇到一个表面的时候,该表面的两个因素会对结果产生重要的影响:两侧的物质和表面的几何形状。我们先关注两侧物质所带来的影响,因此假设此时的表面几何形状是一个完美的平面。我们将“外部”(入射方向或者入射波产生的那一侧)折射率表示为 n 1 n_1 n1,将“内部”(光波通过该表面后将发生传播的一侧)折射率表示为 n 2 n_2 n2

  我们在之前提到过,当光波遇到材料组成不连续或者密度不连续的时候(即两个区域的折射率不同时),它们就会发生散射。分离不同折射率物体的平面,是一种特殊类型的不连续,它会以一种特定的方式来对光进行散射。这个平面边界要求平行于表面的电场分量是连续的,换句话说,表面两侧的电场矢量,到表面平面上的投影必须相匹配。这有以下几个含义:

  1. 在表面上的任何散射波,与入射波要么是同相位的,要么是 180 ° 180 \degree 180°反相位的。因此,在这个表面上的散射波,其峰值必须与入射波的峰值或者波谷相一致。这限制了散射波只能向两个可能的方向进行移动,一个继续向前进入表面,另一个则远离表面;前者被称为透射波(transmitted wave),后者被称为反射波(reflected wave)。
  2. 散射波和入射波具有相同的频率。这里我们假设的是一个单色波,但是这个原理可以应用于任何波,其对应的单色分量会具有相同的频率。
  3. 当光波从一个介质移动到另一个介质时,其相位速度(即波通过介质的速度)与相对折射率 ( n 1 / n 2 ) (n_1/n_2) (n1/n2)成比例变化。由于光波的频率是固定的,因此波长也与相对折射率 ( n 1 / n 2 ) (n_1/n_2) (n1/n2)成比例变化。

在这里插入图片描述

图9.9:一个光波撞击一个平面,平面两侧物质的折射率分别为 n 1 n_1 n1和 n 2 n_2 n2。左侧图展示了入射波的侧视图,这个入射波从左上角进入,红色的强度代表了波的相位。表面下方的波间距与( n 1 / n 2 n_1/n_2 n1/n2)成正比,本例中为0.5。相位沿着表面排列,因此间距的变化会弯曲(折射)透射波的方向。图中三角形的构造展示了Snell定律的推导过程。为了清晰起见,右上方的图显示了反射波的情况,它与入射波具有相同的波间距,因此其方向与表面法线具有相同的夹角。右下方展示了入射波、透射波和反射波方向的矢量图。

  最终结果如图9.9所示。反射波和入射波的方向,与表面法线之间具有相同的夹角 θ i \theta_i θi;透射波的方向会以 θ t \theta_t θt的角度进行弯曲(折射),它与 θ i \theta_{i} θi的关系如下:

sin ⁡ ( θ t ) = n 1 n 2 sin ⁡ ( θ i ) . (9.1) \sin \left(\theta_{t}\right)=\frac{n_{1}}{n_{2}} \sin \left(\theta_{i}\right). \tag{9.1} sin(θt)=n2n1sin(θi).(9.1)

  这个折射方程被称为Snell定律(折射定律),它被用于全局折射效应。

  虽然折射现象通常会与玻璃、晶体等透明材质联系在一起,但是它也会发生在不透明物体的表面上;当不透明物体发生折射时,光会在物体的内部进行散射和吸收。光会与物体的介质相互作用,就像图9.8中的装有各种液体的容器一样。对于金属而言,其内部包含了许多自由电子(不与分子结合的电子),它们会“吸收”折射光的能量,并将其重定向到反射波中,这就是为什么金属会具有较高的吸收率和较高的反射率的原因。

  我们刚才所讨论的表面折射现象(反射和折射),需要折射率在小于单一波长的距离上发生突变。而折射率的逐渐变化并不会对光进行散射,而是会导致光路发生弯曲,就像折射时出现的不连续弯曲一样;当空气密度因温度不同而发生变化的时候,可以看到这种效应,例如海市蜃楼(mirage)和热变形(heat distortion,也叫做热浪),如图9.10所示。

在这里插入图片描述

图9.10:一个由于折射率逐渐变化而导致光路弯曲的例子,图中所展示的情况是由温度变化引起的。

  即使是一个具有明确边界的物体,如果它被浸没在一个具有相同折射率的物质中,那么也将没有可见的表面。因为在没有折射率变化的情况下,就不会发生反射现象和折射现象。图9.11展示了这样的一个例子。

在这里插入图片描述

图9.11:玻璃杯里有很多装饰珠子,它的折射率与水的折射率是一样的。在水面以上,由于珠子的折射率与空气的折射率不同,因此有一个明显可见的表面。在水面以下,由于珠子表面两侧的折射率是相同的,因此这些表面是不可见的。由于这些珠子会吸收特定波长的光,因此我们能够看到这些珠子本身,并且它们会表现出不同的颜色。

  到目前为止,我们一直关注的都是表面两侧的物质对光的影响,现在我们将讨论影响表面外观的另一个重要因素:几何形状。严格地说,一个完美平坦的平面表面是不可能存在的,每个表面都具有某种程度的不规则性,即使该表面只由单个原子组成。然而,比波长小得多的不规则表面,对光的行为没有影响;而比波长大得多的不规则表面,虽然会使这个表面在宏观上看起来变得倾斜,但是并不会影响其微观局部的平坦性。只有位于1-100个波长范围内的不规则表面,才会导致这个表面与平面具有不同的外观表现,这种现象被称为衍射现象(diffraction)。

  在渲染中,我们通常会基于几何光学(geometrical optics),它忽略了光作为一种波所产生的效应,例如干涉和衍射。这相当于假设所有表面的不规则性,要么小于光的波长,要么比光的波长大得多(100倍以上)。在几何光学中,光会被建模为一条射线,而不是一种波,当一条射线与表面相交时,相交点的局部区域会被视为一个平面。图9.9右下角的图像,可以看作是反射现象和折射现象的几何光学表示;而图9.9其他部分所展示的,是光作为一种波所发生的现象。

  正如我们前面所提到的,比波长大得多的表面不规则性,会改变表面的局部朝向。当这些不规则性太小以致于无法进行渲染的时候(小于一个像素),我们则将其称为微观几何图形(microgeometry,微表面);表面的反射方向和折射方向取决于该表面的法线,而这些微表面会改变表面上不同点处的法线,从而改变光线的反射方向和折射方向。

  虽然不规则表面上的每个点,都只会在一个方向上反射光线,但是屏幕上的每个像素都覆盖了许多的表面点,这些点会在不同方向上反射光线,因此这个表面的外观,是由所有不同反射方向的光线的聚合结果所决定的。图9.12展示了两个在宏观尺度上具有相似形状,但是微观几何形状显著不同的表面,其外观也具有明显的差异。

在这里插入图片描述

图9.12:左侧展示了两个表面的照片,右侧使用示意图的形式,展示了它们所对应的微观几何结构。上方的表面拥有略微粗糙的微观几何形状,入射光线击中了表面上不同的点,每个点的法线方向略有差异,并在一个狭窄的锥形方向上被反射,其宏观效果是具有轻微模糊的反射。下方表面具有更加粗糙的微观几何形状,入射光线照射到的表面点,具有明显不同的法线方向,反射光线会以一个较宽的锥体进行扩散,从而导致宏观的反射效果变得更加模糊。

  在渲染中,我们并不会对微观几何形状进行明确的建模,而是会以一种统计的方式对其进行处理,将该表面视为一个具有微观结构法线的随机分布。因此,我们将表面建模为,会在一个连续方向上,对光线进行反射和折射。其中这个连续方向的宽度(锥形范围的大小,或者是立体角的大小),以及反射细节和折射细节的模糊程度,取决于微观几何法线的统计方差,即表面微尺度的粗糙度(roughness),如图9.13所示。

在这里插入图片描述

图9.13:从宏观上看,表面可以被视为在多个方向上,对光线进行反射和折射。

次表面散射

  进入物体内部的折射光线,会继续与内部物质发生相互作用。前面我们提到,金属具有较高的吸收率和较高的反射率,即金属表面会反射大部分的入射光线,进入金属内部的折射光线也会被迅速吸收;相比之下,非金属物体则会表现出广泛的散射行为和吸收行为,这与我们在图9.8中所看到的液体容器类似。透明材料具有低散射和低吸收的特性,进入物体内部的任何折射光线,最终都会从物体中折射出来。我们在章节5中讨论过一些简单的透明物体渲染方法。在本小节中,我们将重点关注不透明的物体,在这些物体中,透射光线在经历多次散射和吸收之后,最终有一部分会从表面重新发射出来,并被人眼观察到,如图9.14所示。

在这里插入图片描述

图9.14:折射光线在穿过物体时会被吸收。在这个例子中,大部分被吸收的都是波长较长的光线,留下的主要是波长较短的蓝光。另外,光线还会在物体内部的粒子中发生散射,最终有一些折射光线会散射出表面,例如图中以不同方向离开表面的蓝色箭头。

  这种次表面散射(subsurface scatter)的光线,会以相对于入射点的不同距离从表面射出,这个进出距离(entry-exit distances)的分布取决于材料中散射粒子的密度和性质,这些距离与着色尺度(像素的大小,以及着色样本之间的距离)之间的关系是很重要的。如果这个进出距离比着色尺度要小,那么可以假定它们为零,这样我们就可以将次表面散射与表面反射整合到同一个局部着色模型中,即某个着色点上的出射光线,只依赖于该点的入射光线。由于次表面散射与表面反射具有明显不同的外观表现,因此可以很容易地将它们划分为单独的着色选项,使用镜面项(specular term)控制表面反射现象,使用漫反射项(diffuse term)控制局部次表面散射(local subsurface scattering)现象。

  如果这个进出距离比着色尺度要大,那么就需要专门的渲染技术,来表现光线在某一点进入表面,并从另一点离开表面的视觉效果。局部次表面散射和全局次表面散射之间的差异如图9.15所示。

在这里插入图片描述

图9.15:左图中,我们渲染了一个具有次表面散射的材质,图中的黄色圆圈和紫色圆圈代表了两种不同大小的采样区域。其中黄色圆圈代表了单个着色样本所覆盖的区域,大于次表面散射的距离,因此我们可以在渲染中忽略这些距离所带来的影响,并在局部着色模型中将次表面散射项视为漫反射项,如右图所示。如果我们向着靠近表面的方向进行移动,单个着色样本所覆盖的区域会变小,如左图中的紫色圆圈,与着色样本所覆盖的区域相比,此时次表面散射的距离很大,无法忽视这些距离所带来的影响,因此需要使用全局的着色模型和光照技术,来从这些着色样本中生成逼真的图像。

  值得注意的是,局部次表面散射技术和全局次表面散射技术模拟的是完全相同的物理现象。每种情况下的最佳选择(即到底使用哪种模型和技术),不仅取决于材质的属性,还取决于观察的尺度。例如:当渲染一个孩子在玩塑料玩具的场景时,我们很可能需要使用全局次表面散射技术来准确地渲染孩子的皮肤,而对于塑料玩具而言,可能一个局部的漫反射着色模型就足够了。这是因为皮肤中的散射距离,要比在塑料中的散射距离大得多,但是如果相机足够远的话,皮肤的散射距离也可能会小于一个像素,此时局部的着色模型对于儿童和玩具而言都是十分准确的。相反,在一个极端的特写镜头中,塑料也可能会表现出明显的非局部次表面散射现象,这时候就需要全局次表面散射技术来对玩具进行准确地渲染。

相机

  如章节8所述,在渲染的时候,我们会计算从表面着色点到相机位置的radiance。这模拟了一个简化了的成像系统,例如胶片相机、数码相机或者人眼。

  这类成像系统中,包含了一个由许多离散小传感器组成的传感器表面。例如:眼睛中的视杆细胞和视锥细胞、数码相机中的光电二极管(photodiode)、或者胶片中的染料颗粒,这些传感器可以检测到其表面上的irradiance,并生成一个颜色信号。这些irradiance传感器本身并不能产生图像,因为它们对来自所有入射方向的光线都进行了平均处理。因此,完整的成像系统还应当包括一个具有小孔(aperture,光圈)的不透光外壳,它对光线进入和撞击传感器的方向进行了限制;放置在光圈处的透镜会将光线进行聚焦,这样每个传感器就只能接收来自一小部分入射方向的光线(小孔成像原理)。外壳、光圈和透镜的综合作用,使得这些传感器具有了特定的方向性(directionally specific),即只会对分布在一小块区域和一小组入射方向上的光线进行平均。正如我们在章节8中所看到的,这些传感器量化了来自各个方向光流的表面密度,即测量了平均radiance,而不是测量平均irradiance;换句话说,传感器量化记录了单条光线的亮度和颜色。

在这里插入图片描述

图9.16:每个相机成像模型中都包含了一个像素传感器阵列。图中的每根实线,都代表了传感器从场景中收集到的一组光线。每个子图中的窗口图像,展示了像素传感器上的单点样本所收集的光线。第一行图片展示了一个针孔相机模型;第二行图片展示了一个典型的渲染系统模型,即一个带有相机点 c  c c的针孔相机;第三行图片展示了一个更加物理正确的镜头相机,其焦点位于红色球体上,另外两个球体并不在焦点上。

  在历史上,渲染模拟了一种特别简单的成像传感器,它被称为针孔相机(pinhole camera),如图9.16的第一行所示。针孔相机没有镜头,并且具有一个非常小的光圈(在理想的情况下,它是一个没有大小的数学抽象点)。这个小光圈对传感器进行了限制,即传感器表面上的每个点都只能收集一束光线,而一个单独传感器中包含了若干个这样的点,也就是说,每个小传感器都会收集一个锥形区域内的光线,这个圆锥的底(base)覆盖了传感器的表面,圆锥的顶点(apex)位于光圈处。图形渲染系统以一种略有不同(但是是等价的)的方式,对针孔相机进行了建模,如图9.16的第二行所示。针孔光圈的位置用点 c c c进行表示,通常被称为“相机位置”或者“眼睛位置”。这个点也是透视变换的投影中心。

  在渲染时,每个着色样本都对应了一条光线,即对应于传感器表面上的一个采样点。而抗锯齿的过程则可以理解为,对每个离散传感器表面收集到的信号进行重建。然而,由于图形渲染并不会受到物理传感器的限制,因此我们可以对这个过程进行更加一般化的处理,即从离散的着色样本中,重建出连续的图像信号。

  虽然真正的针孔相机可以很容易地制造出来,但是对于大多数实践中所使用的相机,以及人眼来说,针孔相机都是一个糟糕的模型,其实用价值并不高。图9.16第三行展示了一个使用镜头的成像系统模型,这个模型中包含了一个镜头,这允许相机使用一个更大的光圈,大大增加了成像传感器所收集的光量。但是它也会导致相机的景深(depth of field)是有限的,太近或者太远的物体都会被模糊(大光圈的时候,景深效果尤其明显)。

  镜头除了会限制景深之外,还有一些其他的影响。传感器上的每个点(包括完美聚焦的点)都会接收一个锥形区域内的光线;而在理想化的模型中,每个着色样本都只会对应唯一的观察射线,这样处理有时候会引入数学奇异点(即无法定义的点)、数值不稳定性或者视觉瑕疵;当我们在渲染图像的时候,将真实的物理模型牢记于心,有助于我们识别和解决这些问题。

The BRDF

  最终,基于物理的渲染可以归结为沿着一组观察射线,计算进入相机的radiance。这里我们使用章节8中所介绍的入射radiance的符号表示,对于一个给定的观察射线,我们需要计算的是 L i ( c , − v ) L_{i}(\mathbf{c},-\mathbf{v}) Li(c,v),其中 c \mathbf{c} c是相机的位置, − v -\mathbf{v} v是沿着观察射线的方向。这里我们使用 − v -\mathbf{v} v是由于两个符号约定:第一, L i ( ) L_{i}() Li()中的方向向量,总是指向远离给定点的方向,在这里就是指向远离相机位置的方向。第二,观察向量 v \mathbf{v} v总是会指向相机。

  在渲染中,场景通常会被建模为彼此之间具有介质的物体集合(“介质”一词实际上来自于拉丁语,它的意思是“在中间”)。通常我们所讨论的介质是适量且相对干净的空气,它并不会对光线的radiance产生明显地影响,因此在渲染中可以被忽略。但是有时候,光线所穿过的介质会通过吸收或者散射等方式,对光线的radiance产生明显影响,这样的介质被称为参与介质(participating media),因为它们参与了光线在场景中的传播过程。在本章节中,我们暂时假设没有参与介质的存在,因此进入相机的radiance,与其观察方向上离开最近物体表面的radiance是相等的,即:

L i ( c , − v ) = L o ( p , v ) (9.2) L_{i}(\mathbf{c},-\mathbf{v})=L_{o}(\mathbf{p}, \mathbf{v}) \tag{9.2} Li(c,v)=Lo(p,v)(9.2)

  其中, p \mathbf{p} p是观察射线与最近物体表面的交点。

  根据方程9.2,我们的新目标是计算 L o ( p , v ) L_{o}(\mathbf{p}, \mathbf{v}) Lo(p,v)。我们在章节5中曾讨论过简单的着色模型,而这里的计算过程则是其物理版本。有时候一些表面也会直接发出radiance,但是更加常见的情况是,离开这个表面的radiance来自于其他地方,并通过章节9中所描述的物理作用,最终被反射到相机中。在本章节中,我们将不考虑透明物体和全局次表面散射的情况;换句话说,我们所关注的是局部反射现象,它将照射到当前着色点的光线,重新发射回外部,这些现象包括表面反射以及局部次表面散射,它们只依赖于入射光方向 l \mathbf{l} l和指向外部的观察方向 v \mathbf{v} v。双向反射分布函数(bidirectional reflectance distribution function,BRDF)描述了着色点表面的局部反射系数,记为 f ( l , v ) f(\mathbf{l}, \mathbf{v}) f(l,v)

  在原始推导中,BRDF是针对均匀表面进行定义的。也就是说,我们会假设表面上各处的BRDF都是相同的。然而,对于现实世界中的物体(以及渲染场景中的物体)而言,很少会有表面具有完全相同的材质属性。即使是由单一材料组成的物体(例如银质雕像),其表面上也会有划痕、暗斑、污渍或者其他的一些变化,从而导致两个不同的着色点具有不同的视觉特性。从技术上来讲,根据空间位置捕获BRDF变化的函数,被称为空间变化的BRDF(spatially varying BRDF,SVBRDF)或者空间BRDF(spatial BRDF,SBRDF)。然而,这种情况在实践中非常普遍,因此通常还是会使用BRDF这个较短的术语来进行描述,我们会默认假定BRDF与表面位置有关。

  光线的入射方向和出射方向各有两个自由度。一种常用的参数化表示包括两个角度:相对于表面法线 n \mathbf{n} n的仰角 θ \theta θ,以及相对于表面法线 n \mathbf{n} n的方位角(即水平旋转) ϕ \phi ϕ。在一般情况下,BRDF是一个包含四个标量变量的函数。各向同性(Isotropic)BRDF是一个重要的特例,当光线入射方向和出射方向围绕表面法线 n \mathbf{n} n旋转的时候,各项同性BRDF会保持不变,并保持它们之间的相对角度不变。图9.17展示了这两种情况下所使用的输入变量。各向同性BRDF是一个包含三个标量变量的函数,因为我们只需要光线绕表面法线 n \mathbf{n} n的旋转角度,或者相机的旋转角度 ϕ \phi ϕ即可。也就是说,如果将一个具有均匀各向同性材质的物体放置在转盘上,并旋转它的话,在给定的光线和相机条件下,这个物体表面在所有旋转角度上看起来都是相同的。

在这里插入图片描述

图9.17:BRDF输入参数。方位角 ϕ i ϕ_i ϕi ϕ o ϕ_o ϕo都是相对于给定切向量 t t t定义的。而在各向同性BRDF中,我们只需要考虑相对方位角 ϕ ϕ ϕ即可,不需要考虑参考切向量与 ϕ i ϕ_i ϕi、 ϕ o ϕ_o ϕo 。

  由于我们忽略了荧光(fluorescence)和磷光(phosphorescence)等现象,因此我们可以假设,给定波长的入射光会以相同的波长被反射出来。反射光的光量会根据其波长发生变化,可以使用以下两种方法来进行模拟:第一种是将波长视为BRDF的额外输入变量;第二种则是将BRDF视为会返回一个光谱分布的值。虽然第一种方法有时会用于离线渲染,但是在实时渲染中,总是会使用第二种方法。由于实时渲染器一般将光谱分布表示为一个RGB三元组,这意味着BRDF会返回一个RGB值。

  为了计算着色点的出射光线 L o ( p , v ) L_{o}(\mathbf{p}, \mathbf{v}) Lo(p,v),我们将BRDF项合并到反射方程(reflectance equation)中:

L o ( p , v ) = ∫ l ∈ Ω f ( l , v ) L i ( p , l ) ( n ⋅ l ) d l (9.3) L_{o}(\mathbf{p}, \mathbf{v})=\int_{\mathbf{l} \in \Omega} f(\mathbf{l}, \mathbf{v}) L_{i}(\mathbf{p}, \mathbf{l})(\mathbf{n} \cdot \mathbf{l}) d \mathbf{l} \tag{9.3} Lo(p,v)=lΩf(l,v)Li(p,l)(nl)dl(9.3)

  积分符号的下标 l ∈ Ω \mathbf{l} \in \Omega lΩ意味着是,我们对位于表面单位半球(以着色点为球心,以表面法线 n \mathbf{n} n为半球方向)上的入射光方向 l \mathbf{l} l进行积分。请注意,入射光方向 l \mathbf{l} l会在半球范围内进行连续扫描,也就是说,它并不是某个特定的“光线方向”。这个想法的核心是:来自任何入射方向的光线,都会(通常会)产生一些radiance。我们用 d l d\mathbf{l} dl来表示入射光方向 l \mathbf{l} l周围单位立体角的微分。

  总而言之,反射方程表明,出射的radiance等于入射radiance乘以BRDF项,再乘以表面法线 n \mathbf{n} n和入射光方向 l \mathbf{l} l点积的积分(其中入射光方向 l \mathbf{l} l来自半球范围 Ω \Omega Ω)。

  为了简化表述,在本章节的剩余部分中,我们将从 L i ( ) L_i() Li() L o ( ) L_o() Lo()和反射方程中省略表面着色点 p \mathbf{p} p,即:

L o ( v ) = ∫ l ∈ Ω f ( l , v ) L i ( l ) ( n ⋅ l ) d l (9.4) L_{o}(\mathbf{v})=\int_{\mathbf{l} \in \Omega} f(\mathbf{l}, \mathbf{v}) L_{i}(\mathbf{l})(\mathbf{n} \cdot \mathbf{l}) d \mathbf{l} \tag{9.4} Lo(v)=lΩf(l,v)Li(l)(nl)dl(9.4)

  在计算反射方程的时候,通常会使用球坐标 ϕ \phi ϕ θ \theta θ来对半球进行参数化。在这个参数化表示下,微分立体角 d l d\mathbf{l} dl就等于 sin ⁡ θ i d θ i d ϕ i \sin \theta_{i} d \theta_{i} d \phi_{i} sinθidθidϕi。利用这种球坐标系参数化,我们可以推导出方程9.4的二重积分形式:

L o ( θ o , ϕ o ) = ∫ ϕ i = 0 2 π ∫ θ i = 0 π / 2 f ( θ i , ϕ i , θ o , ϕ o ) L ( θ i , ϕ i ) cos ⁡ θ i sin ⁡ θ i d θ i d ϕ i (9.5) L_{o}\left(\theta_{o}, \phi_{o}\right)=\int_{\phi_{i}=0}^{2 \pi} \int_{\theta_{i}=0}^{\pi / 2} f\left(\theta_{i}, \phi_{i}, \theta_{o}, \phi_{o}\right) L\left(\theta_{i}, \phi_{i}\right) \cos \theta_{i} \sin \theta_{i} d \theta_{i} d \phi_{i} \tag{9.5} Lo(θo,ϕo)=ϕi=02πθi=0π/2f(θi,ϕi,θo,ϕo)L(θi,ϕi)cosθisinθidθidϕi(9.5)

  回顾一下,方程9.4中的 ( n ⋅ l ) = cos ⁡ θ i (\mathbf{n} \cdot \mathbf{l}) = \cos \theta_i (nl)=cosθi,有关 θ i , ϕ i , θ o , ϕ o \theta_{i}, \phi_{i}, \theta_{o}, \phi_{o} θi,ϕi,θo,ϕo的几何意义如图9.17所示。

  在某些情况下,我们使用一些稍微不同的参数化表示会变得更加方便,即使用仰角的余弦值 μ i = cos ⁡ θ i , μ o = cos ⁡ θ o \mu_{i}=\cos \theta_{i} , \mu_{o}=\cos \theta_{o} μi=cosθi,μo=cosθo,而不是仰角本身 θ i , θ o \theta_{i}, \theta_{o} θi,θo。对于这种参数化表示,微分立体角 d l d\mathbf{l} dl就等于 d μ i d ϕ i d \mu_{i} d \phi_{i} dμidϕi。使用 ( μ , ϕ ) (\mu,\phi) (μ,ϕ)这种参数化,表示可推导出以下的积分形式:

L o ( μ o , ϕ o ) = ∫ ϕ i = 0 2 π ∫ μ i = 0 1 f ( μ i , ϕ i , μ o , ϕ o ) L ( μ i , ϕ i ) μ i d μ i d ϕ i (9.6) L_{o}\left(\mu_{o}, \phi_{o}\right)=\int_{\phi_{i}=0}^{2 \pi} \int_{\mu_{i}=0}^{1} f\left(\mu_{i}, \phi_{i}, \mu_{o}, \phi_{o}\right) L\left(\mu_{i}, \phi_{i}\right) \mu_{i} d \mu_{i} d \phi_{i} \tag{9.6} Lo(μo,ϕo)=ϕi=02πμi=01f(μi,ϕi,μo,ϕo)L(μi,ϕi)μidμidϕi(9.6)

  BRDF仅在光线方向和观察方向都位于表面上方时才有定义。对于光线方向在表面下方的情况,可以通过将BRDF乘以零,或者首先不计算这些方向的BRDF来避免这种情况。但是对表面下方的观察方向呢?换句话说就是,当点积 n ⋅ v \mathbf{n} \cdot \mathbf{v} nv为负的时候会发生什么情况?从理论上来说,这种情况永远都不会发生,因为此时表面是背对相机的,是不可见的。然而,在实时应用中十分常见的顶点法线插值和法线映射等操作,会在实践中产生这样的情况。可以将 n ⋅ v \mathbf{n} \cdot \mathbf{v} nv的值限制到0,或者使用 n ⋅ v \mathbf{n} \cdot \mathbf{v} nv的绝对值,来避免BRDF对表面下方的观察方向进行计算,但是这两种方法都会产生一些瑕疵。寒霜引擎使用 n ⋅ v \mathbf{n} \cdot \mathbf{v} nv的绝对值再加上一个很小的数字(0.0001),来避免发生除以0的情况。另一种可能的方法是“soft clamp”,这意味着随着 n , v \mathbf{n} ,\mathbf{v} n,v之间的夹角超过 9 0 ∘ 90^{\circ} 90时, n ⋅ v \mathbf{n} \cdot \mathbf{v} nv的值会逐渐趋于0。

  物理定律对任何的BRDF都有两个约束。第一个约束是Helmholtz互易性(Helmholtz reciprocity),这意味着交换入射角和出射角后,其函数值相同,即:

f ( l , v ) = f ( v , l ) (9.7) f(\mathbf{l}, \mathbf{v})=f(\mathbf{v}, \mathbf{l}) \tag{9.7} f(l,v)=f(v,l)(9.7)

  在实践中,用于渲染的BRDF经常会违反Helmholtz互易性,而且并不会出现明显的瑕疵,除非是一些特别需要Helmholtz互易性的离线渲染算法,例如双向路径跟踪(bidirectional path tracing)。然而,当在确定某种BRDF在物理上是否可信时,Helmholtz互易性是一个有效的鉴别工具。

  第二个约束是能量守恒(conservation of energy)——即出射的能量不能大于入射的能量(这里不包含自发光表面,它将作为一个特殊情况进行处理)。离线渲染算法(例如path tracing)需要能量守恒来保证收敛性;而对于实时渲染来说,我们并不需要严格保证能量守恒,但是近似的能量守恒还是很重要的。使用一个明显违背能量守恒的BRDF对表面进行渲染,它会看起来过亮,不太真实。

  定向半球反射率(directional-hemispherical reflectance) R ( l ) R(\mathbf{l}) R(l)是一个与BRDF有关的函数,它可以用来衡量BRDF的能量守恒程度。尽管它的名字有点令人生畏,但是定向半球反射率实际上是一个很简单的概念。对于一个给定方向的入射光线, R ( l ) R(\mathbf{l}) R(l)测量了这个入射光线被反射到半球方向内的数量。本质上, R ( l ) R(\mathbf{l}) R(l)测量了给定入射方向上的能量损失。这个函数的输入是入射方向 l \mathbf{l} l R ( l ) R(\mathbf{l}) R(l)的定义如下:

R ( l ) = ∫ v ∈ Ω f ( l , v ) ( n ⋅ v ) d v (9.8) R(\mathbf{l})=\int_{\mathbf{v} \in \Omega} f(\mathbf{l}, \mathbf{v})(\mathbf{n} \cdot \mathbf{v}) d \mathbf{v} \tag{9.8} R(l)=vΩf(l,v)(nv)dv(9.8)

  需要注意的是,这里的观察方向 v \mathbf{v} v,就像反射方程中的入射光方向 l \mathbf{l} l一样,它扫过了整个半球范围,并不是代表单一的观察方向。

  还有一个与 R ( l ) R(\mathbf{l}) R(l)类似,但是某种意义上相反的函数——半球定向反射率 R ( v ) R(\mathbf{v}) R(v)(hemispherical-directional reflectance),其定义与 R ( l ) R(\mathbf{l}) R(l)类似:

R ( v ) = ∫ l ∈ Ω f ( l , v ) ( n ⋅ l ) d l (9.9) R(\mathbf{v})=\int_{\mathbf{l} \in \Omega} f(\mathbf{l}, \mathbf{v})(\mathbf{n} \cdot \mathbf{l}) d \mathbf{l} \tag{9.9} R(v)=lΩf(l,v)(nl)dl(9.9)

  如果BRDF满足互易性的话(即交换入射方向和出射方向,结果不变),那么半球定向反射率和定向半球反射率实际上是相等的,可以使用同一个函数来计算其中的任意一个。在二者可以交换使用的时候,可以使用定向反照率(directional albedo)这个术语来作为两个反射率的统称。

  由于能量守恒,因此定向半球反射率 R ( l ) R(\mathbf{l}) R(l)的值必须始终在 [ 0 , 1 ] [0,1] [0,1]范围内。反射率为0代表着所有的入射光线都被吸收,或者以其他方式丢失;反射率为1代表着所有的入射光线都会被反射。在大多数情况下, R ( l ) R(\mathbf{l}) R(l)的值将介于这二者之间。与BRDF一样, R ( l ) R(\mathbf{l}) R(l)的值也会随着波长的变化而变化,因此 R ( l ) R(\mathbf{l}) R(l)被表示为一个RGB向量,以便用于渲染。由于RGB的每个分量(红、绿、蓝)都被限制在 [ 0 , 1 ] [0,1] [0,1]的范围内,因此 R ( l ) R(\mathbf{l}) R(l)也可以被认为是一个颜色。需要注意的是,这个约束不适用于BRDF。BRDF作为一个分布函数,如果其描述的分布高度是不均匀的话,那么它在某些方向上,可以具有任意高的值(例如高光中心)。对BRDF能量守恒的要求是,对于所有可能的入射方向 l \mathbf{l} l R ( l ) R(\mathbf{l}) R(l)都不大于1。

  最简单的BRDF是Lambertian,它对应于章节5中简要讨论的Lambertian着色模型。Lambertian BRDF具有一个恒定值,著名的、用于区分Lambertian着色模型的 ( n ⋅ l ) (\mathbf{n} \cdot \mathbf{l}) (nl)项并不是BRDF的一部分,而是方程9.4的一部分。尽管Lambertian BRDF很简单,但是它经常用于实时渲染中,以表示局部次表面散射(尽管它正在被更加精确的模型所取代)。Lambertian表面的定向半球反射率也是一个常数,将方程9.8中 f ( l , v ) f(\mathbf{l}, \mathbf{v}) f(l,v)项作为一个常数,可以计算得到定向半球反射率 R ( l ) R(\mathbf{l}) R(l),并将其作为BRDF:

R ( l ) = π f ( l , v ) (9.10) R(\mathbf{l})=\pi f(\mathbf{l}, \mathbf{v}) \tag{9.10} R(l)=πf(l,v)(9.10)

  Lambertian BRDF的恒定反射率通常被称为漫反射颜色(diffuse) c d i f f c_{diff} cdiff,或者反照率(albedo) ρ \rho ρ。在本章节中,为了强调它与次表面散射现象的联系,我们将这个量称为次表面反照率(subsurface albedo) ρ s s \rho_{ss} ρss。由方程9.10得到的BRDF可以推导出如下结果:

f ( l , v ) = ρ s s π (9.11) f(\mathbf{l}, \mathbf{v})=\frac{\rho_{\mathrm{ss}}}{\pi} \tag{9.11} f(l,v)=πρss(9.11)

  其中包含了 1 / π 1/\pi 1/π项,这是因为对余弦项在整个半球范围内进行积分的结果是 π \pi π,这些项经常出现在BRDF中。

  理解BRDF的一种方法是保持输入方向不变,将其可视化,如图9.18所示。对于给定的入射光方向,会在所有出射方向上展示BRDF的值。围绕着色点的半球部分对应了漫反射分量,因为radiance会在半球范围内被均匀反射。其中的椭球片对应了镜面波瓣(specular lobe),这个波瓣代表了入射光线的出射方向,波瓣的厚度、大小与反射的模糊程度相对应。根据互易性原则,这些BRDF的可视化也可以被认为是不同入射方向对单个出射方向的贡献大小。

在这里插入图片描述

图9.18:BRDF的一些例子。图中右侧的绿色实线代表了入射光线的方向,中间的白色实线代表了表面法线,绿色虚线代表了理想状态下的反射方向。在第一行中,左侧展示了一个Lambertian BRDF(一个简单半球);中间展示了在Lambertian项中添加了Blinn-Phong高光的结果;右侧展示了Cook-Torrance BRDF ,值得注意的是,镜面高光并不是最强的反射方向。在第二行中,左侧是Ward各向异性模型的特写,在这种情况下,反射方向是一个倾斜的镜面波瓣;中间展示了Hapke/Lommel-Seeliger“月面(lunar surface)”BRDF,它具有强烈的后反射;右侧展示了 Lommel-Seeliger散射,尘埃表面会将光线散射到掠射角上(grazing angle)。

光照

  反射方程(方程9.4)中的 L i ( l ) L_i(\mathbf{l}) Li(l)项(入射radiance),代表了从场景其他部分照射到着色点表面的光线。全局光照(global illumination)算法通过模拟光线在场景中的传播和反射,来计算这个 L i ( l ) L_i(\mathbf{l}) Li(l)项,这些算法会使用到渲染方程(rendering equation),其中反射方程就是渲染方程的一个特殊例子。我们将关注局部光照(local illumination),它使用反射方程来计算每个表面点的局部着色情况。在这些局部光照算法中, L i ( l ) L_i(\mathbf{l}) Li(l)项是默认已知的,因此不需要进行计算。

  在现实场景中, L i ( l ) L_i(\mathbf{l}) Li(l)包括了来自各个方向的非零radiance,无论这些radiance是直接从光源发射出的,还是从其他表面反射出的。与章节5中所讨论的方向光和精确光源不同,现实世界的光源一个是覆盖了非零立体角的面光源(area light)。在本章节中,我们将假定使用有限形式的 L i ( l ) L_i(\mathbf{l}) Li(l),它仅由方向光和精确光源组成。有了这个限制前提,可以使得本章节的讨论更加集中有效。

  虽然方向光和精确光源都是非物理的抽象光源,但是它们可以作为对物理光源的近似。这样的推导其实是很重要的,因为这样做我们可以将这些光源合并到一个基于物理的渲染框架中,同时能够把握近似所带来的误差。

  假设现在我们取一个很小的、很远的面光源,并定义向量 l c \mathbf{l}_{c} lc指向该面光源的几何中心;同时,我们将该面光源的颜色 c l i g h t \mathbf{c}_{light} clight定义为:从正对( n = l c \mathbf{n}=\mathbf{l}_{c} n=lc)该光源的白色Lambertian表面所反射出的radiance。这是一个很直观的定义,因为光线的颜色直接对应了它所产生的视觉效果。

  有了以上这些定义,我们可以推导出方向光的一种极限情况:即在保持光源颜色 c l i g h t \mathbf{c}_{light} clight不变的情况下,将面光源的大小缩小到零。在这种情况下,反射方程(方程9.4)中的积分可以简化为一个BRDF计算,这个计算成本要低得多:

L o ( v ) = π f ( l c , v ) c light  ( n ⋅ l c ) (9.12) L_{o}(\mathbf{v})=\pi f\left(\mathbf{l}_{c}, \mathbf{v}\right) \mathbf{c}_{\text {light }}\left(\mathbf{n} \cdot \mathbf{l}_{c}\right) \tag{9.12} Lo(v)=πf(lc,v)clight (nlc)(9.12)

  上述方程中的 ( n ⋅ l c ) \left(\mathbf{n} \cdot \mathbf{l}_{c}\right) (nlc)通常会被限制到0,从而避免表面下方的光线对这个着色点产生贡献,即:

L o ( v ) = π f ( l c , v ) c light  ( n ⋅ l c ) + (9.13) L_{o}(\mathbf{v})=\pi f\left(\mathbf{l}_{c}, \mathbf{v}\right) \mathbf{c}_{\text {light }}\left(\mathbf{n} \cdot \mathbf{l}_{c}\right)^{+} \tag{9.13} Lo(v)=πf(lc,v)clight (nlc)+(9.13)

  方程9.13中的符号 x + x^{+} x+代表了将 x x x限制到0,我们在章节1中讨论过。

  精确光源同样也可以这样进行处理,二者唯一的区别在于,面光源不需要距离着色点很远,同时 c l i g h t \mathbf{c}_{light} clight的值会随着到光源的距离,发生平方反比衰减,如方程5.11所示。当场景中存在多个光源的时候,我们可以多次计算方程9.12,并对结果求和,即:

L o ( v ) = π ∑ i = 1 n f ( l c i , v ) c light  i ( n ⋅ l c i ) + (9.14) L_{o}(\mathbf{v})=\pi \sum_{i=1}^{n} f\left(\mathbf{l}_{c_{i}}, \mathbf{v}\right) \mathbf{c}_{\text {light }_{i}}\left(\mathbf{n} \cdot \mathbf{l}_{c_{i}}\right)^{+} \tag{9.14} Lo(v)=πi=1nf(lci,v)clight i(nlci)+(9.14)

  其中 l c i \mathbf{l}_{c_{i}} lci代表了第 i i i个光源的方向, c light  i \mathbf{c}_{\text {light }_{i}} clight i代表了第 i i i个光源的颜色。请注意方程9.14和方程5.6之间的相似性。

  方程9.14中的 π \pi π,会和BRDF中经常出现的 1 / π 1/\pi 1/π相抵消(例如方程9.11)。这种抵消可以将除法操作移出着色器,并且使得着色方程更加易于阅读。然而,在将学术论文中的BRDF用于实时着色方程时,必须谨慎处理这一点,通常情况下,BRDF在使用之前需要乘以 π \pi π

菲涅尔反射

  在章节9中,我们从一个较高的层次讨论了光与物质的相互作用,我们介绍了如何使用数学形式,来表达这些相互作用的基本机制:BRDF和反射方程。现在我们准备开始深入研究一些特定的光学现象,并对这些现象进行量化描述,以便可以在着色模型中使用它们。我们将从章节9中首次讨论的平面反射开始。

  物体的表面是指周围介质(通常是空气)与内部物质之间的分界面,光与两种物质之间的平面分界面的相互作用,遵循菲涅尔方程(Fresnel equation),它是由 Augustin-Jean Fresnel(1788 - 1827)提出的。根据几何光学的假设,菲涅尔方程需要一个平面分界面才能生效;也就是说,我们会假设这个表面在1-100倍光线波长的范围内不存在任何不规则性。小于这个范围的不规则性对光线没有影响,而大于这个范围的不规则性,会明显改变表面的倾斜程度,但是并不影响表面局部的平坦性。

  照射到平面上的光线会分为反射和折射两个部分。反射光线的方向( r i \mathbf{r}_i ri)与表面法线 n \mathbf{n} n之间的夹角,入射光线方向( l \mathbf{l} l)和表面法线 n \mathbf{n} n之间的夹角,这两个夹角是完全相同的,记为 θ i \theta_i θi。反射向量 r i \mathbf{r}_i ri可以由表面法线 n \mathbf{n} n和入射光方向 l \mathbf{l} l计算得出:

r i = 2 ( n ⋅ l ) n − l (9.15) \mathbf{r}_{i}=2(\mathbf{n} \cdot \mathbf{l}) \mathbf{n}-\mathbf{l} \tag{9.15} ri=2(nl)nl(9.15)

  如图9.19所示。反射光的光量(入射光的一部分)由菲涅尔反射率(Fresnel reflectance) F F F来描述,它取决于入射角度 θ i \theta_i θi

在这里插入图片描述

图9.19:平面反射的示意图。入射光 l l l在表面法线 n n n周围发生反射,从而生成反射光 r i r_i ri。整个过程如下:首先将入射光 l l l投影到表面法线 n n n上,我们可以得到一个缩放过的法线 ( n ⋅ l ) n (n⋅l)n (nl)n;然后我们将入射光 l l l取反,加上两个刚才的投影向量,最终可以获得反射向量 r i r_i ri 。

  如章节9所讨论的,反射和折射会受到表面两侧物质折射率的影响,我们将继续使用前面讨论时所用到过的一些符号表示。 n 1 n_1 n1代表了表面“上方”物质的折射率,即入射光和反射光传播的那一侧; n 2 n_2 n2代表了表面“下方”物质的折射率,即折射光传播的那一侧。

  菲涅尔方程描述了 F F F对入射角度 θ i \theta_i θi、折射率 n 1 n_1 n1 n 2 n_2 n2的依赖关系,这些方程本身有些复杂,下面我们将描述菲涅尔反射的重要特征,而不是直接给出其数学表达式。

外反射

  外反射(external reflection)是指 n 1 < n 2 n_1 < n_2 n1<n2的情况,也就是说,光线是从折射率较低的那一侧表面发出来的。在大多数情况下,表面的这一侧都是空气,其折射率约为1.003。为了简单起见,我们假设 n 1 = 1 n_1 =1 n1=1。与外反射相反,光线从物体内部传播到空气中的反射过程被称为内反射(internal reflection),稍后将在章节9.5.3中进行讨论。

  对于一种给定的物质,菲涅尔方程可以被解释为一个仅依赖于入射光角度的反射率函数 F ( θ i ) F\left(\theta_{i}\right) F(θi)。原则上来说, F ( θ i ) F\left(\theta_{i}\right) F(θi)的值会在可见光谱上连续变化,但是出于渲染目的,这个函数的输出会被视为一个 R G B RGB RGB向量。函数 F ( θ i ) F\left(\theta_{i}\right) F(θi)具有以下特征:

  • θ i = 0 ∘ \theta_{i}=0^{\circ} θi=0,即当光线垂直于表面( l = n \mathbf{l}=\mathbf{n} l=n)时, F ( θ i ) F\left(\theta_{i}\right) F(θi)的值反映了物质本身的属性。这个特殊值 F 0 F_0 F0,可以被认为是物质特有的镜面颜色。我们将 θ i = 0 ∘ \theta_{i}=0^{\circ} θi=0的情况称为法线反射(normal incidence)(或者是法向入射,垂直入射等)。
  • 随着 θ i \theta_{i} θi的不断增大,入射光线会以越来越大的掠射角度照射到表面上, F ( θ i ) F\left(\theta_{i}\right) F(θi)的值将不断增加,当 θ i = 9 0 ∘ \theta_{i}=90^{\circ} θi=90时,对于任何频率的入射光, F ( θ i ) F\left(\theta_{i}\right) F(θi)都会输出1(即白色)。

  图9.20以几种不同的方式可视化展示了几种物质的 F ( θ i ) F\left(\theta_{i}\right) F(θi)函数。这些曲线是高度非线性的——当 θ i \theta_{i} θi较小的时候,它们几乎没有变化;直到 θ i = 9 0 ∘ \theta_{i}=90^{\circ} θi=90左右,函数值会迅速增长为1。大部分物质的 F ( θ i ) F\left(\theta_{i}\right) F(θi)函数会从 F 0 F_0 F0单调增长到1,但是有些特殊物质(例如图9.20中的铝)在变白(1)之前会有轻微的下降。

在这里插入图片描述

图9.20:三种物质外反射的菲涅尔反射率 F F F,从左到右分别是:玻璃、铜、铝。第一行是 F  F F作为波长和入射角的函数的三维示意图。第二行展示了在不同入射角下, F F F的光谱值转换为 R G B RGB RGB颜色通道的曲线。其中玻璃的三个通道曲线是完全一致的,因为它的菲涅尔反射是无色的。在第三行中, R G B RGB RGB通道曲线是根据入射角的正弦值进行绘制的,以解释图9.21所示的透视缩减。第三行图片中 x  x x轴还展示了菲涅尔反射的 R G B RGB RGB颜色。

  在镜面反射(mirror reflection)的情况下,光线的出射角与入射角完全相同,这意味着与表面呈掠射角度的入射光线( θ i \theta_{i} θi的值接近90◦),其出射光线也与表面呈掠射角度,并最终进入相机或者眼睛,因此反射率的增加主要会出现在物体的边缘处。此外,从相机的视角来看,表面反射率增加最剧烈的部分会被透视缩短(foreshortened),因此这部分所占用的像素数量相对较少。为了展示菲涅尔曲线的不同部分与其视觉突出程度(prominence)成比例,图9.22和图9.20的下半部分所展示的菲涅尔反射率曲线和色条,都是使用 sin ⁡ ( θ i ) \sin \left(\theta_{i}\right) sin(θi)作为参数进行绘制的,而不是直接使用 θ i \theta_{i} θi作为参数。图9.21则说明了为什么 sin ⁡ ( θ i ) \sin \left(\theta_{i}\right) sin(θi)是一个更加合适的参数选择。

在这里插入图片描述

图9.21:远离眼睛的斜面会被透视缩短。这种透视缩短与按照视角方向 v  v v和表面法线 n n n之间夹角的正弦值,来对表面点进行投影是一致的(对于镜面反射而言,这个夹角与入射角相同)。因此,在图9.20和图9.22中,菲涅尔反射率曲线是根据入射角的正弦值进行绘制的。

  从现在开始,为了强调所涉及的向量,我们使用符号 F ( n , l ) F(\mathbf{n}, \mathbf{l}) F(n,l)而不是 F ( θ i ) F\left(\theta_{i}\right) F(θi)来表示菲涅尔函数。回想一下, θ i \theta_{i} θi是表面法线 n \mathbf{n} n和入射光方向 l \mathbf{l} l之间的夹角。当菲涅尔函数被整合为BRDF的一部分时,通常会使用一个不同的向量来代替表面法线 n \mathbf{n} n

  在有关渲染的出版物中,在掠射角度处反射率剧烈增加的现象,通常被称为菲涅尔效应(Fresnel effect)(而在其他领域中,该术语则具有不同的含义,它与无线电波的传输有关)。我们可以通过一个简单的小实验,来亲眼看到菲涅尔效应。带上你的智能手机,坐在光线明亮的地方(比如电脑显示器前)。在不打开手机屏幕显示的情况下,首先将手机靠近胸口,低头看手机,并将手机略微倾斜,使得手机屏幕能够反射出显示器。此时手机屏幕上会有一个相对较弱的显示器反射,这是因为玻璃的法线入射反射率很低。现在将手机向上抬起,使其大致位于眼睛和显示器之间,并再次调整屏幕的角度,使其能够反射出显示器。现在显示器在手机屏幕上的反射,应当几乎与显示器本身一样明亮清晰。

  除了非常复杂之外,菲涅尔方程还有一些其他的特性,这些特性使得菲涅尔方程很难直接用于渲染。它需要在可见光谱上采样折射率值,这些值可能会是复数。图9.20中的曲线展示了一种基于特征高光颜色 F 0 F_0 F0的简化方法。Schlick 给出了菲涅尔反射率的近似值,如下所示:

F ( n , l ) ≈ F 0 + ( 1 − F 0 ) ( 1 − ( n ⋅ l ) + ) 5 (9.16) F(\mathbf{n}, \mathbf{l}) \approx F_{0}+\left(1-F_{0}\right)\left(1-(\mathbf{n} \cdot \mathbf{l})^{+}\right)^{5} \tag{9.16} F(n,l)F0+(1F0)(1(nl)+)5(9.16)

  这个函数实际上就是在白色和 F 0 F_0 F0之间进行RGB插值,尽管它很简单,但是这个近似还是相当准确的。

  图9.22展示了几种偏离Schlick曲线的物质,它们(第二行)在变白之前会表现出明显的“下降”。事实上,之所以选择这些物质进行展示,就是因为它们在很大程度上偏离了Schlick近似。但是即使对于这些物质而言,Schlick近似所带来的误差也相当微小,如图中每个曲线下面的颜色条。在极少数情况下,我们可能需要精确模拟这些材料的菲涅尔反射,那么此时可以使用Gulbrandsen 给出的另一种近似方法,这种近似方法可以精确近似金属的菲涅尔方程,但是计算开销要高于Schlick近似。一个更加简单的选择是对Schlick近似进行修改,使得它可以将最后一项提高到5次幂以上(方程9.18)。这种修改会改变过渡到白色的“速度”,从而使得近似更加精确。Lagarde对菲涅尔方程以及几种近似方法进行了总结。

在这里插入图片描述

图9.22:展示了Schlick的菲涅耳反射率近似值,与六种物质外反射精确值之间的对比。前三种物质与图9.20中所展示的相同,从左到右分别是:玻璃、铜、铝;下面三种物质分别是:铬、铁和锌。每种物质都有一个RGB通道曲线图,其中实线代表了精确的菲涅尔方程,虚线代表了Schlick近似。每个曲线图下面有两个颜色条,其中上面的颜色条代表了精确菲涅耳方程的结果,下面的颜色条代表了Schlick近似的结果。

  当我们使用Schlick近似时, F 0 F_0 F0是控制菲涅尔反射的唯一参数。这种方式十分方便,因为 F 0 F_0 F0 [ 0 , 1 ] [0,1] [0,1]中有一个定义良好的有效值范围,很容易使用标准的颜色选择界面进行设置,并且可以使用为颜色设计的纹理格式来进行纹理化操作。此外,还可以使用许多现实世界材料的属性来作为 F 0 F_0 F0的参考值。 F 0 F_0 F0也可以通过折射率计算得出,通常假设空气折射率的近似值 n 1 = 1 n_1 = 1 n1=1,用 n n n代替 n 2 n_2 n2,来表示物体的折射率。简化之后可以获得如下方程:

F 0 = ( n − 1 n + 1 ) 2 (9.17) F_{0}=\left(\frac{n-1}{n+1}\right)^{2} \tag{9.17} F0=(n+1n1)2(9.17)

  如果使用复数结果的话,这个方程甚至适用于复数折射率(例如金属的折射率)。在可见光谱中折射率变化较大的情况下,计算 F 0 F_0 F0的精确RGB值,需要首先计算密集采样波长下的 F 0 F_0 F0,然后再使用章节8中所描述的方法,将得到的光谱矢量转换为RGB值。

  在一些应用中[732, 947]使用了Schlick近似的更一般形式:

F ( n , l ) ≈ F 0 + ( F 90 − F 0 ) ( 1 − ( n ⋅ l ) + ) 1 p (9.18) F(\mathbf{n}, \mathbf{l}) \approx F_{0}+\left(F_{90}-F_{0}\right)\left(1-(\mathbf{n} \cdot \mathbf{l})^{+}\right)^{\frac{1}{p}} \tag{9.18} F(n,l)F0+(F90F0)(1(nl)+)p1(9.18)

  这个方程可以让我们控制菲涅尔曲线在 9 0 ∘ 90^{\circ} 90时所过渡到的颜色,以及过渡的“速度”。使用这种更加一般的形式,通常是为了增加艺术可控性,但是在某些情况下,它也可以对现实进行更加精确的近似。上面我们提到,修改幂次可以使得某些材质更加接近现实。此外,对于一些材质而言,菲涅耳方程无法很好地描述它们,而将 F 90 F_{90} F90设置为白色以外的颜色,则可以帮助对它们的近似,例如被细尘覆盖的表面,这些细尘颗粒的大小与单个光波的大小相当。

典型的菲涅尔反射值

  物质根据其光学特性可以分为三大类,它们分别是电介质(dielectric),也就是绝缘体(insulator);金属(metal),它们是导体(conductor);半导体(semiconductor),它的性质介于电介质和金属之间。

电介质的菲涅尔反射率

  我们日常生活中遇到的大多数材料都是电介质——玻璃、皮肤、木材、头发、皮革、塑料、石头和混凝土等等。水也是电介质,这可能会让你感到惊讶,因为我们知道,日常生活中的水是可以导电的,但是实际上纯水是不导电的,这种导电性是由于水中含有的各种杂质所产生的。电介质具有相当低的 F 0 F_0 F0值,通常为0.06或者更低。法线反射时的低反射率,会使得菲涅尔效应在电介质中尤为明显。电介质的光学特性在可见光谱上的变化很小,从而会导致无色的反射率值。几种常见电介质的 F 0 F_0 F0值如表9.1所示,表中的数值都是标量而不是RGB值,这是因为这些材质的RGB通道并没有显著的差异。为了方便起见,表9.1中包含了线性值,以及用sRGB转换函数编码的8 bit值(通常在纹理绘制应用中会使用这种形式)。

在这里插入图片描述

表9.1:各种电介质的外反射 F 0 F_0 F0值。每个值都以线性值、纹理值(非线性编码的8 bit无符号整数)和色板的形式给出。如果给定的 F 0 F_0 F0​值是一个范围,那么色板展示是该范围的中间颜色。回想一下,这些都是镜面颜色,例如:宝石通常具有十分鲜艳的颜色,但是这些颜色是由于物质内部的光线吸收而产生的,与菲涅尔反射无关。

  其他电介质的 F 0 F_0 F0值可以通过查看表中的类似物质推断出来。对于未知的电介质而言,0.04是一个合理的默认值,这与大多数常见材料的 F 0 F_0 F0值相差不大。

  一旦光线进入了电介质内部,那么它就有可能会被进一步散射或者吸收。章节9将详细讨论这个过程的模型。如果物体的材质是透明的,光线将继续传播,直到“从内部”照射到物体表面。

金属的菲涅尔反射率

  金属的 F 0 F_0 F0值普遍很高,几乎都在0.5以上。一些金属的光学特性会在可见光谱上发生较大的变化,从而会产生彩色的反射值。几种金属的 F 0 F_0 F0值如表9.2所示。

在这里插入图片描述

表9.2:各种金属(和一种合金)的外反射 F 0 F_0 F0值,按照反射亮度的顺序进行排序。黄金的实际红色分量略微超出了 s R G B sRGB sRGB色域,图中展示的是clamp后的值。

  与表9.1类似,表9.2中包含了线性值以及用于纹理的8 bit sRGB编码值。然而不同之处在于,这里我们给出了RGB各个分量的详细数值,因为许多金属都具有彩色的菲涅尔反射。这些RGB值是使用sRGB原色(或者Rec. 709原色)和白点定义的。黄金的 F 0 F_0 F0值有些不太寻常,它有着非常强烈的反射颜色,其红色通道值略高于1(刚刚超出sRGB/Rec.709色域),其蓝色通道值则特别低(表9.2中唯一一个显著低于0.5的)。黄金也是最亮的金属之一,从它在表中的位置可以看出,因为表格是按照亮度进行排序的。黄金明亮且强烈的反射率,可能有助于其在历史上独特的文化意义和经济意义。

  回顾一下,金属会立即吸收任何透射光线,因此它们并不会表现出任何的次表面散射或者透明度。金属的所有可见颜色都来自于其 F 0 F_0 F0值。

半导体的菲涅尔反射值

  正如人们所料,半导体的 F 0 F_0 F0值介于最亮的电介质和最暗的金属之间,如表9.3所示。在实践中我们很少需要渲染这样的物质,因为大多数渲染场景中并没有散落着的晶体硅块。出于实践目的,应当避免使用0.2-0.45之间的 F 0 F_0 F0值,除非您有意尝试建模一个奇异的或者非真实的材质。

在这里插入图片描述

表9.3:图中展示了代表性半导体(晶体形式的硅)的 F 0 F_0 F0值,以及与明亮的电介质(金刚石)和较暗的金属(钛)的对比。

水中的菲涅尔反射率

  在我们有关外反射的讨论中,我们假设要渲染的表面被空气包围。如果实际情况不是这样的话,那么反射率就会改变,因为它取决于表面两侧折射率的比值。如果我们不能假设 n 1 = 1 n_1 = 1 n1=1的话,则需要将方程9.17中的 n n n替换为相对折射率 n 1 / n 2 n_1/n_2 n1/n2。即下面这个更加一般化的方程:

F 0 = ( n 1 − n 2 n 1 + n 2 ) 2 (9.19) F_{0}=\left(\frac{n_{1}-n_{2}}{n_{1}+n_{2}}\right)^{2} \tag{9.19} F0=(n1+n2n1n2)2(9.19)

   n 1 ≠ 1 n_1 \ne 1 n1=1最常见的情况就是水下场景,由于水的折射率大约是空气的1.33倍,因此水下的 F 0 F_0 F0值是完全不同的,电介质的这种效应要比金属更强,如表9.4所示。

在这里插入图片描述

表9.4:各种物质在空气和水中的 F 0 F_0 F0值的比较。正如方程9.19所期望的那样,折射率接近水的电介质所受到的影响最大。相比之下,金属几乎没有受到什么影响。

参数化的菲涅尔值

  一个常用的参数化是将镜面颜色(specular color) F 0 F_0 F0和漫反射颜色(diffuse color) ρ s s \rho_{ss} ρss结合在一起。这种参数化利用了以下的观察结果:金属材质没有漫反射颜色,而电介质可能存在的 F 0 F_0 F0值是一个有限集合。这种参数化表示包含一个 R G B RGB RGB表面颜色 c s u r f \mathbf{c}_{surf} csurf和一个标量参数 m m m,这个参数被称为“metallic”或者“metalness”,即金属度。如果 m = 1 m=1 m=1,则说明该材质是金属,则将 c s u r f \mathbf{c}_{surf} csurf设置为 F 0 F_0 F0 ρ s s \rho_{ss} ρss设置为黑色;如果 m = 0 m=0 m=0,则说明该材质是非金属,则将介电值(常数,或者由其他附加参数进行控制)设置为 F 0 F_0 F0 c s u r f \mathbf{c}_{surf} csurf设置为 ρ s s \rho_{ss} ρss

  这个“金属度”参数最初是作为布朗大学(Brown University)使用的早期着色模型中的一部分出现的;而目前形式的参数化,则首次被皮克斯(Pixar)用于电影《机器人总动员(Wall-E)》。对于迪士尼动画电影《无敌破坏王(Wreck-It Ralph)》系列中使用的迪士尼原则着色模型,Burley添加了一个额外的标量“镜面(specular)”参数,来将电介质的 F 0 F_0 F0值控制在一个有限的范围内。虚幻引擎同样使用了这种形式的参数化,而寒霜引擎所使用的形式则有一些不同,它允许电介质使用较大范围的 F 0 F_0 F0值。游戏《使命召唤:无限战争》则使用了一种变体,它将这些金属度参数和镜面参数打包成一个单一的值,从而节省了内存空间。

  对于那些使用这种金属度参数化,而不是直接使用 F 0 F_0 F0 ρ s s \rho_{ss} ρss的渲染程序,其动机包括方便用户使用,节省纹理存储空间或者G-buffer存储空间等。在游戏《使命召唤:无限战争》中,这种参数化以一种独特的方式进行使用。艺术家为 F 0 F_0 F0 ρ s s \rho_{ss} ρss绘制纹理,程序会自动执行一种压缩方法,将其转换为金属度参数化形式。

  使用这种金属度参数化有一些缺点,即它无法表示某些特殊类型的材质,例如一个具有彩色 F 0 F_0 F0值的金属,其表面涂有一层电介质,在金属和电介质之间的边界上,可能会出现瑕疵。

  一些实时应用程序使用了另一种参数化技巧,它基于这样的一个事实:除了特殊的抗反射涂层(anti-reflective coating)之外,没有任何材料的 F 0 F_0 F0值低于0.02。这个技巧可以用来抑制表面上某些代表空腔或者空洞的镜面高光。 F 0 F_0 F0低于0.02的值被用来“关闭”菲涅尔的边缘增亮效果,而不是使用单独的镜面遮挡纹理进行控制。这种技术最初是由Schuler 提出的,它现在被应用于虚幻引擎和寒霜引擎中。

内反射

  虽然外反射在渲染中更加常见,但是内反射有时候也会很重要。当 n 1 > n 2 n_1 > n_2 n1>n2的时候,就会发生内反射,也就是说,当光线在透明物体的内部传播,并“从内部”打到物体表面上时,就会发生内反射,如图9.23所示。

在这里插入图片描述

图9.23:平面上的内反射,其中 n 1 > n 2 n_1 > n_2 n1>n2

  Snell定律表明,对于内反射,有 sin ⁡ θ t > sin ⁡ θ i \sin \theta_{t}>\sin \theta_{i} sinθt>sinθi;由于 θ t , θ i \theta_{t},\theta_{i} θt,θi都在 0 ∘ 0^{\circ} 0- 9 0 ∘ 90^{\circ} 90之间,因此也意味着 θ t > θ i \theta_{t}>\theta_{i} θt>θi,如图9.23所示。而在外反射的情况下,角度大小的情况正好相反(可以与图9.9进行比较),二者之间的不同之处是理解内反射和外反射差异的关键所在。在外反射中,对于0-1之间的任意一个 sin ⁡ θ i \sin \theta_{i} sinθi,都存在一个有效的(较小的) sin ⁡ θ t \sin \theta_{t} sinθt值。但是内反射则不是这样的,在内反射中存在一个临界角 θ c \theta_{c} θc,对于大于这个临界角的入射角 θ i \theta_{i} θi,根据Snell定律我们能推导出表明 sin ⁡ θ t > 1 \sin \theta_{t}>1 sinθt>1,即 θ t > 9 0 ∘ \theta_{t}> 90^{\circ} θt>90,这是不可能发生的。在这种情况下, θ t \theta_{t} θt实际上是不存在的,即当 θ i > θ c \theta_{i}>\theta_{c} θi>θc的时候,不会发生光线透射,入射光将会被全部反射。这种现象被称为全内反射(total internal reflection)。

  菲涅尔方程是对称的,也就是说入射向量和透射向量是可以相互交换的,并且反射率保持不变。结合Snell定律,这种对称性意味着,内反射的 F ( θ i ) F\left(\theta_{i}\right) F(θi)曲线将类似于外反射曲线的“压缩”版本。即内外反射的 F 0 F_0 F0的值是相同的,但是内反射曲线会在临界角 θ c \theta_{c} θc处就提前达到完美反射,而外反射曲线则会在 9 0 ∘ 90^{\circ} 90处才达到完美反射,如图9.24所示。从曲线中我们还可以看出,内反射的平均反射率更高,这就是为什么在水下看到的气泡,会具有高度反射的银色外观的原因。

在这里插入图片描述

图9.24:玻璃-空气界面内外反射率曲线的比较。在临界角 θ c θ_c θc处,内反射率曲线趋于1.0。

  内反射只会发生在电介质中,因为金属和半导体会迅速吸收在其内部传播的任何光线。由于电介质的折射率都在实数范围内,因此通过折射率或者 F 0 F_0 F0来计算内反射临界角是很简单的:

sin ⁡ θ c = n 2 n 1 = 1 − F 0 1 + F 0 (9.20) \sin \theta_{c}=\frac{n_{2}}{n_{1}}=\frac{1-\sqrt{F_{0}}}{1+\sqrt{F_{0}}} \tag{9.20} sinθc=n1n2=1+F0 1F0 (9.20)

  方程9.16展示的Schlick近似,对于外反射而言是正确的,通过使用透射角 θ t \theta_{t} θt来代替入射角 θ i \theta_{i} θi,它也可以用于内反射中。如果此时已经有了透射方向 t \mathbf{t} t(例如:用于渲染折射),那么可以用它来计算透射角 θ t \theta_{t} θt。或者可以使用Snell定律,利用入射角 θ i \theta_{i} θi来计算透射角 θ t \theta_{t} θt,但是这个计算成本会很高,并且需要两侧物质的折射率参数,而折射率可能是无法获得的。

微观几何

  比单个像素小得多的不规则表面无法被显式建模,因此BRDF会转而对它们的总体效应进行统计建模。目前,我们的讨论仍然停留在几何光学领域,它假设这些不规则表面要么小于光的波长(即对光的行为没有影响),要么比光的波长大得多。

  每个可见的表面点上都包含了许多微表面法线(microsurface normal),这些法线将入射光向着不同方向进行反射。由于单个微表面的朝向在某种程度上来说是随机的,因此将它们建模为某种统计分布是十分有道理的。对于大多数表面而言,其微观几何的表面法线是一个连续分布,而在宏观的表面法线处则存在一个很强的峰值。这种分布的“紧密程度”是由表面粗糙度所决定的。表面越粗糙,微观几何表面的法线分布就会越“分散”。

  增加微观尺度的粗糙度,其宏观的视觉效果就是反射的环境细节会变得更加模糊。在一个小且明亮的光源下,这种模糊会导致范围更宽、颜色更暗的高光。而那些来自粗糙表面的反射光线则会更暗,因为光线会被发散到了一个更宽的锥形方向上。这一现象可以在图9.12中看到。

  图9.25展示了单个微观尺度表面细节的聚合反射,是如何产生宏观可见反射的。这一组图像展示了一个由单一光源照亮的曲面,每个曲面上的凸起大小逐渐减小,直到最后一张图像中的表面凸起比单个像素还要小得多。许多个微小高光以一种统计模式,最终聚合成了宏观的高光。例如:外围单个高光的相对稀疏程度在聚合之后,就变成了远离高光中心点的相对暗度。

在这里插入图片描述

图9.25:从可见的宏观表面细节逐渐过渡到微观尺度。图像序列按照从上到下,从左到右排布。每个图像中的表面形状和光源都是固定的,只有表面细节的尺度发生了变化。

  对于大多数表面而言,微尺度表面法线的分布是各向同性的,这意味着它是旋转对称的,不具备任何固有的方向属性。而有一些表面则具有各向异性(anisotropic)的微观结构,这样的表面具有各向异性的表面法线分布,这会导致反射和高光的定向模糊,如图9.26所示。

在这里插入图片描述

图9.26:左边是一个各向异性的表面(拉丝金属),请注意反射的定向模糊。右图是一个相似表面的显微照片,请注意表面细节的方向性。

  有一些表面具有高度结构化的微观几何形状,这产生了各种微观尺度的法线分布和表面外观。纤维织物就是一个常见的例子——天鹅绒和绸缎的独特外观,就是由它们的微观几何结构所决定的。

  虽然多重表面法线是微观几何对反射率的主要影响因素,但是其他影响因素有时候也很重要。其中遮蔽(shadowing)是指部分微尺度表面细节对光源的遮挡,使得光线无法照射到另一部分表面上,如图9.27左侧所示。而遮挡(masking)是指微尺度表面细节对相机的遮挡,使得相机无法看见一些表面,如图9.27中间所示。

在这里插入图片描述

图9.27:微观结构的几何效应。左侧:黑色虚线箭头代表了被其他微观几何遮蔽(遮挡了光线)的区域。中间:红色虚线箭头表示被其他微观几何遮挡(遮挡相机视线)的区域。右侧:展示了光线在微尺度结构之间的相互反射。

  如果微观几何的高度与表面法线之间存在相关性的话,那么shadowing和masking就能够有效地改变表面的法线分布。例如:想象这样的一个表面,该表面上凸起的部分因为风化或者其他过程而变得十分光滑,而凹陷的部分仍然十分粗糙。在掠射视角下,表面的凹陷部分往往会被shadowing或者masking,从而生成一个十分光滑的表面。如图9.28所示。

在这里插入图片描述

图9.28:图示的微观几何在高度和表面法线之间具有很强的相关性,其中凸起的区域是光滑的,而凹陷的区域是粗糙的。在上面的图像中,光线以接近宏观表面法线的角度照射到表面上。在这个入射角度上,许多入射光线都可以到达粗糙的凹坑,这些光线会在不同的方向上散射。而在下面的图像中,光线以一个掠射角度照射到表面上。Shadowing遮蔽了大部分凹坑,因此只有很少的光线能够照射到它们,大多数光线都被表面的光滑部分反射回来。在这种情况下,表面粗糙度很大程度上取决于光线的入射角度。

  对于所有的表面类型而言,不规则表面的可见尺寸会随着光线入射角 θ i \theta_i θi与表面法线之间夹角的增加而减小。在极端的掠射角度下,这种效应可以将观察到的不规则表面尺寸,减小到比光的波长还要短,从而使得这些不规则表面对于光线的传播行为没有任何影响。这两种效应与菲涅尔效应相结合,使得表面看起来具有很高的反射率,就像镜子一样,因为此时的观察角度和光线角度接近 9 0 ∘ 90^{\circ} 90

  我们可以自己做个小实验。将一张没有光泽的纸卷成一根长管,并将它对准明亮的窗户或者电脑屏幕;当我们的视角几乎与纸张平行的时候,我们会在纸张上看到窗户或者屏幕的尖锐反射。只有这个纸质长管和电脑屏幕(或者明亮的窗户)之间的角度非常接近 9 0 ∘ 90^{\circ} 90时,才能看到这种效果。

  被微尺度表面细节遮挡的光线并不会消失,它可能会被反射到其他的微观几何上。光线在最终到达眼睛之前,可能会经历多次这种类型的反射,图9.27右侧就展示了这种相互反射现象。由于光线在每次反弹时都会被菲涅尔反射衰减,因此电介质中的相互反射往往都不易察觉(subtle)。而在金属材质中,这种多次弹射是任何可见的漫反射的来源,这是因为金属没有次表面散射现象。有色金属的多次反射颜色要比一次反射的更深,因为它们是光线与表面多次相互作用的结果。

在这里插入图片描述

图9.29:微尺度粗糙度引起的逆反射。左右两幅图都展示了一个粗糙表面,它们具有较低的菲涅尔反射率和较高的漫反射率,因此次表面反射在视觉上就变得十分重要。左图中,观察方向和光照方向是相似的,微观几何中明亮的部分也是最可见的部分,从而形成了明亮的材质外观。右图中,观察方向和光照方向的差别很大,在这种情况下,明亮的区域被遮挡在视野之外,而可见区域则位于阴影中,从而形成了更暗的材质外观。

  到目前为止,我们已经讨论了微观几何对镜面反射率(表面反射率)的影响。在某些情况下,微尺度的表面细节也会对次表面反射率产生影响。如果微观几何的不规则性大于次表面散射发生距离的话,那么shadowing和masking就会导致逆反射(retroreflection)效应,即光线被优先反射回入射方向。这种效应的发生原因是:当观察方向和光照方向相差很大时,shadowing和masking会遮挡被光线照射到的区域,如图9.29所示。逆反射往往会使粗糙表面表现出平坦的外观,如图9.30所示。

在这里插入图片描述

图9.30:由于微尺度表面的粗糙度,这两个物体表现出了非Lambertian的、逆反射的材质外观。

猜你喜欢

转载自blog.csdn.net/Aubyn11/article/details/142921440