Chapter 10 – Local Illumination 局部光照

在第九章中,我们学习了基于物理的材质理论,以及如何通过精准光源来模拟这些材质。有了这些知识点之后,我们就能够模拟光与物体表面的交互,并且计算出到camera方向上的光的辐射率。这一光谱辐射率就是最终所显示的图像中的像素颜色。

不过到现在为止,我们所研究的效果都是基于点光源与方向光源,这限制了表面所接受的光的方向。现实中,物体表面将从各个角度各个入射方向接受光。外界的物体并不只是被太阳所照亮。否则,那些处于阴影中的物体,或者背离阳光的物体将会是完全黑色的。天空是一个重要的光源,其由阳光在大气的散射所造成。如果没有天空这一光源,那么我们所处的环境将与月球相似。

在现实中,光照永远都不是精准的。为了实现一个更为仿真的光照模型,我们需要在表面的入射方向上的半球范围内对BRDF进行积分。在实时渲染中,我们更倾向使用某些渲染等式来模拟这些积分运算。通常,我们会避免对多个采样(光线)进行平均,因为这种方法的计算过程开销太大。如下图所示,左侧部分表示我们在第九章中所使用的积分,表面区域以及精准光源。右侧部分则是我们本章节的目标,将我们的着色运算延伸至光源表面的积分。

本章节的主要目标就是探索这一类的解决方案。尤其是通过计算多个精准光源的BRDF来拓展我们的着色模型。一般来说,为了找到开销较低的解决方式,我们需要模拟光源,模拟BRDF。非常重要的一点就是在一个合理的框架内计算最终的着色结果。并且知道那些因素对最终的图像起着决定性作用,对于这些内容我们需要花费更多的时间与精力。本章的开头,我们将学习区域光源的积分公式。这一类光源是场景中主要的光源,其负责主要的直接光照强度。对于这一类光源,我们需要计算其对应的阴影,因为light leak将会造成非常明显的显示错误。之后我们将学习如何表现更为范例化的光照环境。对于这一类光照,一般我们会选择模拟的方式。环境光照一般用于大型且复杂的光源,但是这部分光源的强度并不会太大。例如,天空和云朵所散射的光,场景中的大型物体所反射的间接光,以及微弱的方向区域光。这一类光源主要用于平衡画面的最终表现,以防止其太暗。即使我们考虑了间接光的影响,但我们仍然没有涉及global illumination(全局光照),这一部分内容将在下一章节中进行学习。

10.1 区域光源

在第九章中,我们描述了理论上的额,无限小的光源:精准光源与方向光。下图展示了物体表面上某一点的入射半球,其分别对应精准光源与区域光源。左侧的光源使用了,我们在9.4节中对于光照的定义。光源从一个方向lc来照亮表面上的一点。光源的亮度由其颜色clight表示。点光源或者方向光源对于方向v上射出的辐射率Lo(v)的影响为πf(lc,v)clight(n·lc)+。右图中的区域光源的亮度由其辐射率Ll表示。基于表面上的有一点,区域光形成了一个立体角ωl。其在方向v上射出的辐射率的影响则是f(l,v)Ll(n·l)+在立体角ωl上的积分。

对于无限小的光源的模拟可以表示为以下等式:

也就是说,一个光源对于表面某一点的影响取决于它的辐射率(Ll)以及表面上该点所能“看到”的光源尺寸(ωl)。正如我们在9.4节所学习的,在现实生活中并不能模拟出点光源与方向光源,因为这两种光源对于表面上的一点的立体角为0,这也意味着无限的辐射率。理解了这种模拟所造成的视觉错误,我们才能知道何时去使用模拟等式,或者当我们无法使用模拟等式时该使用哪一种方法来解决问题。而视觉错误主要取决于两个因素:光源的尺寸,基于着色点所形成的立体角,以及表面的光滑度。

下图展示了镜面反射高光的尺寸与形状和物体表面材质的粗糙度以及光源尺寸之间的关系,其中五个球体,粗糙度从左至右不断增加。对于一个较小的光源,与视野角度相比,其形成的立体角如果较小,那么视觉错误也会较小。光滑的表面更能显示出光源大小的区别。一般来说,区域光射向表面上的某一点与表面BRDF的镜面反射lobe都属于球型函数。而视觉错误中的决定性因素在于光射出的立体角与BRDF的镜面反射的立体角的比例。

