Chapter 9 – Physically Based Shading 基于物理的着色

9.8 物体表面反射的BRDF模型

一般来说,PBR中所使用的镜面反射BRDF都基于微面理论。在进行表面的镜面反射时,每一个微面都是一个绝对光滑的菲涅尔镜面。之前我们提到,这一类镜面将以单一反射方向来反射每一个入射光线。这意味着除非向量v平行于向量l的反射向量,否则每一个微面的micro-BRDF fμ(l,v,m)都等于0。基于给定的向量l与向量v,这意味着微面的法线向量m必须与向量l与向量v的中间向量对齐。而该向量被称为half vector h。如下图所示,我们将向量v与向量l相加再进行标准化之后得到了该向量(同时向量h与光线向量和视野向量所形成的夹角的角度相同):

当我们根据上一小节中所归纳的micro-BRDF fμ(如上所示)求出一个微面的镜面反射模型时,实际上在m≠h时,我们都将该等式的结果设为0。这样等于我们只需要求出m=h时的结果,因此,镜面反射BRDF将转换为:

关于具体的导数求解过程,大家可以参考Heitz的论文Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs。Hammon提出了一种通过计算n·hl·h而不是计算向量h的方式对BRDF进行了一定的优化,具体请参考PBR Diffuse Lighting for GGX+Smith Microsurfaces

在上述等式中,我们使用fspec来表示BRDF,以此表明其只模拟了表面(镜面)反射。在完整的BRDF中,还会模拟subsurface(有时也被称为漫反射)的着色过程。对于我们上面展示的简化等式,我们可以认为只有那些法线方向与向量h的方向相同(m=h)才会将光线向量l反射为v。如下图所示,只有红色的微面才会纳入反射光的计算。

因此,反射光线的数量则取决于那些法线与向量h相同的微面的数量。而这个值就是由D(h)表示,那些对于光线方向与视野方向同时可见的微面则由G2(l,v,h)表示,由每一个微面反射的光线则由F(h,l)表示。在计算菲涅尔函数F(h,l)时,我们使用向量h替代表面的法线向量。

同时,在masking shadowing函数中我们也会使用half vector,由于其角度不再会大于90°,因此我们不在需要之前等式中的χ+

9.8.1 Normal Distribution Functions(法线分布函数)

法线分布函数(NDF)会极大地影响物体表面外观的渲染效果。而NDF所表现的“形状”将会影响反射光线(specular lobe)所形成的椎体的宽度以及形状,其就是反射高光的外观表现。此外,NDF还会影响物体表面的总体粗糙度以及各种细节表现,例如反射高光效果的边缘是模糊的还是清晰的。

但是,specular lobe并不完全等价于NDF的形状。因此,specular lobe以及镜面反射高光的形状将会被物体表面的弯曲或者说弧度所影响而变形,也会被我们的视野方向所影响而变形。如果我们以glancing angle(较低的倾斜角)去看平面上反射的物体,那么变形会非常大,如下图所示。

上图的第一行左侧部分我们使用了非PBR的Phong反射模型进行渲染。这一反射模型所形成的specular lobe是基于反射向量对称的。这一类的BRDF常常用于早期的计算机图形学。第一行中间部分则使用了基于微面的PBR BRDF。第一行中左侧与中间部分分别表示一个光源以glancing angle照亮一个平面。

Isotropic Normal Distribution Functions(同向法线分布函数)

渲染中所使用的NDF大多是isotropic(同向的)——也就是说微面的法线将基于表面的宏观法线n形成对称。这样的话,NDF是一个只包含一个参数的函数,而该参数就是向量n与微面法线m的夹角θm。理论上说,NDF能够以cosθm作为参数,因为计算nm的点乘效率将会更高。

Beckmann NDF是第一个微面模型,其由optics community开发。其也是Cook-Torrance BRDF所选择的NDF。其表达式如下所示:

χ+(n·m)能够保证,如果微面的法线指向宏观表面法线的下方,那么NDF将为0。其也表示上述NDF模拟了微观表面的heightfield。参数αb控制了表面的粗糙度。其与微观几何面的坡度的均方根成正比,所以αb=0表示绝对光滑的平面。

为了求出Beckmann NDF的Smith G2函数,我们需要一个对应的Λ函数(请参考上一小节Microgeometry)。

