Skip to main content

1.1 什么是全局光照

实际上,计算机图形学中所涉及的光照都是指全局光照,但是由于渲染方程计算的的复杂性,早期工业中一般忽略间接光照,仅考虑光从光源出发,经过表面一次反射/折射之后到达人眼或者场景中的虚拟摄像机。这种不考虑环境其他非光源表面对着色影响的光照模型称为局部光照(local illumination)模型,反之则称为全局光照(global illumination)模型。如今工业中使用的主流商业3D游戏引擎,如Unreal Engine,Unity等大都支持某种程度的全局光照。

由于硬件计算性能的限制,我们很难在产品中达到物理上正确的渲染品质。现阶段计算机图形学领域的主要目标是渲染出令人信服的(convincing),写实的(realistic)图像品质,所以不同公司的产品往往使用不同的方法来实现全局光照模型,这些不同的方法在品质上甚至会有很大的差异,因此我们很难用一种技术的标准来衡量全局光照,但我们可以从另一个角度,即从光与物体的光学特性上去定义一个令人信服的全局光照模型应该实现怎样一些效果。

当然这里仅列出一些目前主流的游戏引擎或其他一些离线渲染产品都在实现的一些光学现象,这并不是一个标准,也不是全局光照的全部内容。通过这样一些现象,我们可以对全局光照有一个直观印象,以及理解作为令人信服的图形渲染目标,哪些核心因素是一个优秀的全局光照模型应该满足的。

注意,本书选择在还没有开始介绍任何具体的图形学知识之前讨论这些全局光照现象,是希望能够使用非图形学的术语更加直观地讲述这些现象,因为这是整本书都在试图达到的目标。

阴 影

阴影(shadows)对于人眼对3D场景的立体感觉非常重要,在实时渲染领域,直接光照(如点光源,聚光灯以及直线光源等)的渲染通常不考虑物体间的遮挡关系,这主要是为了利用GPU快速的光栅化特性,所以需要另一个单独的通道来处理阴影。这个通道也可以通过使用GPU的光栅化特性,在运行时动态生成阴影贴图(shadow maps),或者利用GPU的模板测试生成阴影体积(shadow volume)等比较简单的方法实现。

阴影贴图是以光源中的单个点为观察点,利用GPU光栅化渲染的一张图,通常它只包含深度值,所以它记录的只是物体边缘的几何信息,因此产生的阴影为硬阴影(hard shadow)。对于硬阴影,通常还需要使用适当的反走样措施,关于反走样技术将在本章第[sec:intro-sampling]节讲述。

非点光源则具有一定的面积,其生成的阴影为软阴影(soft shadow),一个软阴影的定义包含3个部分:即完全遮挡的本影区(Fully Dark),部分光照被遮挡的半影(Penumbra)区,以及完全没有被遮挡的光照(Fully lit)区,如图1所示。其中半影过渡区可以通过表面到遮挡物体和光源的距离,以及光源的面积大小三个参数来近似计算,本书将会详细介绍相关的阴影计算,《Real-Time Shadows》[cite b:rts]包含了大量关于阴影技术的介绍。

图(1):软阴影形成的机制,由于光源具有一定的面积,使其包含完全遮挡,部分遮挡及完全光照三个区域(图片来自PowerVR)

环境遮挡

对于更大面积的环境光(ambient light),如环境贴图,天空盒,或者来自其他物体反射的间接光照等,其光源往往来自整个半空间,往往不可能通过以上的方式计算物体间的遮挡效果。在早期的光照计算中,人们通常忽略这种阻挡关系,这造成场景中的缝隙等被较多遮挡的地方比实际的效果要明亮,如图2(a)所示,这是因为对于这些地方我们并没有考虑它的遮挡关系,这使得整个物体表面会看起来更平坦,缺乏立体感。