最后我们可以注意到,区域光的所形成的镜面反射的高光效果可以使用一个精准光源与不断增加的表面粗糙度进行模拟。这一观察结果得到一个开销较小的模拟方式,而不是对区域光源进行积分。这样解释了为什么许多实时渲染的应用仅仅使用精准光源就能形成较为真实的效果。但是,显然这种做法是不好的,这无异于将材质的属性参数与光照参数进行了耦合。当我们改变场景中的光照环境后,美术便不得不改变相应的材质参数。

对于Lambertian表面(法线映射贴图对于最终的着色结果有着几乎线性的影响)的特殊情况,将一个点光源用作区域光源。对于这一类表面,射出的辐射率与irradiance(辐照度)成正比:

等式中的ρ表示表面的subsurface albedo(子表面反射率)或者漫反射的颜色。通过这一等式,我们可以推断出计算irradiance的等式为:

vector irradiance,这一理念能够帮助我们理解irradiance是如何影响区域光源的表现。Gershun第一次引入了vector irradiance这一概念,并将其称为light vector,之后该理念被Arvo进一步拓展。我们可以使用vector irradiance将任意尺寸任意形状的区域光源转换为一个点光源或者方向光源。

假设空间中的辐射率分布Li进入了点p。假设Li与光的波长无关,因此其可以由一个标量表示。对于每一个入射方向为l的无限小的立体角dl,我们构建一个向量,其与l平行,且长度等于这个方向上的辐射率乘以dl。最终,所有的这些向量加总得到vector irradiance e

等式中的Θ表示对于整个球体的方向进行积分。

上图展示了如何计算vector irradiance。左侧部分,点p被不同现状,不同尺寸,以及带有不同的辐射率分布的光源所包围。物体上的黄色亮度表示射出的辐射率的强度。橙色的箭头表示所有带有入射辐射率的向量,这些向量的长度等于该方向上的辐射率乘以该箭头(向量)所覆盖的无限小的立体角。理论上说,有着无限数量的箭头。右侧部分,vector irradiance(大的橙色箭头)就是这些向量的总和。

而vector irradiance能够用来计算p点上任何平面的net irradiance,只需要进行一次点乘运算:

其中n表示平面的法线向量。而一个平面的net irradiance平面的“正面”与“反面”的irradiance差别。单单一个net irradiance还不能用来进行着色。但是,如果没有辐射率从背面射出(也就是说,根据光的分布,向量l与向量n的夹角不会超过90°),那么E(p,-n)=0,也就是说:

我们可以使用上述等式来模拟一个区域光源的vector irradiance,只要表面的法线向量n不会与区域光源的任意部分的夹角大于90°即可。下图表示一个单一区域光源的vector irradiance。左侧部分的箭头表示用于计算vector irradiance的向量。右侧部分,橙色箭头就是vector irradiance e。红色的许仙表示区域光源对于物体影响的边界,红色的向量定义了物体表面法线的限制(每一个红色虚线都与一个红色箭头垂直)。如果法线超过这一限制,那么这意味着法线可能与区域光源的某些部分的夹角大于90°。这一类法线就不能使用e来计算它们的irradiance。

如果Li与光的波长有关联,那么我们就不能单单定义一个向量e。但是,通常来说,带有颜色的光在每个点都有着相对统一的光谱分布,这意味着我们可以将Li归入颜色c’以及一个与波长无关的辐射率分布Li‘。这样的话,我们就能为Li‘计算e并且将上述等式乘以n·e

现在,我们已经将一个任意形状任意尺寸的区域光源转换成了一个方向光源,同时没有造成任何错误。

假设有一个球型光源,其中心点位于pl且半径为rl。那么光源将从球体上的每一个点射出恒定的辐射率Ll。对于这一类光源,上述等式将转换为:

上述等式与omni light(5.2.2小节)相同。