Beckmann NDF是shape-invariant(形状不变的),这将会简化Λ。根据Heitz的论文,如果一个isotropic NDF的粗糙度参数的效果等同于缩放微观表面,那么该 NDF是shape-invariant。shape-invariant的NDF表达式如下:

其中g表示任意的单变量函数。对于一个任意的isotropic NDF,Λ函数取决于两个参数。第一个是粗糙度α,第二个则是入射向量(v或者l)的入射角度。但是,对于shape-invariant NDF,Λ函数只需要一个变量,就是a:

其中的s是一个向量,其可以表示v或者l。这样,Λ函数只需要一个参数,并且便于实现。单变量函数也更易于模拟曲线,也能由一维的数组所表示。

Beckmann NDF的Λ函数如下:

但是上述函数的开销较大,因为其包含了erf误差函数。因此,我们会将其转换为以下形势:

我们下一个要学习的NDF则是Blinn-Phong NDF。其广泛用于之前的计算机图形学中,但是在近些年被其他的分布函数所替代。不过,Blinn-Phong NDF仍旧应用于那些对计算速度有种种要求的平台(例如,手机硬件),其相较于本小节中的其他NDF,开销更小。

Blinn-Phong NDF由Blinn提出,其是Phong着色模型的延伸:

上述等式中的αp是Phong NDF中的粗糙度参数。该变量越高意味着表面越光滑,越低则是越粗糙。对于那些极其光滑的表面——例如完美的镜子,那么αp可能是一个无限大的值。将αp设置为0可以实现最大化的随机表面(统一的NDF)。但是,由于αp对于表面的影响并非均匀的,我们很难通过改变αp来直接控制表面的外观。如果αp的值本身较小,那么很小的改变也会影响表面的外观。但是对于原本就较大的αp,即使改变较大可能也无法影响表面的外观。因此,一般来说,我们会通过非线性的映射将αp设置为一个用户控制的值。例如,αp = ms,其中s是一个范围0到1之间的参数,而m则是游戏中αp的上限。在使命召唤:黑色行动中就使用了这一类映射,并且将m设置为8192。

当BRDF的某一个参数对于表面的影响并不是均匀的,那么我们就会使用这一类映射。这样,在引擎或者编辑器中,美术就能使用滑块或者贴图来设置线性的参数值。

当我们使用等式αp = 2αb-2 – 2时作为粗糙度参数时,Beckmann和Blinn-Phong的值相同。也就是说这两种分布将会非常接近,尤其是对于光滑表面。我们可以参考下图中的左上角的曲线图部分Blinn-Phong是蓝色的虚线而Beckmann则是绿色的实线。

Blinn-Phong NDF并非shape-invariant的,且对于其Λ函数并不存在一个解析等式。Walter建议使用Beckmann Λ函数,并且结合参数αp = 2αb-2 – 2。

同时,在1977年的论文中,Blinn将Phong的着色函数编入微面NDF中,同时还提出了另外两个NDF。在这三个分布函数中,Blinn推荐了一个由Trowbridge和Reitz求出的分布函数。但是当时该分布函数并未被大家留意,30年之后Walter再次发现了Trowbridge-Reitz分布函数,并将其命名为GGX distribution(GGX分布)。在最近几年中,电影以及游戏行业广泛采纳了GGX分布,并且成为最广为使用的分布函数。虽然“Trowbridge-Retz distribution”是技术上正确的命名,但是在文中我们仍然使用GGX作为其名称。GGX分布函数如下:

其中,αg控制了粗糙度,类似于Beckmann中的αb。在Disney的着色模型中,Burley修正了上述函数并将粗糙度“暴露”给使用者来控制,其映射等式为αg = r2,其中r是一个范围0到1之间的值可以由使用者来设置。这也意味着通过r通过以更为线性的形式来改变物体表面的外观。这一映射等式被大多数使用GGX分布的应用所采纳。

GGX分布是shape-invariant的,其Λ函数相对简单:

由于GGX分布与Smith masking-shadowing函数被广泛使用,行业也一直对这两个函数进行不断的优化。Lagarde发现,当与高度相关的Smith G2与微面的镜面反射BRDF的分母(本小节开头处的等式fspec)相结合之后,其会抵消。结合之后的等式可以简化为:

为了使表达式更为简洁,我们使用μi=(n·l)+以及μo=(n·l)+就行了替代。Karis提出了使用以下等式来模拟GGX的Smith G1函数:

我们可以使用向量l或者向量v来替代上述等式中的s。同时,Hammon发现,上述模拟函数能够高效地模拟基于高度的Smith G2以及微面镜面反射BRDF的分母:

上述等式使用了线性插值的运算符,lerp(x,y,z)=x(1-s)+ys

上图中右上角的曲线图则是GGX(红色)与Beckmann(绿色)的对比,很明显两种曲线是完全不同的。GGX曲线的顶峰比Beckmann的要窄,其衰减的范围也更长。相对应的,在上图中渲染图示例中,上半部分使用了Beckmann而下半部分使用了GGX,显然使用了GGX图片,高亮部分感觉有“模糊”的效果。

许多现实世界中的材质都有着上图中类似的模糊高亮效果,也就是说其衰减的范围甚至比GGX还长。如下图所示,左侧的图标中分别表示金属铬(chrome)的镜面反射顶峰,GGX为红色,Beckmann为绿色,Blinn-Phong则为蓝色虚线。右侧的示意图则是GGX,Beckmann分别与现实中金属的镜面反射的对比。显然,GGX的还原度更高,这也大大增加了GGX分布的使用率,同时也让我们继续研究以找到更为精确的分布函数。

Burley提出了generalized Trowbridge-Reitz(GTR) NDF,其目标是能够更好的控制NDF的形状,尤其是NDF曲线从顶峰衰减之后的范围:

参数γ控制了衰减的范围。当γ=2时,GTR与GGX相同。随着γ的值减小,函数的衰减范围会更大,如果其增加,那么衰减就会较短。当γ是一个较大的值时,GTR分布将会类似于Beckmann。表达式k(α,γ)是一个标准化因子,如下所示,其显然比我们之前介绍的其他NDF中的因子更复杂:

GTR分布并不是shape-invariant,这也使得我们很难找到其Smith G2 masking-shadowing function。在该NDF公布的三年之后,才出现了计算其相应的G2函数的方法。但是这一计算非常复杂,对于几个确定的γ值有一组不同的计算方法(若是γ为中间值,例如,给定的γ分别为0.5和0.6,但我们需要计算γ=0.55时的分布情况,那么我们就要对γ为0.5和0.6时的结果进行插值)。GTR还有一个问题就是,参数α和γ会影响粗糙度且高亮的亮度过高。

Student’s t-distribution(STD)exponential power distribution(EPD),这两个NDF也包含了对分布曲线的形状控制参数。但是与GTR不同,这两个函数对于其粗糙度参数来说都是shape-invariant。在作者写本书时,这两个NDF还未被商业化的游戏或者应用所采用。

行业内并没有不断增加NDF的复杂度,而是使用多个specular lobe来匹配不同的材质。这一理念由Cook以及Torrance提出。Ngan验证了这一假设,并且其发现为材质添加第二个specular lobe能够极大的提高效果。Pixar皮克斯的PxrSurface材质有一个“roughspecular” lobe,其原理与之相似。这个额外的lobe是完整的微面镜面反射BRDF。Imagework使用了更为激进的方法,将两个GGX NDF合并,并暴露其中的参数。

Anisotropic Normal Distribution Functions(异向法线分布函数)

虽然大多数材质拥有同向的表面法线分布,但是有些材质在其微观结构中有着显著的异向性,这会大大影响物体表面的外观表现。为了准确地绘制这一类材质,我们需要BRDF尤其是异向的NDF。

不同于同向NDF,异向NDF不止需要一个夹角θm。我们还需要额外的朝向信息。因此,我们需要将微面的法线m转换至其local frame或者说tangent space(切线空间),该坐标系分别由法线n,切线t以及二重切线b来定义。我们可以参考下图。在实践中,这一转换一般表示为三个独立的点乘运算:m·nm·tm·b

当我们将法线映射与异向BRDF相结合时,需要保证法线映射贴图将会同时改变切线向量,二重切线向量以及法线向量。通常我们会对法线向量n,以及顶点的切线与二重切线向量插值到t0b0使用modified Gram-Schmidt。(下列等式中,我们已经将n进行了标准化):