图(2):AO对渲染的影响,注意(c)图中墙砖的裂缝,以及人物颈部等地方由于部分被遮挡显得更暗 (图片来自Unreal Engine 4官方文档)

[cite a:Shape-from-shadingonacloudyday]首次指出了这种环境阻挡对于图形识别以及增强图像质量的重要性,2010年Hayden Landis, Ken McGaugh和Hilmar Koch因为推进环境遮挡(ambient occlusion,AO)在渲染技术中的运用而获得当年的奥斯卡科学技术奖,之后AO被大量应用于电影工业,如今主流的商业游戏引擎也几乎都支持某种程度(静态或动态)的AO。

AO的计算实际上是要针对每个点,在该点法线对应的半空间上,针对每一个方向对可见性函数(visibility function)进行积分运算,其值为一个介于0到1之间表示遮挡程度的值。对于静态的场景我们可以预计算出这个值;在离线渲染的环境下,可以使用蒙特卡洛方法使用随机采样的方式求积分【cite a:GlobalIlluminationandAllThat];而对于实时环境,则需要更高效的方法,例如由CryTek提出的基于屏幕空间的环境遮挡(screen space ambient occlusion,SSAO),以及Unreal Engine 4使用距离场来加速AO的计算。

反 射

光线在物体表面之间穿梭,经过多次反射或折射最后才会进入摄像机,形成图像,如果一个表面是光滑的,或者不是完全粗糙的,则这些表面可以反射它周围的环境,表面越光滑,则其反射的场景越清晰,否则则越模糊。反射几乎无处不在,它是高质量图形渲染不可缺少的部分,如图3所示。

图(3):反射无处不在,较光滑的表面能够比较清晰地反射周围的环境,图为台湾桃园国际机场的走廊

反射通常也是使用其他一些近似技术来计算。最经常使用的是基于图像的光照技术(image-based lighting,IBL),这种技术通常将要反射的“环境”渲染为一张图,然后渲染时通过查询这个贴图来计算来自周围的环境光照;对于粗糙的表面可以使用过滤的技术来实现粗糙表面的效果,这种技术大大减少了反射效果的计算时间,本书将在第10介绍基于图像的光照技术。

图(4):使用基于图像的技术渲染物体对环境的反射,整个周围环境被渲染到一个贴图中,表面着色时直接将这个贴图作为入射光源,其中环境贴图的光照是与观察点的位置无关的

对于比较远的环境,可以认为“环境”是和位置无关的,而仅与方向有关。环境贴图可以使用一个放置于场景中心的一个鱼眼镜头的照相机来生成,整个环境被制作成一张立方体贴图(cube map)或者球面贴图(spherical map),如图4所示,通常游戏中的天空盒就是一张远距离的环境贴图。

间接光照

除了上述镜面或光泽反射的光照,环境对于漫反射表面的影响非常重要,它最重要的效果称为颜色渗透1(color bleeding),例如一个红色的地毯靠近一侧墙面则会使墙面呈现粉红色,颜色渗透的效果如图5所示。

图(5):环境对漫反射表面的影响,这种效果称之为颜色渗透,这种效果的计算非常昂贵,但是这种效果对于全局光照非常重要

间接漫反射几乎是最重要的全局光照效果,它的计算特别昂贵,其涉及渲染方程针对整个半球空间的积分计算,目前主要的解决方法还是预处理,间接漫反射光照的处理主要有两类方法,一类是基于光照贴图(light map)的方法,这类方法仅针对静态场景,由于漫反射表面向各个方向反射的光照是相同的,因此表面的光照值可以被缓存起来,很多方法可以用来生成光照贴图,例如光线追踪,辐射度方法,辐射照度缓存以及光子映射等方法。