所有上述的这些等式的成立条件都是没有“背面”的irradiance。也就是说,区域光源的任何一个部分都不能位于“水平面以下”,不能被表面所遮挡。对于Lambertian表面,去于光远与点光源的不同点就在于“遮盖”的不同。点光源所射出的irradiance,只要不被遮盖,就会遵守余弦定律。Synder为球形光源提出了一中表达式,其考虑到了遮蔽的因素。该表达式非常复杂。但是,由于其只取决于两个变量(r/rl和θinl的夹角),我们可以预先计算其结果并将其存储在一张二维的贴图中。Snyder也提供了模拟算法,其适用于实时渲染。

在本小节的开头处我们看到,区域光对于粗糙表面的影响较小。因此我们可以使用一个“不那么”基于物理的方式来模拟区域光对于Lambertian表面的影响:wrap lighting。在该技术中,我们会对n·l的值进行一定的修改,而不是单纯将其clamp为0。Forsyth提出了一种形式的wrap lighting:

等式中的kwrap是一个范围0到1的值,0表示点光源,1表示区域光源覆盖整个半球区域。Valve所使用的模拟区域光源的等式为:

一般来说,如果我们计算区域光照,那么还需要修正我们的阴影计算方式。如果我们不这么做,那么某些区域光源的效果将会被粗糙的阴影效果所抵消。对于区域光源来说,最显著的效果可能就是soft shadow。

10.1.1 光滑材质

区域光源会更多地影响non-Lambertian表面。Snyder为球型光源提出了一种解决办法,但是其限制在原始的reflection-vector Phong材质模型,而且非常复杂。行业内现在更多得会使用模拟。

区域光对于光滑表面的主要影响就是高光效果。高光的尺寸与形状类似于区域光的尺寸与形状,但是高光的边缘部分将基于表面的粗糙度产生模糊的效果。根据这一观察结果,我们可以进行相应的模拟。如下图所示,在左侧部分中我们为Blinn-Phong shader中的高光值设置了一个阈值。右侧部分,我们使用了未修正的Blinn-Phong shader。

在实时渲染领域,大多数用来模拟区域光源的做法都是基于一个理念,为每一个着色点找到一个相同的精准光源的设置。而这一理念与我们在第九章中对一个像素所覆盖的表面进行BRDF的积分的理念相同。这种模拟方法的开销也不会很高,我们需要做的就是改变着色等式中的输入变量即可。由于并没有改变其数学原理,一般来说,将其转换回原始着色等式的操作也较为简单。

其中的第一种模拟方法由Mittring提出,我们将其称为roughness modification,虚幻引擎的“Elemental demo”使用了这一技术。首先我们需要找到一个椎体,其包含了光源在表面入射方向的半球上的irradiance。之后,我们在specular lobe上设置一个类似的椎体,其包含了大多数BRDF。如下图所示。page383-page386…

10.1.2 General Light Shapes

到现在为止,我们已经学习了几种方法来计算发射出统一irradiance的球型区域光源的最终着色结果。这些方法大多使用模拟的手段来实现区域光的特点,且这些方法的开销并不大适用于实时渲染。但这也造成了最终的显示效果可能会不同于实际的效果。然而,即使硬件的计算能力不断升级,我们某一天能够使用精确的技术来渲染区域光源,还是会有一个严重的问题,就是我们的光照模型。现实世界中的光源,基本上不会是简单的球型,也不会是发射出统一的irradiance。如下图所示,常用的光源形状有球形,矩形(卡片形),tube试管形(线条形)以及发散试管形。

不过,在实践中,球型区域光仍然非常有用,因为它们提供了最简单的方法来打破光照与表面粗糙度之间的错误关系(由精准光源造成)。但是球形光源只能用来模拟那些尺寸相对较小的光源。

球形光源的一个最简单的衍生就是tube光源(其也被称为capsule),我们可以使用这一类光源来表示现实世界中的日光灯。如下图所示。

对于Lambertian BRDF,Picott展示了一种闭型的光照积分公式,其通过两个带有强度衰减的点光源进行模拟:

