# Materials and Appearances(材质与外观)
在图形学中,什么是材质?我们已经看到过自然界中的种种材质,光线与不同材料和质感的物体的作用给描述出来就是不同的材质。上图最左边是三维空间中的四边形网格模型,右边两幅图是这一个相同的模型渲染出的不同结果,为什么可以渲染出不同的结果呢?那自然是因为我们可以给不同的部件指定不同的材质,例如盘子的颜色都是陶制的(本身有一些明显的镜面反射还有漫反射)。在图形学里我们通过指定不同物体拥有不同的材质,我们知道了它们该如何和光线作用之后就能把它正确的渲染出来。在光线传播里面,我们已经知道渲染方程是严格正确的东西,那么一定在渲染方程中描述了某一种材质,现在思考一下,在渲染方程中哪一项是和材质有关的呢?没错,就是 BRDF!因为 BRDF 直接决定了光线如何反射嘛。
# Material == BRDF
任何一根光线打到任何一个点上,它会被均匀的分散到各个不同的方向上去,这就是漫反射材质。
漫反射材质可以定义在任何一个点上有一个漫反射系数,虽然都是漫反射,但是各个点光被吸收的部分不同,所以会显示出不同的颜色。
我们之前提到吸收的时候,是怎么定义漫反射系数的?我们当时在 Blinn-Phong 着色模型里面定义了漫反射系数,当时我们用的概念还是 Intensity,也就是一个经验性的定义,现在我们来把这个漫反射系数给定义对。上面左边这幅图物体表面的材质是漫反射材质,那么就意味着从任意方向入射的光线都会被均匀的反射到周围各个不同的方向上去,我们现在人为的做这样一个假设:空间中从任意方向进来的光它的 Radiance 都是一样的,也就是说进来的光都是 uniform 的,反射的光由于是漫反射材质所以一定也是 uniform 的,这样子假设的好处是我们可以使用能量守恒,如果这个点不发光并且它又不吸收光,那也就意味着所有的光进来多少就得反射多少。所有这些进来的光我们用 Irradiance 表示,也就是说进来多少 Irradiance,那么出去就有多少 Irradiance。既然如此,入射光的 Radiance 和出射光的 Radiance 应该也是一样的(因为 uniform 的缘故)。那么我们可以写出上面这个渲染方程,其中因为是漫反射所以 BRDF 是常数,并且入射的 Radiance 也是常数,所以可以把这两项给提出去。由于入射的 Radiance 等于出射的 Radiance,所以 等于,那么 BRDF 就得等于,这时候也说明物体表面完全不吸收能量的情况,我们还可以定义一个反射率的概念,叫作 albedo,它可以是单通道的一个数,也可以是三个数 RGB 或者是光图都可以。那么就意味着我们可以应如不同颜色的 BRDF,这个 BRDF 的值就是,也就是说一个正确的 Diffuse 的 BRDF 就定义出来了,它的范围在 0 到。
入射光打到一个物体上去,会朝着一个范围的方向反射,也就是说它很像镜面反射,但又不是完全像镜子一样,而是表面会更粗糙一些,例如抛光的金属的材质。
古代会用铜镜来照镜子,例如上面左边这幅图,稍微有点模糊,但是也能表面看出反射的效果,这种材质我们称之为 Glossy 材质。
一根光线打到物体后,一部分能量沿镜面反射出去了,另外一部分物体折射到物体里面去了,例如玻璃和水的材质。
我们平时见到的正是如此,例如左边是一个水的表面,有一部分能量被反射,所以我们才能看到周围的环境光,还有一部分能量被折射进去,所以我们能看到里面灰色的球。右边的球虽然也是透明的,但是它有自己的颜色,这是因为光线在折射后的能量被部分吸收,所以我们能看到一个颜色。
在物理上,我们都知道有反射定律,反射定律指的是光射到一个界面上时,其入射光线与反射光线成相同角度。
通过反射定律,我们就可以写出反射的公式出来。反射的公式有两种不同理解的方式,一个是直接用反射的定律来,也就是入射光方向和出射光方向的正中间方向一定是法线方向,于是我们就可以利用平行四边形法则把 和 加起来,得到方向为法线方向,大小为两倍入射光方向投影到法线的长度,于是我们就可以写出上面的公式。另外一个理解方式是,就是把这些角度投影到一个局部坐标系上面去,任何一个方向和法线的方向的夹角叫作仰角,我们这里记为, 等于 意味是沿着法线方向, 等于 意味着朝着法线的垂直方向,另外我们还会定义一个 角度,我们可以规定、 和所在的某一个平面上时,如果这个平面绕着转,旋转的这个角度就叫做方位角,我们通过这种方式可以把任何的角度拆成 和,对于左边的这个场景,我们从上往下看,看到的就是右边的这幅图,我们会发现入射方向和反射方向它们在方位角上的朝向正好是相反的,于是我们就可以得到,有了 和,出射方向自然就能算出来。我们之前提到过 Blinn-Phong 和 Phong 着色模型的区别,计算半程向量省去了计算反射角的麻烦。
所有的反射不是都可以拿 BRDF 来描述吗?那么镜面反射自然也能拿一个 BRDF 来描述,这里涉及到 delta 函数的概念,这里不详细展开。这个 BRDF 我们理解成在固定了入射方向之后在出射方向上的一个分布,它现在的分布就集中在镜面反射方向这一个方向上。
折射是另外一个现象,例如铅笔在水中看上去就像被折断了一样、一束光经过棱镜之后被分解成了不同的光线等等。右下角这张图的现象叫作 Caustics,会形成这种现象是因为光线打到了水面上之后,由于水面不平整,所以光线会往不同的方向折射,对于海底的某一个点来说,它有一定几率接收到来自不同方向上的光,就像那放大镜把光聚在一块一样,在某些地方形成了条状的亮光。
怎么算折射的方向呢?这里会用到斯奈尔定律,也叫折射定律。折射和反射一样,也会发生在入射方向和法线形成的平面内。我们定义入射方向和法线的夹角 以及折射方向和法线的夹角,并且入射部分介质的折射率为,折射部分介质的折射率为,那么它们会满足上面的等式。
通过斯奈尔定律,我们就可以把折射角给算出来。通过观察折射角的余弦的推导,我们还可以发现,如果最后求出来的余弦不是一个有意义的实数,那么也就意味着折射不可能发生。由于 不可能大于 1,所以只有当 的时候,这种情况下就有可能出现没有折射这种现象,这种现象也叫全反射现象。
上图的这种现象叫作 Snell's Window/Circle。当人在水底往水面上看的时候,我们会发现只能看到一个锥形的区域。之所以在这里将这些是因为我们为了把光线追踪做对,很多物理现象都是需要考虑的。折射肯定也要对应一种 BRDF,但是 BRDF 的 R 指的是反射,折射里面是 BTDF,T 指的是 Transmit,而 BRDF 和 BTDF 统称起来我们可以叫 BSDF,其中 S 表示 Scatter(散射)。
关于反射和折射有很多有趣的性质,这里要讲到的一个性质叫作菲涅尔项。观察上面的这个场景,我们以不同的视角看上面的桌子和书,如果我们接近垂直的去看,几乎看不到什么反射,而如果几乎平行于桌面往前看,我们会发现桌子反射的书特别明显。也就是说,有多少光被反射是和入射光有关系的,入射光和法线所形成的角度决定了有多少光被反射。为什么我们要提这个话题?是因为我们刚才提到有光打到物体表面它会有一部分能量被反射,有一部分能量被折射。通过菲涅尔项,我们就可以解释到底有多少能量发生了反射、有多少能量发生了折射。
上图的红线就描述了如果一根光线几乎物体表面完全平行了,那么它就会被完全的反射掉,如果说光线和物体表面几乎垂直,那么更多的能量都会法神折射,反射的能量会非常少。上图另外的两条线表示的是极化性质,这和光的波动性有关,因为光线沿着各个方向都是有震动的,而极化说明的是光线只沿着一个方向震动,正常情况下我们都不用考虑光的极化情况。上图反应的是一个反射率为 1.5 的绝缘体的菲涅尔项,对于导体来说就是另外一个菲涅尔项。
对于导体来说,也就是对于大多数金属来说,即使在垂直方向看过去的时候也会有大量的反射,这也说明为什么古代会用铜镜、银镜,是因为它们在任何情况下反射率都挺高的,都有大量的能量被反射了,这样我们才能拿来当镜子用。
菲涅尔项到底应该怎么算呢?上面的 和 分别代表两个不同的极化,两个不同的极化会告诉我们两个不同的反射率,我们平常考虑不极化的光,所以 对 求了一个平均。我们先不管公式有多么复杂,它一定会跟入射光和法线的夹角有关系,也和入射和折射的介质有关系。由于这个公式过于复杂,所以有一个简化方法叫作 Schlick's approximation,该方法认为曲线就是从某一个地方开始,然后在 的时候折射率等于 1,再把它的基准反射率 用公式表示出来。导体的折射率正常来说应该是复数,但我们实现的时候进行了简化。
# Microfacet Material
为什么要提菲涅尔项是因为接下来我们要引入一个真正的基于物理的材质,这种材质叫作微表面材质或者微表面模型。我们来看看上面的这张卫星图,会发现地球表面有高光,这个高光挺完整的,就想我们真的在渲染一个球面一样,但是对于地球表面来说它应该是有山、水、建筑物等等东西,但我们现在完全看不到,我们看到的仅仅是一个球面。这就说明了从远处看我们看不到物体的各种各样的细节,我们能看到的只是有一定粗糙程度的表面,微表面模型说明的就是这种现象。
微表面模型假设从远处看,看到是一个粗糙的平面;从近处看,可以看到凹凸不平的表面,并且每一个小的表面的微元都认为它是一个完完全全镜面反射的镜面,有各自不同的法线。总结起来就是,微表面模型认为,从远处看看到的是材质与外观,从近处看看到的是几何,所以本质上来说材质和几何之间是有一定关系的。
我们之所以讨论这些,是因为我们可以研究这些微表面它们本身的法线形成的一个分布。例如上图上半部分中的表面看上去挺平的,也就是说它们的法线朝向会集中在一个很小的范围,这样的材质对应的就是 Glossy 的材质。如果表面粗糙,也就是上图下半部分中的表面的情况,也就意味着所有的微表面可能会沿着各种不同的方向,那么它们法线的分布就会分散在一个比较大的范围上,这样的材质对应的就是 Diffuse 的材质。上面的例子说明,通过微表面模型,我们可以把物体表面的粗糙程度用微表面的法线分布来表示。
微表面模型的 BRDF 考虑入射方向和出射方向,这个 BRDF 搜先考虑了一个菲涅尔项,这个菲涅尔项告诉我们根据不同的入射方向有不同程度的反射。 表示的是法线分布,这个分布表示了在任何一个给定方向上分布的值是多少(可能是集中在中间的,也可能是均匀分散开的等等),我们会发现这个地方又用到了 half vector,给定入射方向和出射方向,现在问有多少微表面能够把入射方向的光反射到出射方向上去(只有当微表面的法线方向和 half vector 的方向完全一致的时候,这样的微表面才能把入射方向反射到出射方向上去),就是对 值的查询。中间的 表示的是 Shadowing-masking term,也叫作几何项。之所以存在这样一项,是因为微表面之间可能会发生互相遮挡的情况,假设当一束光几乎和整个平面平行从左往右射过来的时候,左边这些面很有可能就会挡住右边这些面,也就是说右面这些面接收不到光,它们会发生互相之间的投影阴影。对于观察方向来说也是一样,我们从一个方向上看过去也有可能因为遮挡看不到一些微表面。在这些情况下,有一些微表面失去了它们的作用,原本我们算出来的反射的能量可能由于遮挡并没有那么多的能量,Shadowing-masking term 考虑的就是这种现象。我们把一束光线几乎平行打到表面上的入射方向叫作 Grazing Angle,无论是光线方向还是观察方向,只要它们接近 Grazing Angle,Shadowing-masking 就容易发生, 这一项就是对结果进行修正。
上面图片的渲染都用到了微表面模型,可以看到使用了微表面模型之后可以生成非常真实的画面。在电影和游戏行业中,PBR 中大家都一定会使用微表面模型,当然微表面模型也有自己的问题,例如它的 Diffuse 项很少,有时需要额外的进行一些处理。
上面这幅图我们看到,在一个电梯间的内部,电梯间的四面都是金属,如果头顶上有些小灯,这些光线打到金属表面上后,我们可以看到上图这样的高光。之所以会产生这种高光一定是因为材质的原因。这就是我们现在要讨论的区分材质的一种方式,就是把材质分成各向同性材质和各向异性材质。
所谓各项同性材质,就是我们认为它的微表面并不存在一定的方向性或者说方向性很弱。我们先看 Isotropic 的物体表面,如果我们看它法线的分布,会发现各个方向的分布基本上是均匀的。而对于刚才的电梯间,由于它的金属自上而下的刷过,也就是 Anisotropic 的物体表面,我们会发现它的法线分布是有明确的方向性的。也就是说,从微表面的方向性我们就可以看出这个材质它是属于各向同性还是各向异性,而且各向异性会有各种各样神奇的性质。
各向异性具体来说反映在 BRDF 上是怎么回事呢?BRDF 原本是两个方向的函数, 和 是输入方向, 和 是输出方向。如果说这个 BRDF 不满足在方位角上旋转得到的还是相同的 BRDF,我们就管它叫各向异性的材质。如果旋转之后看到的还是相同的 BRDF,那么就是各向同性的材质。我们看到上面场景中的两个球,左边的球就是各向同性材质,右边的球就是各向异性材质。
到这里我们已经把一些基本的材质说的差不多了,我们现在先对 BRDF 的一些性质给总结起来。首先,BRDF 表示的值永远是非负的,因为它表示的能量的分布。另外一个就是 BRDF 的线性性质,我们之前说到 Blinn-Phong 着色模型的时候把光线分成三个部分,最后再把每个部分加起来。BRDF 也有相同的性质,也就是说我们可以把 BRDF 拆分成很多块,把各个块分别拿去做光线传播,然后再把各个块给加起来,得到的结果和用整个 BRDF 做光线传播一模一样。
我们之前还提到过光路的可逆性,说把一条光路所有的方向都给反过来仍然是一条合理的光路,BRDF 也满足可逆性,也就是我们交换入射方向和出射方向的角色,得到的 BRDF 的值也一定是一样的。BRDF 的另外一个性质就是能量守恒,BRDF 的存在绝对不会让能量变得更多,如果是完全反射,那反射出去的能量也就是之前的能量,如果存在部分能量的吸收,那么反射出去的能量就会比原来的小。这也是为什么光线经过无限次弹射之后,我们的能量还是会收敛的原因。
我们刚才提到 BRDF 的各项同性和各向异性,如果是各向同性的话也就意味着 BRDF 的值只和相对的方位角有关,我们会发现对于各向同性材质,原本四维的函数可以表示成三维的。而不论是各向同性还是各向异性材质,由于它们都满足可逆性,所以它们相对的方位角不用考虑正负。
# Measuring BRDFs
BRDF 我们可以用各种各样不同的模型去描述,但这是能说是基于物理的近似。实际上想要最准确的 BRDF 则需要测量。物理上有很多得出来的结论都是有很多简化的,所以在很多时候我们也需要测量,其次测量的目的还可以是能直接使用数据而避免了推导的一些过程。
BRDF 是两个方向的一个函数,一个入射方向,一个出射方向。如果盯着一个着色点看,如果改变它的入射方向从四面八方来照射它,并且也改变相机的位置从四面八方去拍它,那么这样我们就能获得这个 BRDF 所有可能的输入方向和所有可能的输出方向。
这是实际完成这项工作的机器。
这样一来我们就可以得到一个非常简单的算法,我们直接枚举所有的出射方向和入射方向,并且测量最后得到的 Radiance 是多少。但这所有的操作都是四维的,如果我们认为我们测量的 BRDF 是各项同性的,那么它是可以简化成三维的,因此我们可以把四维降到三维,并且由于 BRDF 的可逆性,只考虑相对方位角的话又可以砍掉一半的测量,以及等等更加聪明的测量方式用来加速 BRDF 本身的测量。