对于动态物体,如角色,移动的交通工具等,常用的处理方法则是在空白空间对环境光照进行稀疏采样,在Unity中这些采样点称为一个光照探针(light probe),如图6所示,然后在运行时使用插值的方法来计算间接光照。这样做的理由是因为漫反射通常都是低频的,相邻点之间的颜色值变化不大,其间的点的值可以通过插值计算。由于这些采样点是预处理的,所以动态物体并不能影响场景中其他物体,它只能接受来自其他静态环境的影响,这方面可以参见后面第[chp:prt]章的内容。

图(6):Unity使用光照探针对环境进行采样,这发生在预处理阶段,在运行时阶段,渲染器从邻近的采样点中取值对其间的点进行插值(图片来自Unity官方文档)

焦 散

在全局光照模型中,焦散(caustics)效果尤其明显。广义的焦散是指光从光源出发,经过至少一次光泽反射,最后通过一个光泽或漫反射面 反射后进入摄像机。在计算机图形学中尤其指光通过光泽面的反射或折射后,多束光落在同一个漫反射表面点上(例如由于玻璃或水面等弯曲面使折射后多束光落在桌面上),导致这些点的光照特别明亮,如图7中所示的一些常见焦散的效果。

图(7):由于多束光经过反射或折射后落在同一点上,焦散效果在全局光照中特别明显(图片来自Wikipedia)

对焦散的渲染尤其困难,其主要原因是这些方向光线的采样几率很低,甚至几乎可以认为是零,导致一般的采样方法根本不能获得足够的信息,例如光子映射技术就是使用完全不同于采样的回归方法才能比较好的处理计算焦散。

散 射

到目前为止,所有我们讨论的全局光照现象,都仅限于光与物体表面进行交互。在现实环境中,许多物体部分或全部是半透明的(translucent):即光进入物体表面后,部分被吸收(absorbed),部分发生散射(scattered)最后从物体表面发射出去,其中这个出射点的位置可能和入射点的位置不一样。

由于散射效果的计算相当复杂,因此和其他前面提到的技术一样,计算机图形学中也存在很多近似的方法来处理散射效果。特别地,对于散射的计算,存在两大类方法,它们分别处理散射导致的两种比较明显的子分类效果,即次表面散射和参与介质。

次表面散射(subsurface scattering)是散射中最复杂的效果,它表示由于物体内部存在介质的不连续性,导致折射进物体内部的光在经历多次散射之后,重新从另一个位置反射回空中。它要求比较真实地模拟散射效果,并且它处理的都是要求视觉表现比较真实的材料,例如大理石,皮肤,叶子,蜡烛,牛奶等。例如对于皮肤,它有约6%的光被直接反射,剩下94%的光被散射,并且散射只发生在表面以下一小部分厚度的空间内,如图8所示。

图(8):光可以进入皮肤表面,由于物体内部介质的不连续,在表面以下部分区域内发生多次散射,然后从另一个地方反射回空中

关于次表面散射,本章第[sec:intro-bsdf]节会介绍Disney使用的近似然而精确度很高的次表面散射模型,它用在了电影《超能陆战队》中除头发以外的所有次表面散射情形。

参与介质(participating media),例如云,烟,雾等在自然界是普遍存在的,它们也导致了很多有趣的视觉现象。当光在参与介质中传播时,部分被吸收,其他则经过多次散射后从不同的位置离开表面。参与介质与次表面不同的是,次表面往往只是物体表面很浅的一层,而参与介质往往整个内部都是半透明的,光线能够从一边进入,然后从另一边离开。参与介质能够有效地增强环境的氛围,以及对场景深度的感知。

图(9):参与介质在大自然中无处不在,例如云层,空气,烟雾等,并且对整个环境的光照有非常大的影响

本书将在第6章介绍一些参与介质的渲染技术。

Footnotes

  1. 通过后面第[sec:intro-material-model]节对材质模型的学习,颜色渗透是由于漫反射光从物体内部反射回空中时,被乘以了一个反射率,这个反射率baseColorbaseColor即是物体表面的真实颜色,因此漫反射光携带了物体的颜色,从而能够影响周围的环境。