其中p0p1表示光源的两个终点,而n则是表面的法线。Picott提出了一种Phong specular BRDF的积分方法,其假设一个点光源位于capsule光源的某一个部分。通过这一方式,我们能将线性光源转换为点光源,这样我们就能将任何球形光源模拟为capsule光源。

在球形光源的例子中,Karis提出了一种相较于Picott的方法更为高效但是准确性略低的方法,其使用线段上距离反射向量最近的点,并且使用一个缩放的方程来保持能量守恒的定律。

通过上述这些方法,我们很容易就能将点光源模拟为其他形状的光源,例如环形或者贝塞尔曲面形,但是一般我们不会这么做,因为这会使得我们的shader拥有太多的分支。理想的光源形状能够用来模拟许多现实世界中的光源。其中最有意义的一种就是planar area light(平面区域光),例如,矩形的card light,disk light或者其他多边形光源。这种光源能够用于模拟“发射性平面”,例如公告板或者电视屏幕,其主要的用处是模拟许多复杂的光照模型,或者模拟由墙面反射的光线。

最有实践意义的模拟card light的方法由Drobot提出,其也基础也是通过点光源进行模拟。Drobot使用了平均数理论,并且发现能够用于模拟的点光源应该位于全局光照积分的最大值。

对于Lamber BRDF,其积分为

其中Ll表示光源所射出的恒定radiance,ωl则是光源的几何形状所对的立体角,rl则是从物体表面到光源平面在方向l上的长度,(n·l)+则是Lambertian中常规的clamp后的点乘结果。如下图所示,当点光源位于pc时,(n·l)+的值达到最大。其中p‘表示物体表面上的法线与光源所在平面的交点,而pc则是光源有限平面内距离p‘最近的点。之后,我们可以使用类似的方法求出1/r2l的最大值,也就是下图中的点p”。之后在找到光源几何体的边界上距离点p”最近的点pr。而上述积分等式的最大值,将位于pc与pr之间的某一个点:pmax=tmpc+(1-tm)pr,tm∈[0,1]。Drobot使用积分运算来找到最佳的代表点,之后再计算出平均值下最佳的tm

Drobot的这一方法还能用于模拟漫反射光照以及镜面反射光照。此外,他还提出了一种用于textured card light的算法,这一类光源的radiance不再是一个常量而是由贴图所决定。该计算过程将会使用一个三维的查询列表,其包光源所使用的贴图在不同半径下积分值。Mittring使用了一种类似的方法来模拟光滑表面的反射。

planar area light的更为范例化的情况则是polygonal area lights,Lambert最初为此提出了一个闭合形式的解决拌饭,适用于完美的漫反射表面。之后,Arvo改进了这一技术,使其适用于由Phong specular lobe模拟的光滑材质。具体的做法是将vector irradiance的理念延伸为更高维度的irradiance tensors。但是在实践中,Arvo的方法对于实时渲染来说开销太大。最近,Lecocq通过使用O(l)来模拟边缘的积分函数并将其延伸为half-vector-based BRDF,使得这一技术更具有实用意义。

到现在为止,所有的实时渲染邻域的区域光源一般都是采用模拟的策略,以简化计算的开销。Heitz使用了另一种不同的方法,linearly transformed cosine(LTCs),该技术更具有实践意义也更为精确。如下图所示,其核心理念就是线性转换的余弦技术,一个cosine lobe能够轻易地进行缩放,拉伸与旋转,而我们只需要一个3×3的转换矩阵即可。这是的cosine lobe能够在球体上模拟许多不同的形状。

此外,Heitz发现对lobe进行积分并不会因为矩阵转换而增加复杂性。我们能够通过逆矩阵来转换一个多边形并且在积分过程中抵消这个矩阵,这将使计算变为简单的cosine lobe积分。如下图所示。因此,对于其他BRDF以及其他的区域光源的形状,唯一需要做的就是找到球体上的BRDF函数,或者使用更多的LTC。而这些过程都能进行预处理,将结果存储在查询列表中,并与BRDF的参数:粗糙度,入射角进行关联。LTC这一技术适用于贴图化的多边形区域光源,也适用于常用的一些区域光源,例如card light,disk light与line light。LTC相较于点光源的模拟方法,开销更大,但是准确性更高。

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据