在第一行中我们求出了经过法线映射之后的切线向量,我们也可以通过将其与法线向量进行叉乘以求出二重切线向量。

为了渲染那些拉丝的金属或者卷曲的头发,一般我们会使用tangent map(切线映射贴图),其会提供基于像素的切线方向信息,作用类似于我们之前使用的法线映射贴图。一般来说,切线映射贴图将会存储投影至储垂直于法线的平面的切线向量,而该向量是一个二维向量。切线映射贴图也能使用贴图filtering并且适用法线映射贴图的压缩技术。有些应用可能只会存储一个标量,其切线向量绕着法线向量n旋转的角度。只存储一个标量意味着数据更为精简,同时也更易于进行texture filtering。

常用的创建anisotropic NDF的方法是将一个isotropic NDF进行一般化,其适用于任何shape-variant的isotropic NDF,这也是为什么我们更倾向于使用shape-variant NDF。之前我们提到,isotropic NDF能写为以下形式:

其中,g表示一个一维函数,代表NDF的形状。而anisotropic NDF为:

上述等式中的参数αx和αy分别表示向量t与向量b方向上的粗糙度。如果αx = αy,那么上述等式将变为isotropic NDF。

anisotropic NDF的G2 masking-shadowing函数与isotropic NDF相同,除了变量a(需要传入Λ函数)的计算方法:

等式中的s表示向量v或者l

使用上述方法,那么基于Beckman NDF的anisotropic版本为:

而GGX NDF的anisitropic版本为:

效果如下图所示,上排为Beckmann而下排是GGX,其中αx保持不变,从左至右不断增加αy的值。

最为直接的对anisotropic NDF进行参数化的方法就是使用两次isotropic的粗糙度参数,一次针对αx,另一次针对αy。在Disney的着色模型中,isotropic的粗糙度参数r与另一个标量参数kaniso相结合,而kaniso的范围为0到1。通过这些参数来计算得出αx和αy

上述等式中的0.9会将比例限制在10:1。

Imageworks使用另一种不同的参数,其允许任意角度的anisotropic:

9.8.2 Multiple-Bounce Surface Reflection(多重反弹表面反射)

正如我们在第七小节中提到的,微面BRDF并没有考虑到那些经其他微面所反射(反弹)的光线。这将会导致能量的流失也就是使得表面看上去更暗,尤其是对于那些粗糙的金属材质。

Imageworks所使用的技术是为BRDF添加一个等式以模拟多重反弹的表面反射(multiple bounce surface reflection,简称ms):

等式中的RsF1表示fsF1的方向性的反射率,其是F0为1情况下的镜面反射BRDF。函数RsF1取决于粗糙度α以及法线方向的夹角θ(请参考第三小节)。由于该函数的变化是相对平滑的,所以我们可以对其进行预计算(使用以下两个等式中的一个)并将其存储在一个二维的贴图中。Imageworks发现,一张分别率为32×32的贴图就能较好的实现这一效果。

函数则是在半球范围内RsF1的余弦权重平均值。其只受α影响,所以其能够存储在一个一维的贴图中,或者用一个并不复杂的曲线来表示这一数据。由于RsF1是基于向量n对称的,我们可以使用一维的积分来计算。同时我们将变量变为μ=cosθ

最后,表示菲涅尔等式的余弦权重平均值,其计算方式如下:

如果我们使用Schlick模拟等式来计算F,Imageworks提供了一种封闭式的方法:

如果我们使用原始的Schlick模拟等式(如下所示),那么可以将上述等式简化为:

如果是anisotropic NDF,那么Imageworks将使用一个αx与αy之间的中间粗糙度用以计算fms。这样能够避免增加RsF1列表的维度。

Imageworks的多重反弹镜面反射效果如下图所示。每一行中的物体,其粗糙度从左至右不断增加。上半部分的两行展示了金子材质。第一行没有使用多重反弹的运算,很显然,相较于使用该技术的第二行,其亮度较暗,特别是对于粗糙度较大的材质。下半部分的两种材质都是绝缘体的黑色材质,多重反弹的运算对于物体亮度的影响明显减少,这是因为绝缘体物质的镜面反射率较低。

留下评论

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