1.3 物体的表面着色
在了解了全局光照应该实现各种物理现象,以及模拟自然光照计算需要的一些基本物理度量之后,从本节开始,我们将开始进入计算机图形学的世界。
正如前言所述,本书除了介绍计算机图形学的一些基本理论知识,另一个重要的目标是试图解释清楚这些理论知识之间的逻辑联系,本节的目标是在没有涉及具体的全局光照方法之前,尝试解释光与物体的交互过程,以及最终怎样被渲染成图像。在本节的末尾,我们仍然会通过这种高层抽象的物体表面着色需求(而不是从基础的数学公式),推导出渲染方程的表 达式。然后在第[ref sec:intro-the-rendering-equation]节,将会更详细地解释渲染方程。
几何光学模型
本节首先介绍光的一些基础物理特征,这些特征是我们模拟真实的光与物体交互的基础,从而能够渲染出更真实的图像。
在电磁学中,有两种模型用于研究光的性质,第一种为物理光学,第二种为几何光学。物理光学(physical optics),又称为波动光学(wave optics),它认为光在介质中以波的形式传播,这种模型可以解释光的衍射和干涉等现象。然而它以光的波长为测量尺寸,这大大超出了计算机图形学的需求。
由于可见光的波长非常短,另一种模型忽略光的波长,即相当于的极限情况,并证明(感兴趣的读者可以参考书籍[cite b:PrinciplesofOptics]第三章的推导。)在这种近似处理下,光学定律可以用几何学的语言来描述,这种模型称为几何光学(geometric optics),或者称为光线光学(ray optics),因为这种模型下能量可以看作是沿着直线传 输。几何光学模型正是被计算机图形学广泛采用的模型。
当然,几何光学模型仍然比较复杂,在计算机图形学中,我们作出了一些简化假设,这虽然限制了一些效果如衍射,但是它处理起来相对简单,并且满足一般图形学的需求。这些假设包括:
- 物体的表面是绝对光滑(真实世界的物体表面不是绝对光滑的,它的粗糙度介于光的波长和一个像素的尺寸之间,这种粗糙度可以通过下一节介绍的微面元技术实现,它本质上是反射和折射的一种聚合。)(smooth)的。
- 光仅可以被发射(emitted),反射(reflected)或者传播(transmitted)。
- 光以无限快的速度沿直线传播。
在这些假设下,光的反射由反射定律(law of reflection)决定,即: 给定一条入射光线和表面法线,反射光和入射光处于同一个平面, 并且反射光与法线之间的夹角大小等于入射光与法线的夹角大小,如图1所示。
图(1):在几何光学模型中,反射定律和斯涅尔定律决定光的反射和折射
当光在传输过程中,介质的折射率(index of refraction)发生变化,则会发生折射(refraction)。当入射光从具有折射率为的介质进入折射率为的介质时, 其光线传输方向的偏离由斯涅尔定律(Snell's law)决定,如图1所示,即有:
(式1)
光与表面的交互
为了模拟光学现象以生成真实的数字图像,我们需要构建一套系统,将几何光学模型应用到计算机图形学中。这套系统定义了在图形渲染过程中,光与表面及其他物体的交互。
这个系统工作的过程可以描述如下:
- 光从光源(例如太阳或其他光源)或其他发光体中发射出来。
- 光与场景中的物体进行交互,部分被反射,部分被吸收并可能经过一定路径传播后沿其他方向从物体表面散射出来。
- 最后,光被感应器(例如摄像机或者人的眼睛)吸收,形成图像。
这个过程涉及三个组件:光源,材质以及摄像机。在接下来的小节中我们将讨论这些组件,以及它们怎样被用在渲染管线中用于渲染图形。
光 源
光源(light sources)发出光并照亮整个场景,此外,在计算机图形学中,光源一般不会反射或吸收其他光照。
现实世界中的光源是很复杂的,它可能沿不同的方向以及光源表面上的不同位置具有不 同的分布,在图形学中一般仅使用少数几种简单的光源模型,这几种模型都假设光源的光照分布只随方向而发生变化。这几种模型包括:
- 平行光(directional light):平行光模拟光从无限远的地方发射,这意味着所有由它产生的阴影光线都是平行的,因此这种模型是模拟太阳光的理想选择。
- 点光源(point light):点光源从一个点向四面八方发出光线,它可以用于模拟如现实世界中的钨丝灯泡发出的光。
- 聚光灯(spot light):聚光灯限制点光源发出光线的方向,它通常使用两个圆锥体作为参数,其中内部圆锥体的半径内发出的光线最强,从内部到外部圆锥体半径内光线强度逐渐减至零。
以上这些光源发出的光线会在场景中像自然光一样进行传播,即这些光线通过最近点测试计算出光线与哪个物体表面的哪个位置相交,然后根据物体表面的材质属性进行着色计算。除此之外,出于性能考虑,场景中还有另外一些(通常是间接)光不会通过这种方式计算,例如大面积的环境光通常通过贴图的方式计算,这包括天空盒(sky light)以及其他环境光照;而低频率的间接漫反射的光可以通过使用低阶的球谐函数近似表述,然后在GPU中使用快速的卷积(convolution)计算。
对于直接光源,另一个我们最关心的问题是这个光源的光照用什么物理量表示,以及这个物理量怎样参与到光与表面的交互计算之中。
首先,虽然眼睛等感应器接收的是辐射亮度,但这是一个五维(三个维度表示位置,两个维度表示方向)的量,太过于复杂,所以在图形学中一般不会直接表示光源的辐射亮度分布。考虑到图形学中大部分直接光源的亮度分布都是只与方向有关,所以辐射强度通常用来表示本节提到的几种直接光源的辐射亮度分布。
当然这个方向分布函数不宜太复杂,一般引擎不允许定义具有任意方向分布的光源,例如点光源可能所有方向的辐射强度都相同,聚光灯也是沿着一个圆锥体向外递减。在Unreal Engine 4中,可以对点光源和聚光灯使用一个称为IES[cite m:IESLightProfiles] 的光源配置(light profiles)的配置文件。IES光源配置文件可以以曲线的方式定义光源的光照强度分布,如图2所示。
图(2):在Unreal Engine 4中使用IES光源配置文件定义点光源和聚光灯的光照强度分布 (图片来自[cite m:IESLightProfiles)
通过第[ref sec:irradiance]节的内容可知,在计算光与物体表面交互时,表面接收的所有光照使用辐射照度表示,而光源使用辐射强度表示,所以这里就需要使用第[ref sec:irradiance]节介绍的的平方反比定律,通过来计算,为了方便,这里重新列出该方程如下: