第5章真实感绘制计算机图形学中的绘制(Rendering,又称为渲染),是指通过计算机程序将二维或三维几何模型转换为二维光栅图像,从而能够在计算机显示器等终端上显示。计算机图形学中的绘制主要涉及两种类型: 真实感绘制和非真实感绘制。真实感绘制是让计算机的绘制结果具有如同相机拍摄真实场景照片般的效果,能够反映出符合自然规律的物体表面颜色、亮度等视觉上可感知的物理属性。非真实感绘制则是不以视觉上的真实感为目标,而是生成具有艺术化效果的图像,以追求特定艺术风格的再现。从计算机图形学诞生后的相当长的一段时间,几何模型及场景的真实感绘制一直是重要问题,直接影响了二维或三维图形的显示效果。
围绕真实感绘制技术,本章着重介绍影响真实感绘制效果的相关因素,如光照、着色等。进一步,根据绘制时所采用的物理模型的不同,重点介绍若干典型的真实感绘制技术,包括纹理映射、光线跟踪方法、辐射度方法等。此外,简单介绍一些特殊效果的绘制技术,包括阴影、毛发等。
5.1光照
人的眼睛是一个非常复杂的视觉系统。眼睛能够观察到物体外观(颜色、亮度、透明度等),主要是由真实世界中各种光源产生的光照所影响。那些和物体表面作用后进入到眼睛的光线携带了物体表面的属性信息,形成具有不同色彩感受的物体外观。因此,计算机图形学中绘制的真实感可以解释为要让绘制出来的效果,尽可能符合人类所认知的物理规律以及人眼对真实世界观察的结果。 
光照主要涉及光源和光线的物理模型。光源,是本身能发光且正在发光的物体(忽略周围环境的反射光),表示了光线的起始位置。光线,则是描述光源发出的光在空间中传播的载体形式。虽然光线在几何上可以看作一条射线,但是其物理上的本质是电磁波,是一种描述了包含不同波长的复色光。人的眼睛能够直接感受到的光线,主要集中在电磁波谱中的可见光范围内(波长范围约为380~780nm),超出这个范围的光线不会被人眼察觉。光源和光线定义了场景中的光照条件,使得场景中的物体表面呈现出一定的颜色效果。
光源表面上任一点p(x,y,z)所发出的光线通常采用方向和强度来描述。其中,光线方向对应于三维空间向量的方向(θ,φ),光线强度(简称光强)描述了光线传递的能量。这里θ和φ可以看作球极坐标系中的俯仰角和方位角。那么,由p点发出的单条光线可以表示为l(x,y,z,θ,φ,λ),记录了光源位置、方向、波长和强度,其中λ对应于波长。对于一般的光源而言,其散发出的光强就是沿所有方向上的光线能量的积分。根据发射光线方向的分布不同,光源可以分为点光源、聚光灯、远光等。这些就包含了真实感绘制时场景中光源的主要类型(如图5.1所示)。
图5.1常见的光源类型
1. 点光源
点光源是一种相比于场景中物体模型的尺寸要小得多的光源。因此,点光源通常可以简化为理想的一个点(如图5.1(a)所示)。同时,点光源向四周均匀发射光线。假设在p0点处的点光源发出的光线强度为l(p0),那么空间中任意点p接收到的光线强度与其到光源的距离成反比,也就是满足l(p)∝1|p-p0|l(p0)。因此,离光源越远的位置,其接收到的来自点光源的光强越弱。
〖1〗现代计算机图形学基础第5章真实感绘制〖3〗〖3〗2. 聚光灯
聚光灯相比于点光源,其光线方向集中在一个比较窄的范围。点光源发射的光线通常形成圆锥形的半无穷区域(如图5.1(b)所示)。因此,聚光灯可以在点光源基础上,加上一定的角度限制来表示,使其发射的光线聚集在偏离某一个方向的角度范围内。例如将聚光灯表示为顶点在p0、中心轴方向l的圆锥,其顶角为α。如果中心轴和母线的夹角α=180°, 那么聚光灯变为点光源,就会朝空间中各个方向发射光线。此外,点光源的光强分布函数定义为l(p0)coseα,其中指数e表示了光强衰减的快慢。因此,在离中心轴越近的地方,受光源发射光线的光强影响越大。
3. 远光
顾名思义就是光源位置位于无穷远处。因而,远光可以认为其发出的光线是平行光(如图5.1(c)所示)。在三维空间中,通常采用球极坐标中的俯仰角θ和方位角φ来指定光线的方向,并以此作为远光模型。因此,远光就是沿着固定方向具有处处均匀光强的模型。
上述各种光源模型都只是对自然界中常见光源的近似模拟。在实际的光照环境下,场景中往往包含不同类型的多个光源。例如,学校教室的场景中除了室外投射进来的太阳光以外,通常也包含日光灯、投影仪光源灯等来自于多个光源的光线。这些光源的位置和光强都会直接影响到该场景绘制的最终效果。
此外,环境光也是模拟真实光照的一个重要组成部分。环境光用于描述空间中处处均匀的光照效果,使得场景中各处都具有相同的光照强度。严格意义上说,环境光也是来自于某些其他光源,但在光强计算时进行了简化。通常采用从光源发出的光线经过多次反射后的效果来模拟环境光。这样,空间中的光强就是一个常值,与光源位置、方向等因素无关。因此,环境光满足空间均匀分布的条件: l(x,y,z,θ,φ,λ)=l0基于上述光照模型,接下来就可以按照现实世界中光线与物体的作用情况来对计算机中的几何模型和场景进行真实感绘制。真实感绘制技术可以分为两种主要类型: 局部绘制技术和全局绘制技术。局部绘制技术,侧重于模拟光线与物体表面的局部作用过程。例如5.2节中介绍的Gouraud着色模型、Phong着色模型等。局部绘制技术的优点是算法复杂度低、计算速度快,因此适用于实时性要求高的应用场合,如3D计算机游戏。但其缺点是在许多物理场景下,绘制效果的真实感不足,尤其是对包含多个光源的复杂场景的绘制。
全局绘制技术,侧重于光线从光源到成像的整体作用过程,例如5.4节中介绍的光线跟踪模型,5.5节中介绍的辐射度模型。全局绘制技术可以更准确地模拟反射、折射、阴影、色彩扩散等更复杂的光和物体作用效果,绘制效果的真实感强。但其缺点是往往需要复杂的计算过程,整体运行效率比较低。因此,全局绘制技术主要用于电影制作中静态帧画面的逐帧绘制。
从计算机图形学诞生开始,真实感绘制技术就不断革新,涌现出大量不同的局部/全局绘制模型。如图5.2所示,在1967年Utah大学的Chris Wylie首先在绘制模型中引入了光照,从而开启了真实感绘制的发展历程。1970年,美国UIUC大学的Jack Bouknight提出了第一个光照反射模型,也就是包含朗伯漫反射和环境光的光照模型。在这之后,Utah大学的研究人员又相继提出了Gourand着色模型和Phong着色模型等局部绘制技术,使得计算机图形学真实感绘制技术被广泛应用。从20世纪80年代开始,全局绘制技术开始兴起,包括光线跟踪模型、辐射度模型等。此后,一些对这些全局光照模型进行改进的算法不断被提出,同时也在影视、游戏等行业中得到了广泛应用。接下来,具体介绍这些典型的真实感绘制技术。
图5.2真实感绘制技术发展的简明历程5.2BRDF和着色
除了光照因素外,即使在相同的光照条件下,对同一个物体设置不同的材质属性,也能够绘制出具有不同真实感效果的图像。材质,也就是材料和质感的结合,反映了物体的物质特性。这些特性通常涉及物体表面的色彩、纹理、光滑度、透明度、反射率、折射率等属性。正是物体有了这些不同的物理属性,材质才会影响光线和物体之间的相互作用,进而影响物体最终的绘制效果,如图5.3所示。
图5.3同一物体设置不同材质的绘制效果
一般情况下,光源发射的光线照射在物体表面时,部分光线会被物体吸收,而部分光线会被反射或折射,继续在空间进行传播。从局部来看,如图5.4(a)所示,光线照射到A点,会产生被反射或吸收的光线。一些反射的光线照射到B,同样会产生被反射或吸收的光线。如果场景中有多个物体,那么上述过程又会在不同物体之间重复循环,直到最终达到一个稳定状态。从整体来看,各种光源发出的光线与场景中的物体发生相互作用。因此,场景的最终绘制效果取决于光线与场景中物体的多次作用程度,如图5.4(b)所示,并随之产生折射、半透明、阴影、雾化等效果。
图5.4光照与材质影响绘制效果
从物理上讲,光线和物体表面作用时的反射程度、方向等是与物体表面的光滑度、反射率、法向朝向等因素密切相关的。粗糙的表面会将入射光线朝各个方向均匀散射,称为漫反射(Diffuse Reflection);光滑的表面则会产生镜面反射(Specular Reflection),形成亮度高度集中的高光效果,也就是物体表面最亮的局部区域。此外,如果物体本身是透明的,那么有些光线也会透射进物体,形成(半)透明的效果。双向反射分布函数(Bidirectional Reflection Distribution Function,BRDF)是一种描述光线与物体表面作用的物理模型,表示了在物体表面上每一点处将光线从任何一个入射方向反射到任何一个出射方向的反射特性。接下来,首先介绍BRDF的相关概念,然后介绍实际绘制模型中所采用的相关技术。
5.2.1BRDF
想象有一个点光源照射到桌面,那么桌面上每一点都只接收到该点光源的光照。如果从各个不同的方向来观察那个亮点,会发现亮点的亮度随着观察方向的不同而发生了改变。另外,如果视点不动,改变光源和桌面的相对位置,也会发现亮点的亮度发生了相应的改变。这说明在给定物体材质后,一个表面对不同的光线入射角和反射角的组合,拥有不同的反射率。BRDF就是利用这种表面反射性质对光线和物体表面作用以及传播进行全面描述的物理量。
具体来讲,BRDF是描述光线与物体表面交互的模型,定义为给定出射方向上的辐射能量与入射方向上的辐射能量的比率。因此,BRDF可以记为如下表达式: f(θi,φi,θo,φo,λ)=dEo(θo,φo)dLi(θi,φi,λ)(5.1)其中,(θo,φo)和(θi,φi)是采用球极坐标定义的三维空间中入射光线和出射光线的方向(如图5.5(a)所示),dLi和dEo分别代表入射光能量和出射光能量,λ则是入射光线的波长。这里,由于一般的BRDF需要处理物体表面上半球范围内的各个方向,所以采用了出射或入射方向相对于法向的夹角θo和θi,称为极角(Polar angle),以及方向在平面上的投影相对于平面上一个坐标轴的夹角φo和φi,称为方位角(Azimuthal Angle)。那么,对于各向同性的物体材质,当入射方向和出射方向同时绕法向旋转时,BRDF值保持不变,此时可以表示为f(θi,θo,φ,λ)。
从公式(5.1)可以看出,BRDF的输出结果是一个数值,表示了在给定的入射条件下,在出射方向上反射的能量相对于入射能量的比重。显然,不同的材质会造成物体表面各点处不同的比重值。从物理学光子的概念出发,BRDF也可以解释为入射光子沿特定方向离开的概率。而从物理学辐射度的概念考虑,由公式(5.1)定义的BRDF实际上是辐射率和辐照度的比值。辐射率(Radiance),表示每单位立体角在单位面积上的辐射通量,也就是单位立体角范围内的辐射度。辐照度表示到达单位面积上的辐射通量。这样就可以简洁地描述出入射光线经过某个表面反射后,如何在各个出射方向上分布。
BRDF对于模型绘制是非常重要的。因为通过BRDF,就可以了解光线与不同材质的物体表面的相互作用情况,进而反映了物体本身的物质属性。那么在此基础上,光照模型就会变得非常简单。例如,通过对物体表面的BRDF进行积分求和,便可以获得表面上的光强分布,进而得到绘制结果(如图5.5(b)所示)。
图5.5基于BRDF的绘制效果
利用BRDF进行绘制的关键是如何预先获取满足相应材质属性的数据,从而简化绘制时针对BRDF数值的实际计算过程。目前主要有三种BRDF模型用于数据的获取: 经验模型、物理模型和测量模型。
1. 经验模型
经验模型是根据光与物体相互作用规律的经验提出的数学模型。本节将着重介绍若干典型的经验模型,例如Gouraud模型、Phong模型等。这些模型的绘制方程中所涉及的各类漫反射系数、镜面反射系数、高光系数等都是根据经验设置,并非来自实际的物理规律。在此基础上,计算相应的BRDF数值。因此,经验模型不一定符合真实世界的物理规律,但能够模拟大部分光学现象和光照效果,计算量相对较小。
2. 物理模型
物理模型是指根据物理原理对光线传播及其与物体表面的作用进行建模。例如5.4节中介绍的辐射度模型,它就是基于热传导模型来模拟光能量在空间中的传播和分布情况,以此获得BRDF数值。这种模型符合物理规律,但是计算量比较大。
3. 测量模型
图5.6BRDF数据(图片来自[38])测量模型是指利用光学设备从实际物体的表面直接来获取BRDF数据。例如采用测角仪、图像双向反射计,都可以根据入射角和出射角测量得到反射信息,从而得到BRDF数值。这种模型可以更为准确地获取实际场景中光照分布情况,但是数据采集的成本较高,往往需要借助专业设备,并且构造专门的数据集进行存储。图5.6展示了一种BRDF测量设备—光学测角仪,能够捕捉来自不同方向的反射光线。在此基础上,就可以对不同材质的物体表面进行测量,建立BRDF数据集。
从计算机图形学发展历史来看,经验模型是最早被提出且广泛使用的BRDF模型,解决了许多几何模型和场景在实时真实感绘制时的问题。因此,接下来着重介绍若干基于经验模型的BRDF模型,又称为着色(Shading)模型。
5.2.2着色
着色,顾名思义就是要确定几何模型在屏幕上显示时所对应的像素颜色。本节介绍的着色模型属于局部绘制技术的范畴,也就是只考虑光线和物体表面上每一点处作用所产生的绘制效果。这种着色技术大致可以分为两种类型: 平直着色(Flat Shading)和平滑着色(Smooth Shading)。这两类技术主要针对多边形表示的多面体几何模型的绘制。平直着色,是物体表面上属于同一个多边形的所有像素均使用同一种光强效果来填充,例如选用第一个顶点的颜色作为该多边形内部所有点的颜色。因此,平直着色往往产生不连续的视觉效果,表现为如图5.7(b)所示的相邻多边形在边界处产生明显的差异,称为马赫带效应。平滑着色,是对顶点的颜色、法向等属性进行插值运算,使得多边形面片内部各点的光强效果都会有所变化,由此产生表面连续的视觉效果。Gouraud着色模型和Phong着色模型是两种典型的平滑着色技术(如图5.7(c)和图5.7(d)所示)。
图5.7局部着色模型绘制效果对比
1. Gouraud着色模型
Gouraud着色模型是通过插值多边形顶点的光强来产成连续的绘制效果。该模型是由Utah大学Henri Gouraud在1971年提出。从绘制结果的视觉效果来看,Gouraud着色能够比平直着色产生更加光滑的颜色分布效果,有效减少了物体表面上相邻多边形过渡时的颜色变化,一定程度上减轻了马赫带效应。
Gouraud着色算法主要包括三个步骤: ①计算每个多边形顶点处法向量; ②采用光照模型计算顶点处光强; ③采用双线性插值计算多边形内部每点的光强。该算法中每个顶点的法向量,大多是通过计算所有共享该顶点的多边形面片的法向量的平均值得到。这实际上是对该顶点处物体表面弯曲程度的一种近似表示。如图5.8(a)所示,顶点vi的法向量记为ni=∑Kj=1nj/K,其中K表示和该顶点相邻的多边形的个数。接下来计算每个顶点处的光强。这需要根据光源、材质等性质进行计算,相应的内容会在Phong着色模型中一并介绍。最后,对顶点的光强进行双线性插值,得到多边形内部每点的光强(如图5.8(b)所示)。
Gouraud着色模型计算简单快速。由于是对顶点光强进行线性插值,在边界处的颜色连续性相比平直着色有了较大提高。但是,对于简单的多面体几何模型,仍然存在马赫带效应,其本质原因在于光强的线性插值,而光强又是根据模型表面的几何形状进行计算。同时,Gouraud模型难以较准确地描述高光现象,因而不适合具有优良镜面反射特性的光滑物体表面的绘制。
图5.8Gouraud着色模型
例题51三角形Gouraud着色的颜色插值。
问题: 假设右图所示的平面三角形,其三个顶点A、B、C的坐标分别是(0, 0)、(2, 1)和(1, 2),对应的RGB颜色分别是(255, 0, 0)、(0, 255, 0)和(0, 0, 255),试写出采用Gouraud着色的颜色插值绘制该三角形的伪代码。
解答: 假设A、B、C三个顶点组成的三角形是f,那么对每一个内部像素(x, y)进行着色的伪代码是function Gouraund (L, M, V, f)
for each pixel (x,y) in f do
k1 ← |y - A.y| / |C.y - A.y|
k2 ← |y - B.y| / |C.y - B.y|
D ← Point (k1 × C.x - (1 - k1) × A.x, y)
E ← Point (k2 × C.x - (1 - k2) × B.x, y)
colorD ← k1 × colorC + (1 - k1) × colorA
colorE ← k2 × colorC + (1 - k2) × colorB
k ← |x - D.x| / |D.x - E.x|
color\[x\]\[y\] ← k × colorE + (1 - k) × colorD
end for
end function□
2. Phong着色模型
为了进一步提高平滑着色的视觉效果,Utah大学的另一位研究人员、Bui Tuong Phong改进了之前的Gouraud着色模型,实现了对局部光照模型更加准确的模拟。与Gouraud 着色时插值顶点光强不同,Phong着色技术首先插值多边形顶点处法向量,然后根据光源位置、插值得到的法向等计算多边形内的每一点处的光强。这样在进行光照计算时,充分考虑了物体表面的几何形状。因而,Phong模型可以更准确地模拟光照效果。Phong着色算法主要包括三个步骤: 
(1) 计算多边形顶点处法向量;
(2) 采用双线性插值计算多边形面片每一点处的法向量;
(3) 通过插值法向量计算每点处的光强。
因此可以看出,Phong着色和Gouraud着色的主要区别在于第(2)步和第(3)步。其中,第(2)步可以通过类似Gouraud着色时光强插值的方式对法向量进行插值,也就是对法向量的分量依次进行插值。下面具体介绍第(3)步,这也是Gouraud着色模型中计算光强的基本方法。
通常情况下,物体表面上某点处的光强可以看作三种光照分量与物体表面作用后光照效果叠加的结果。这里具体包括三种光照分量,分别是环境光La、漫反射光Ld和镜面反射光Ls所产生的效果。其中,漫反射光和镜面反射光是点光源发射的光线和物体表面作用的效果。物体表面对这三种光照具有不同的反射属性,分别通过环境光反射系数ka、漫反射系数kd和镜面反射系数ks来描述。这三种系数反映了物体材质对不同类型的光线能量吸收和反射的程度。通常情况下,这三种系数取值都是介于0到1之间。
如图5.9所示,假设物体表面上的p点到光源的方向矢量是l、到人眼视点的方向矢量是v,同时在p点处的法向是n、镜面反射的方向矢量是r,那么上述各种光照效果可以通过以下的方式分别进行计算。
图5.9Phong和BlinnPhong着色模型中的光线分布
1) 光照效果1——环境光反射
由于环境光在空间中每一点处的光强是均匀分布的,那么对应于环境光反射强度可以表示为Ia=kaLa。因此,物体在环境光照射下各点明暗程度是一样的。
2) 光照效果2——漫反射
由于光线照射在物体表面后会朝各个方向均匀反射光线,那么同一点在不同角度下看到的表面就会呈现相同的亮度。这就意味着漫反射光强和反射光线方向无关,而入射光线和法向夹角以及漫反射系数kd就会影响漫反射光强。具体来讲,漫反射光强可以表示为Id=kdLdcosθ=kdLd(l·n),其中θ是表面法向n与入射光线方向相反的向量l的夹角(如图5.9(b)所示)。进一步,将前面所述的环境光反射效果加入到漫反射效果,构成了如下朗伯光照模型: I=kaIa+kdId(l·n)(5.2)其中,ka和kd分别是环境光反射系数和漫反射系数。通过公式(5.2),就可以准确地模拟各向同性的粗糙物体表面上的光照效果。
3) 光照效果3——镜面反射
遵循光的反射定律,也就是反射角等于入射角。因此,人眼只能在表面法向的反射方向一侧才能看到入射光的反射光。然而,实际物体表面复杂的物理性质会使得光滑表面呈现出一定的高光区域,也就是亮度集中的区域。这是由于入射光被反射后,绝大多数会集中在理想反射方向的附近区域。高光区域的大小可以通过镜面反射系数ks指定。一般情况下,镜面系数越大,物体表面形成的高光区域越小,因而反射光强与反射光线和法向的夹角以及镜面反射系数有关。具体来讲,镜面反射光强可以写为Is=ksLscoseβ=ksLs(v·r)e,其中β是反射光线r与人眼视线方向矢量v的夹角(如图5.9(b)所示),e是高光系数。通常情况下,e越大,表示物体表面越接近理想的镜面反射表面,镜面反射形成的高光越集中;e越小,表示物体表面越接近漫反射表面,镜面反射形成的高光越分散。
如图5.10(d)所示,将上述三种光照效果进行综合,按照相应的系数做线性叠加,最终就可以得到Phong着色模型所产生的绘制效果。该模型可以写成如下表达式: I=kaIa+kdId(l·n)+ksIs(v·r)e(5.3)其中,ka、kd和ks分别是环境光反射系数、漫反射系数和镜面反射系数。
相比于Gouraud着色模型,Phong模型的特点是能够在多边形的边界处产生更为连续的视觉效果,适合光滑物体表面的绘制,尤其是具有显著高光区域的模型。但是,Phong模型的计算量明显比Gouraud模型大。这主要是由于除了向量点积运算,还涉及指数运算。
图5.10Phong绘制效果
例题52Phong着色模型。
问题: 如右图所示的三角网格圆球面,写出采用Phong着色模型进行绘制的伪代码。
解答: 根据指定的光源L、材质M和视线D,对每个△ABC覆盖像素片元f进行着色的伪代码是function Phong (L, M, V, f)
for each fragment f on ball do
(A, B, C) ← getTriangleVertice (f)
normal ← normalTrilinearInterpolation (f, A, B, C)
L ← getLight ()
M ← getMaterial (f)
D ← normalize (viewPos - f.pos)
ambient ← L.ambient × M.ambient