第九章 基于物理的着色
微表面理论
有关微观几何对反射率影响的数学分析,被称为微表面理论(microfacet theory),许多BRDF模型都是建立在这个理论之上的。这个工具最初是由光学界的研究人员提出的,1977年由Blinn引入了计算机图形学,1981年由Cook和Torrance再次引入。该理论的基础是,将微观几何建模为一组微表面的集合。
每个微表面都是平坦的,它具有一个微表面法线 m \mathbf{m} m;这些微表面会根据micro-BRDF f μ ( l , v , m ) f_{\mu}(\mathbf{l}, \mathbf{v}, \mathbf{m}) fμ(l,v,m)来对光线进行分别反射,将所有微表面的反射率加起来,就是整个表面的BRDF。通常的做法是将每个微表面都当成一个完美的菲涅尔镜面,这会产生镜面的微表面BRDF,用于模拟表面反射。当然,其他选择也是可行的,例如:漫反射的micro-BRDF可以用于生成一些局部的次表面散射模型;衍射的micro-BRDF可以用于创建一个结合几何光学和波动光学效果的着色模型。
微表面模型的一个重要性质是微表面法线 m \mathbf{m} m的统计分布。这个分布是由表面的法线分布函数(normal distribution function,NDF)所定义的。为了避免与高斯正态分布(Gaussian normal distribution)相混淆,有些文献则使用了术语“法线的分布(distribution of normal)”。这里我们将使用 D ( m ) D(\mathbf{m}) D(m)来表示方程中的NDF项。
图9.31:微表面结构的侧视图。左侧:我们可以对 D ( m ) ( n ⋅ m ) D(m)(n\cdot m) D(m)(n⋅m)进行积分,将微表面区域投影到宏表面平面上,可以得到宏表面的面积(在这个侧视图中则体现为长度),按照约定是1。右侧:对 D ( m ) ( v ⋅ m ) D(m)(v\cdot m) D(m)(v⋅m)进行积分,将微表面区域投影到垂直于观察方向 v v v的平面上,可以获得宏表面在该平面上的投影,即 c o s θ o cosθ_o cosθo或者 ( v ⋅ n ) (v\cdot n) (v⋅n)。当多个微表面的投影相互重叠的时候,背面微表面的负投影区域会和对应的正面微表面的正投影区域相互抵消。
NDF项 D ( m ) D(\mathbf{m}) D(m)是微表面法线在微观几何区域上的统计分布。在整个微表面法线球面上对 D ( m ) D(\mathbf{m}) D(m)进行积分,即可获得这个微表面的面积。更加有用的是,对 D ( m ) ( n ⋅ m ) D(\mathbf{m})(\mathbf{n} \cdot \mathbf{m}) D(m)(n⋅m)进行积分,即将 D ( m ) D(\mathbf{m}) D(m)投影到宏表面平面上,所得到的宏表面面片的面积为1(按照约定),如图9.31左侧所示。换句话说,投影 D ( m ) ( n ⋅ m ) D(\mathbf{m})(\mathbf{n} \cdot \mathbf{m}) D(m)(n⋅m)是归一化的:
∫ m ∈ Θ D ( m ) ( n ⋅ m ) d m = 1 (9.21) \int_{\mathbf{m} \in \Theta} D(\mathbf{m})(\mathbf{n} \cdot \mathbf{m}) d \mathbf{m}=1 \tag{9.21} ∫m∈ΘD(m)(n⋅m)dm=1(9.21)
本章节之前的积分,都是在以 n \mathbf{n} n为中心的半球内进行的,使用符号 Ω \Omega Ω来表示;而这里是对整个球面的法线进行积分,因此使用符号 Θ \Theta Θ来表示。大多数图形出版物中都使用了这种符号,但是也有少部分参考文献使用了符号 Ω \Omega Ω来表示完整的球体。在实践中,图形学中所使用的微观结构模型大多数是高度场(heightfield),这意味着在 Ω \Omega Ω以外的所有方向 m \mathbf{m} m上, D ( m ) = 0 D(\mathbf{m})=0 D(m)=0。但是,方程9.21对于非高度场的微观结构也是有效的。
更一般地说,微表面(microsurface)和宏表面(macrosurface)在垂直于观察方向 v \mathbf{v} v的平面上的投影是相等的,即:
∫ m ∈ Θ D ( m ) ( v ⋅ m ) d m = v ⋅ n (9.22) \int_{\mathbf{m} \in \Theta} D(\mathbf{m})(\mathbf{v} \cdot \mathbf{m}) d \mathbf{m}=\mathbf{v} \cdot \mathbf{n} \tag{9.22} ∫m∈ΘD(m)(v⋅m)dm=v⋅n(9.22)
方程9.21和方程9.22中的点积没有限制到0,图9.31的右侧子图解释这个原因。方程9.21和方程9.22 强制要求 D ( m ) D(\mathbf{m}) D(m)必须是一个合法的NDF。
从直观上来看,NDF就好像是微表面法线的直方图。它在微表面法线更可能指向的方向上,具有更高的值。大多数表面的NDF都在宏观表面法线 n \mathbf{n} n处,具有很强的峰值。
让我们再看一下图9.31的右侧子图。虽然有许多微表面的投影相互重叠了,但是对于渲染而言,我们只关心能够被相机看见的那些微表面,即在每个重叠集合中最接近相机的那个微表面。根据这个事实,可以提出另一种方法,来将投影后的微表面区域与宏观区域联系起来:可见微表面的投影面积之和 = 宏表面的投影面积。我们可以通过定义遮挡函数(masking function) G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v),以数学的方式来表达这一点, G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v)给出了沿观察方向 v \mathbf{v} v,具有法线 m \mathbf{m} m的可见微表面的比例。 G 1 ( m , v ) D ( m ) ( n ⋅ m ) + G_{1}(\mathbf{m}, \mathbf{v})D(\mathbf{m})(\mathbf{n} \cdot \mathbf{m})^+ G1(m,v)D(m)(n⋅m)+的球面积分,则给出了在垂直于观察方向 v \mathbf{v} v的平面上,宏表面的投影面积,即:
∫ ∈ Θ G 1 ( m , v ) D ( m ) ( v ⋅ m ) + d m = v ⋅ n (9.23) \int_{\in \Theta} G_{1}(\mathbf{m}, \mathbf{v}) D(\mathbf{m})(\mathbf{v} \cdot \mathbf{m})^{+} d \mathbf{m}=\mathbf{v} \cdot \mathbf{n} \tag{9.23} ∫∈ΘG1(m,v)D(m)(v⋅m)+dm=v⋅n(9.23)
图9.32展示了方程所描述的过程。与方程9.22有所不同的是,方程9.23中的点积被限制到0,我们在章节1中介绍过这个操作,使用符号 x + x^+ x+来进行表示。位于背面的微表面是不可见的,所以在这种情况下它们并不会被计算在内。向量 G 1 ( m , v ) D ( m ) G_{1}(\mathbf{m}, \mathbf{v}) D(\mathbf{m}) G1(m,v)D(m)与可见法线的分布(distribution of visible normal)有关。
图9.32:对可见微表面(亮红色)的投影面积进行积分,能够得到垂直于观察方向 v \mathbf{v} v的平面上的宏表面投影面积。
虽然方程9.23对 G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v)施加了一些约束,但是却无法唯一地决定它。对于给定的微表面法线分布 D ( m ) D(\mathbf{m}) D(m),存在无数个masking函数满足约束条件。这是因为 D ( m ) D(\mathbf{m}) D(m)并不能完全决定微表面的全部细节,它仅仅告诉了我们有多少个微表面的法线指向了这个方向,但是却没有告诉我们这些法线具体的排列方式。
尽管多年来已经提出了各种形式的 G 1 G_{1} G1函数,但直到Heitz的一篇优秀论文,才解决了(至少目前)到底使用哪种函数这一困境(dilemma)。Heitz讨论了Smith masking函数,这个函数最初是为高斯正态分布而推导出来的,后来才推广到了任意的NDF上。Heitz表明,在文献中提到的各种masking函数中,只有Smith函数和Torrance-Sparrow“V-cavity”函数服从方程9.23,即在数学上是有效合法的。他进一步表明,Smith函数要比Torrance-Sparrow函数更加接近随机微表面的表现。Heitz还证明了Smith masking函数是唯一一个可能既服从方程9.23,又具有法线-masking独立性的函数。这意味着函数 G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v)并不依赖于微表面法线 m \mathbf{m} m的方向,只要这个 m \mathbf{m} m不朝向背面即可,即只要 m ⋅ v ≥ 0 \mathbf{m} \cdot \mathbf{v} \ge 0 m⋅v≥0即可。Smith G 1 G_{1} G1函数的数学形式如下:
G 1 ( m , v ) = χ + ( m ⋅ v ) 1 + Λ ( v ) (9.24) G_{1}(\mathbf{m}, \mathbf{v})=\frac{\chi^{+}(\mathbf{m} \cdot \mathbf{v})}{1+\Lambda(\mathbf{v})} \tag{9.24} G1(m,v)=1+Λ(v)χ+(m⋅v)(9.24)
其中 χ + \chi^{+} χ+是正特征函数:
χ + ( x ) = { 1 , where x > 0 , 0 , where x ≤ 0. (9.25) \chi^{+}(x)=\left\{\begin{array}{ll}1, & \text { where } x>0, \\ 0, & \text { where } x \leq 0 .\end{array}\right. \tag{9.25} χ+(x)={1,0, where x>0, where x≤0.(9.25)
每个NDF的 Λ \Lambda Λ(lambda)函数都是不同的。Walter等人和Heitz在出版物中,描述了为给定NDF推导 Λ \Lambda Λ函数的过程。
Smith masking函数确实存在一些缺点。从理论的角度来看,它的函数需求与实际的表面结构并不一致,甚至可能在物理上无法实现。从实践的角度来看,虽然它对随机表面的模拟是相当准确的,但是对于法线方向和masking之间具有较强依赖性的表面(如图9.28所展示的表面),尤其是当该表面具有一些重复结构的时候(例如大多数织物),Smith masking函数的准确性预计会下降。然而,在找到更好的替代方案之前,它还是大多数渲染程序的最佳选择。
对于一个给定的微观几何描述,它包括以下几部分:micro-BRDF项 f μ ( l , v , m ) f_{\mu}(\mathbf{l}, \mathbf{v}, \mathbf{m}) fμ(l,v,m),法线分布函数 D ( m ) D(\mathbf{m}) D(m),以及遮挡函数 G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v)。据此可以推导出宏表面的BRDF,即:
f ( l , v ) = ∫ m ∈ Ω f μ ( l , v , m ) G 2 ( l , v , m ) D ( m ) ( m ⋅ l ) + ∣ n ⋅ l ∣ ( m ⋅ v ) + ∣ n ⋅ v ∣ d m . (9.26) f(\mathbf{l}, \mathbf{v})=\int_{\mathbf{m} \in \Omega} f_{\mu}(\mathbf{l}, \mathbf{v}, \mathbf{m}) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m}) D(\mathbf{m}) \frac{(\mathbf{m} \cdot \mathbf{l})^{+}}{|\mathbf{n} \cdot \mathbf{l}|} \frac{(\mathbf{m} \cdot \mathbf{v})^{+}}{|\mathbf{n} \cdot \mathbf{v}|} d \mathbf{m}. \tag{9.26} f(l,v)=∫m∈Ωfμ(l,v,m)G2(l,v,m)D(m)∣n⋅l∣(m⋅l)+∣n⋅v∣(m⋅v)+dm.(9.26)
这个积分在以法线 n \mathbf{n} n为中心的半球 Ω \Omega Ω上进行的,从而避免计算从表面下方照射来的光线贡献。方程9.26使用了联合masking-shadowing函数(joint masking-shadowing function) G 2 ( l , v , m ) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m}) G2(l,v,m),来代替遮挡函数 G 1 ( m , v ) G_{1}(\mathbf{m}, \mathbf{v}) G1(m,v)。这个函数是从 G 1 G_{1} G1中推导出来的,它给出了在两个方向上具有法线 m \mathbf{m} m的可见微表面的比例,这两个方向分别是观察方向 v \mathbf{v} v和光线方向 l \mathbf{l} l。通过引入 G 2 G_{2} G2函数,方程9.26使得BRDF能够同时考虑shadowing和masking对着色的影响,但是它并没有考虑微表面之间的相互反射情况(详见图9.27)。从方程9.26推导出的所有BRDF都有一个共同的局限性,即没有考虑微表面之间的相互反射,这样的BRDF看起来要比真实情况暗一些。
Heitz 讨论了 G 2 G_{2} G2函数的几个版本,其中最简单的是可分离形式,其中的shadowing和masking分别使用 G 1 G_{1} G1函数进行评估,并将计算结果相乘:
G 2 ( l , v , m ) = G 1 ( v , m ) G 1 ( l , m ) . (9.27) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m})=G_{1}(\mathbf{v}, \mathbf{m}) G_{1}(\mathbf{l}, \mathbf{m}). \tag{9.27} G2(l,v,m)=G1(v,m)G1(l,m).(9.27)
这种形式的 G 2 G_{2} G2函数相当于假设shadowing和masking是两个不相关的事件,但是在现实中它们并非如此,并且这种假设会导致使用该 G 2 G_{2} G2函数的BRDF过暗。
举一个极端的例子,当观察方向与光线方向相同时,在这种情况下, G 2 G_{2} G2应当等于 G 1 G_{1} G1,因为没有任何一个可见的微表面被shadowing,但是根据方程9.27, G 2 G_{2} G2将等于 G 1 2 G_{1} ^2 G12。
如果微表面是一个高度场的话(在渲染中通常会使用高度场来作为微表面模型),那么每当观察方向 v \mathbf{v} v和光线方向 l \mathbf{l} l之间的相对方位角 ϕ \phi ϕ等于 0 ∘ 0^{\circ} 0∘时(如图9.17中的 ϕ \phi ϕ), G 2 ( l , v , m ) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m}) G2(l,v,m)应当等于 min ( G 1 ( v , m ) , G 1 ( l , m ) ) \min(G_{1}(\mathbf{v}, \mathbf{m}),G_{1}(\mathbf{l}, \mathbf{m})) min(G1(v,m),G1(l,m))。这种关系提出了一种通用的方法,来解释shadowing和masking之间的关系,并且可以应用于任何 G 1 G_{1} G1函数:
G 2 ( l , v , m ) = λ ( ϕ ) G 1 ( v , m ) G 1 ( l , m ) + ( 1 − λ ( ϕ ) ) min ( G 1 ( v , m ) , G 1 ( l , m ) ) (9.28) \begin{aligned}{} G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m})&=\lambda(\phi) G_{1}(\mathbf{v}, \mathbf{m}) G_{1}(\mathbf{l}, \mathbf{m})\\ &+(1-\lambda(\phi)) \min \left(G_{1}(\mathbf{v}, \mathbf{m}), G_{1}(\mathbf{l}, \mathbf{m})\right) \end{aligned}{} \tag{9.28} G2(l,v,m)=λ(ϕ)G1(v,m)G1(l,m)+(1−λ(ϕ))min(G1(v,m),G1(l,m))(9.28)
其中 λ ( ϕ ) \lambda(\phi) λ(ϕ)是某种随着角 ϕ \phi ϕ的增大,从0逐渐增加到1的函数。Ashikhmin等人建议采用标准差为 1 5 ∘ 15^{\circ} 15∘(约为0.26弧度)的高斯分布:
λ ( ϕ ) = 1 − e − 7.3 ϕ 2 (9.29) \lambda(\phi)=1-e^{-7.3 \phi^{2}} \tag{9.29} λ(ϕ)=1−e−7.3ϕ2(9.29)
van Ginneken等人提出了一种不同的 λ \lambda λ函数:
λ ( ϕ ) = 4.41 ϕ 4.41 ϕ + 1 (9.30) \lambda(\phi)=\frac{4.41 \phi}{4.41 \phi+1} \tag{9.30} λ(ϕ)=4.41ϕ+14.41ϕ(9.30)
无论观察方向和光线方向是否对齐,在给定表面点上的shadowing和masking仍然是相关的,这还有另一个原因,即二者都与表面点相对于曲面其他部分的高度有关。对于高度较低的表面点而言,它被shadowing或者masking的概率都会增加。如果使用Smith masking函数的话,那么二者的相关性可以用Smith高度相关的masking-shadowing函数来精确地解释:
G 2 ( l , v , m ) = χ + ( m ⋅ v ) χ + ( m ⋅ l ) 1 + Λ ( v ) + Λ ( l ) (9.31) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m})=\frac{\chi^{+}(\mathbf{m} \cdot \mathbf{v}) \chi^{+}(\mathbf{m} \cdot \mathbf{l})}{1+\Lambda(\mathbf{v})+\Lambda(\mathbf{l})} \tag{9.31} G2(l,v,m)=1+Λ(v)+Λ(l)χ+(m⋅v)χ+(m⋅l)(9.31)
Heitz同样描述了一种结合了方向相关性和高度相关性的Smith G 2 G_2 G2函数:
G 2 ( l , v , m ) = χ + ( m ⋅ v ) χ + ( m ⋅ l ) 1 + max ( Λ ( v ) , Λ ( l ) ) + λ ( v , l ) min ( Λ ( v ) , Λ ( l ) ) (9.32) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{m})=\frac{\chi^{+}(\mathbf{m} \cdot \mathbf{v}) \chi^{+}(\mathbf{m} \cdot \mathbf{l})}{1+\max (\Lambda(\mathbf{v}), \Lambda(\mathbf{l}))+\lambda(\mathbf{v}, \mathbf{l}) \min (\Lambda(\mathbf{v}), \Lambda(\mathbf{l}))} \tag{9.32} G2(l,v,m)=1+max(Λ(v),Λ(l))+λ(v,l)min(Λ(v),Λ(l))χ+(m⋅v)χ+(m⋅l)(9.32)
其中的函数 λ ( v , l ) \lambda(\mathbf{v}, \mathbf{l}) λ(v,l)可以是一个经验函数,如方程9.29和方程9.30所描述的函数,也可以是一个专门为给定的NDF 推导出来的函数。
在这些替代方案中,Heitz 推荐了Smith函数的高度相关形式(方程9.31),因为它与高度不相关形式的Smith函数,具有相似的开销和更好的准确性。这种形式在实践中使用得最为广泛,其他一些从业者使用了可分离形式的Smith函数(方程9.27)。
方程9.26中所描述的微表面BRDF并不会直接用于渲染,而是在给定micro-BRDF f μ f_{\mu} fμ的情况下,推导出一个封闭形式的解(精确解或者近似解)。
表面反射的BRDF模型
除了少数例外情况,在基于物理的渲染中所使用的镜面BRDF项,都来源于微表面理论。在镜面反射的情况下,每个微表面都是一个完美光滑的菲涅尔镜面,回顾一下,这样的镜面会将每束入射光线,都反射到一个单一的反射方向上。这就意味着除非观察方向 v \mathbf{v} v刚好与光线的出射方向平行,不然每个表面的micro-BRDF f μ ( l , v , m ) f_{\mu}(\mathbf{l}, \mathbf{v}, \mathbf{m}) fμ(l,v,m)都等于零。而对于给定的观察方向 v \mathbf{v} v和光线入射方向 l \mathbf{l} l,这种情况相当于微表面的法线 m \mathbf{m} m,与 v \mathbf{v} v和 l \mathbf{l} l的中间向量对齐,这个中间向量被称为半向量(half vector) h \mathbf{h} h,如图9.33所示。半向量 h \mathbf{h} h是通过将观察方向 v \mathbf{v} v和光线入射方向 l \mathbf{l} l相加,并将结果进行归一化计算而来的:
h = 1 + v ∥ l + v ∥ (9.33) \mathbf{h}=\frac{1+\mathbf{v}}{\|\mathbf{l}+\mathbf{v}\|} \tag{9.33} h=∥l+v∥1+v(9.33)
图9.33:半向量 h \mathbf{h} h与观察方向 v \mathbf{v} v和光线入射方向 l \mathbf{l} l的夹角(用红色表示)相等。
菲涅尔镜面的micro-BRDF f μ ( l , v , m ) f_{\mu}(\mathbf{l}, \mathbf{v}, \mathbf{m}) fμ(l,v,m)对于所有 m ≠ h \mathbf{m} \ne \mathbf{h} m=h时的情况都为零,当我们从方程9.26中推导镜面微表面模型的时候,这个事实是十分方便的,因为它将原本的积分形式退化为了在 m = h \mathbf{m} = \mathbf{h} m=h处,对被积函数进行求值。这样就做可以得到高光BRDF项:
f spec ( l , v ) = F ( h , l ) G 2 ( l , v , h ) D ( h ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ (9.34) f_{\text {spec }}(\mathbf{l}, \mathbf{v})=\frac{F(\mathbf{h}, \mathbf{l}) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{h}) D(\mathbf{h})}{4|\mathbf{n} \cdot \mathbf{l}||\mathbf{n} \cdot \mathbf{v}|} \tag{9.34} fspec (l,v)=4∣n⋅l∣∣n⋅v∣F(h,l)G2(l,v,h)D(h)(9.34)
有关这个推导的详细过程,可以在Walter等人、Heitz 和Hammon 的出版物中找到。Hammon还给出了一种BRDF实现的优化方法,即在不计算半向量 h \mathbf{h} h本身的情况下,通过直接计算 n ⋅ l \mathbf{n} \cdot \mathbf{l} n⋅l和 n ⋅ v \mathbf{n} \cdot \mathbf{v} n⋅v来降低计算量。
我们使用符号 f spec f_{\text {spec }} fspec 来表示方程9.34中的BRDF项,代表了它模拟了表面反射(镜面反射)现象。在一个完整的BRDF实现中,它可能还会加上一个用于模拟次表面(漫反射)着色的额外项。
为了更加直观地理解方程9.34,我们可以这样认为:只有那些法线与半向量碰巧对齐( m = h \mathbf{m} = \mathbf{h} m=h)的微表面,才能正确地将光线从入射方向 l \mathbf{l} l反射到观察方向 v \mathbf{v} v上,如图9.34所示。因此,反射光线的数量取决于微表面法线 m \mathbf{m} m与半向量 h \mathbf{h} h的对齐程度,这个值是通过 D ( h ) D(\mathbf{h}) D(h)项给出的; G 2 ( l , v , h ) G_{2}(\mathbf{l}, \mathbf{v}, \mathbf{h}) G2(l,v,h)给出了从光线入射方向和相机观察方向都可见的微表面比例; F ( h , l ) F(\mathbf{h}, \mathbf{l}) F(h,l)给出了每个微表面反射光线的比例。这里在计算菲涅尔函数的时候,使用了半向量 h \mathbf{h} h来代替表面法线,例如计算方程9.16中的Schlick近似函数时。
图9.34:由微表面构成的表面。只有微表面法线与半向量 h \mathbf{h} h对齐的那部分(图中红色的微表面),才会参与从入射方向 l \mathbf{l} l到观察方向 v \mathbf{v} v的光线反射。
在masking-shadowing函数中使用的半向量还可以稍微简化一下,由于所涉及的角度永远不会超过 9 0 ∘ 90^{\circ} 90∘,因此可以移除方程9.24,方程9.31,方程9.32中的 χ + \chi^{+} χ+项。
法线分布函数
法线分布函数(normal distribution function,NDF)对于要渲染的表面外观具有十分重要的影响。NDF的形状(将其绘制在微平面法线的球体上)决定了反射光锥(镜面波瓣)的宽度和形状,反过来又决定了高光的大小和形状。NDF影响了表面粗糙度的整体感知,以及一些更加微妙的视觉表现,例如高光是否具有明显的边缘,还是具有一个模糊(haze)的边缘。
然而,镜面波瓣(specular lobe)并不是NDF形状的简单复制。镜面波瓣(也就是高光形状)被扭曲的程度还取决于表面曲率和观察视角。如图9.35所示,当从掠射视角观察平面的时候,这种畸变(distortion)会尤其强烈。Ngan等人对这种畸变背后的原因进行了分析。
图9.35:最左边的图像是使用非物理的Phong反射模型渲染而来的,这个模型的镜面波瓣关于光线的反射向量旋转对称,类似这种的BRDF在早期的计算机图形学中被经常使用。中间的图像使用基于物理的微表面BRDF进行渲染。第一行左侧和第一行中间的图片,展示了一个以掠射角度进行光照的平面,其中第一行左侧展示了一个不正确的圆形高光,而第一行中间展示的是微表面BRDF所特有的延伸高光,这个效果是与现实相符的,如右边的照片所示。高光形状的差异在下面两个渲染球体上则要不易察觉得多,因为在这种球面的情况下,表面曲率才是是高光形状的主要影响因素。
各项同性法线分布函数
在渲染中所使用的大多数NDF都是各向同性的(isotropic),即关于宏表面法线 n \mathbf{n} n旋转对称。在这种情况下,NDF的变量只有一个,即宏表面法线 n \mathbf{n} n与微表面法线 m \mathbf{m} m之间的夹角 θ m \theta _m θm。在理想情况下,NDF可以写成一个关于 cos θ m \cos \theta _m cosθm的表达式,可以通过计算 n \mathbf{n} n和 m \mathbf{m} m之间的点乘来快速获得 cos θ m \cos \theta _m cosθm。
Beckmann NDF 是光学界开发的、第一个微表面模型中所使用的法线分布函数,它至今仍被该社区广泛使用。它也是Cook-Torrance BRDF所选择使用的NDF。归一化Beckmann 分布的数学形式如下:
D ( m ) = χ + ( n ⋅ m ) π α b 2 ( n ⋅ m ) 4 exp ( ( n ⋅ m ) 2 − 1 α b 2 ( n ⋅ m ) 2 ) (9.35) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\pi \alpha_{b}^{2}(\mathbf{n} \cdot \mathbf{m})^{4}} \exp \left(\frac{(\mathbf{n} \cdot \mathbf{m})^{2}-1}{\alpha_{b}^{2}(\mathbf{n} \cdot \mathbf{m})^{2}}\right) \tag{9.35} D(m)=παb2(n⋅m)4χ+(n⋅m)exp(αb2(n⋅m)2(n⋅m)2−1)(9.35)
其中的 χ + ( n ⋅ m ) \chi^{+}(\mathbf{n} \cdot \mathbf{m}) χ+(n⋅m)项确保了所有指向宏表面下方的微表面法线的NDF值为0,这个性质告诉我们,与我们将在本小节所讨论的其他所有NDF一样,这个NDF描述了一个高度场微表面。方程中的参数 α b \alpha_{b} αb控制了表面的粗糙度,它与微观几何表面的均方根(root mean square,RMS)斜率成正比,即 α b = 0 \alpha_{b} = 0 αb=0代表了一个完全光滑的表面。
为了推导出Beckmann NDF的Smith G 2 G_2 G2函数,我们需要相应的 Λ \Lambda Λ函数,然后将其代入方程9.24(使用可分离形式的 G 2 G_2 G2函数),或者方程9.31(使用高度相关形式的 G 2 G_2 G2函数),或者方程9.32(使用方向相关和高度相关的 G 2 G_2 G2函数)。
Beckmann NDF是形状不变的(shape-invariant),这简化了 Λ \Lambda Λ函数的推导。根据Heitz 的定义,如果其粗糙度参数的影响相当于对微表面进行缩放(或者拉伸)的话,那么这个各向同性NDF就是形状不变的,形状不变的NDF可以写成如下形式:
D ( m ) = χ + ( n ⋅ m ) α 2 ( n ⋅ m ) 4 g ( 1 − ( n ⋅ m ) 2 α ( n ⋅ m ) ) (9.36) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\alpha^{2}(\mathbf{n} \cdot \mathbf{m})^{4}} g\left(\frac{\sqrt{1-(\mathbf{n} \cdot \mathbf{m})^{2}}}{\alpha(\mathbf{n} \cdot \mathbf{m})}\right) \tag{9.36} D(m)=α2(n⋅m)4χ+(n⋅m)g(α(n⋅m)1−(n⋅m)2)(9.36)
其中的 g g g代表了一个任意的单变量函数。对于一个任意的各向同性NDF, Λ \Lambda Λ函数取决于两个变量:第一个变量是粗糙度 α \alpha α,第二个变量是计算 Λ \Lambda Λ的向量入射角( v \mathbf{v} v或者 l \mathbf{l} l)。然而,对于形状不变的NDF而言, Λ \Lambda Λ函数只依赖于变量 a a a:
a = n ⋅ s α 1 − ( n ⋅ s ) 2 (9.37) a=\frac{\mathbf{n} \cdot \mathbf{s}}{\alpha \sqrt{1-(\mathbf{n} \cdot \mathbf{s})^{2}}} \tag{9.37} a=α1−(n⋅s)2n⋅s(9.37)
其中的向量 s \mathbf{s} s代表了观察方向 v \mathbf{v} v或者光线方向 l \mathbf{l} l,在这种情况下, Λ \Lambda Λ函数只依赖于一个变量,这十分利于实现,因为单变量函数可以更加容易地使用近似曲线来进行拟合,并且可以在一维数组中打表。
Beckmann NDF的 Λ \Lambda Λ函数为:
Λ ( a ) = erf ( a ) − 1 2 + 1 2 a π exp ( − a 2 ) (9.38) \Lambda(a)=\frac{\operatorname{erf}(a)-1}{2}+\frac{1}{2 a \sqrt{\pi}} \exp \left(-a^{2}\right) \tag{9.38} Λ(a)=2erf(a)−1+2aπ1exp(−a2)(9.38)
计算方程9.38的开销很高,因为它包含了一个误差函数 erf \operatorname{erf} erf。因此,通常会使用近似值来进行代替:
Λ ( a ) ≈ { 1 − 1.259 a + 0.396 a 2 3.535 a + 2.181 a 2 , where a < 1.6 , 0 , where a ≥ 1.6. (9.39) \Lambda(a) \approx\left\{\begin{array}{ll}\frac{1-1.259 a+0.396 a^{2}}{3.535 a+2.181 a^{2}}, & \text { where } a<1.6, \\ 0, & \text { where } a \geq 1.6 .\end{array}\right. \tag{9.39} Λ(a)≈{3.535a+2.181a21−1.259a+0.396a2,0, where a<1.6, where a≥1.6.(9.39)
下一个我们要讨论的NDF是Blinn-Phong NDF,它在过去被广泛应用于计算机图形学中,尽管在最近,它在很大程度上已经被其他的法线分布所取代了。Blinn-Phong NDF仍然被用于一些算力受限的情况(例如移动设备上),因为相比于本小节所讨论的其他NDF,Blinn-Phong NDF具有更低的计算成本。
Blinn-Phong NDF是由Blinn提出的,作为对Phong着色模型(非基于物理的)的一个修改:
D ( m ) = χ + ( n ⋅ m ) α p + 2 2 π ( n ⋅ m ) α p (9.40) D(\mathbf{m})=\chi^{+}(\mathbf{n} \cdot \mathbf{m}) \frac{\alpha_{p}+2}{2 \pi}(\mathbf{n} \cdot \mathbf{m})^{\alpha_{p}} \tag{9.40} D(m)=χ+(n⋅m)2παp+2(n⋅m)αp(9.40)
方程中的幂次 α p \alpha_{p} αp是Phong NDF的粗糙度参数,较高的 α p \alpha_{p} αp代表了较为光滑的表面,而较低的 α p \alpha_{p} αp则代表较为粗糙的表面。我们可以将 α p \alpha_{p} αp的值设置得任意高,从而创建一个极其光滑的表面,而一个完美的镜面则需要令 α p = ∞ \alpha_{p} =\infty αp=∞。通过将 α p \alpha_{p} αp设置为0,可以得到一个随机程度最大的曲面(即均匀NDF)。参数 α p \alpha_{p} αp不便于直接进行操作,因为它的视觉效果是高度非均匀的:当 α p \alpha_{p} αp较小时,它对数值变化十分敏感,一点点很小的数值变化,就会在视觉效果上产生很大的变化;当 α p \alpha_{p} αp较大时,它对数值变化则不太敏感,一个很大的数值变化,才能让视觉效果发生一点点变化。因此, α p \alpha_{p} αp通常是通过一个非线性映射,从用户控制的参数推导出来的,例如 α p = m s \alpha_{p} = m^s αp=ms,其中 s s s是一个介于0-1之间的参数, m m m是 α p \alpha_{p} αp在给定应用程序中的最大上界。许多游戏都使用了这种映射方式,例如《使命召唤:黑色行动》,其中的 m m m被设置为8192。
当BRDF参数的行为在感知上不均匀时,这种“接口映射(interface mappings)”的方式通常是十分有用的。用户通过滑动条(slider)进行设置,或者是直接在纹理中绘制参数,这些映射可以用于对这些用户参数进行解释。
通过等价变换 α p = 2 α b − 2 − 2 \alpha_{p}=2 \alpha_{b}^{-2}-2 αp=2αb−2−2,可以找到Beckmann和Blinn-Phong粗糙度参数的等效值。当参数通过这种方式进行匹配时,这两个分布会非常接近,尤其是对于相对光滑的表面而言,如图9.36左上角所示。
Blinn-Phong NDF并不是形状不变的,其 Λ \Lambda Λ函数不存在解析形式。Walter等人建议将Beckmann Λ \Lambda Λ函数与等价变换 α p = 2 α b − 2 − 2 \alpha_{p}=2 \alpha_{b}^{-2}-2 αp=2αb−2−2结合起来使用。
在1977年的同一篇论文中,通过将Phong着色函数应用到一个微表面NDF中,Blinn提出了另外两种NDF。在这三种法线分布中,Blinn建议使用Trowbridge和Reitz所推导出来的一种分布,但是这个建议并没有得到广泛的重视,直到30年后,Trowbridge-Reitz分布被Walter等人独立地重新发现,并将其命名为GGX分布。这一次,种子终于生根发芽了。在几年内,GGX分布开始在电影行业和游戏行业中快速普及,而如今它可能是这两个行业中最常用的法线分布,Blinn的建议似乎超前了30年。虽然严格来说,“Trowbridge-Reitz分布”才是这个分布正确的名称,但是我们在本书中仍然会使用GGX这个名称,因为它已经十分成熟并且广为流传了。
GGX分布的数学表达形式如下:
D ( m ) = χ + ( n ⋅ m ) α g 2 π ( 1 + ( n ⋅ m ) 2 ( α g 2 − 1 ) ) 2 (9.41) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m}) \alpha_{g}^{2}}{\pi\left(1+(\mathbf{n} \cdot \mathbf{m})^{2}\left(\alpha_{g}^{2}-1\right)\right)^{2}} \tag{9.41} D(m)=π(1+(n⋅m)2(αg2−1))2χ+(n⋅m)αg2(9.41)
参数 α g \alpha_{g} αg提供了与Beckmann 分布中参数 α b \alpha_{b} αb类似的粗糙度控制。在Disney原则着色模型中,Burley 通过 α g = r 2 \alpha_{g}=r^{2} αg=r2,将粗糙度控制暴露给用户,其中 r r r是用户可以控制的粗糙度参数,其取值范围在0-1之间。将 r r r作为一个滑动条值暴露出来,意味着其视觉效果的变化更加线性,大多数使用GGX分布的应用都采用了这种映射方式。
GGX分布是形状不变的,其 Λ \Lambda Λ函数相对比较简单:
Λ ( a ) = − 1 + 1 + 1 a 2 2 (9.42) \Lambda(a)=\frac{-1+\sqrt{1+\frac{1}{a^{2}}}}{2} \tag{9.42} Λ(a)=2−1+1+a21(9.42)
在方程9.42中,变量 a a a只会以 a 2 a^2 a2的形式出现,这是十分便于计算的,因为这样我们避免了方程9.37中的平方根运算。
由于GGX分布和Smith masking-shadowing函数的流行,因此人们一直致力于优化这两者的组合。Lagarde观察到,在GGX中使用高度相关的Smith G 2 G_2 G2函数(方程9.31),在与镜面微表面BRDF的分母(方程9.34)结合时,有几项会被消掉,合并后的项可以简化为如下形式:
G 2 ( l , v ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ = 0.5 μ o α 2 + μ i ( μ i − α 2 μ i ) + μ i α 2 + μ o ( μ o − α 2 μ o ) (9.43) \frac{G_{2}(\mathbf{l}, \mathbf{v})}{4|\mathbf{n} \cdot \mathbf{l}||\mathbf{n} \cdot \mathbf{v}|}=\frac{0.5}{\mu_{o} \sqrt{\alpha^{2}+\mu_{i}\left(\mu_{i}-\alpha^{2} \mu_{i}\right)}+\mu_{i} \sqrt{\alpha^{2}+\mu_{o}\left(\mu_{o}-\alpha^{2} \mu_{o}\right)}} \tag{9.43} 4∣n⋅l∣∣n⋅v∣G2(l,v)=μoα2+μi(μi−α2μi)+μiα2+μo(μo−α2μo)0.5(9.43)
为了简化表达,这个方程使用了以下两个变量替换: μ i = ( n ⋅ l ) + \mu_{i}=(\mathbf{n} \cdot \mathbf{l})^{+} μi=(n⋅l)+和 μ o = ( n ⋅ v ) + \mu_{o}=(\mathbf{n} \cdot \mathbf{v})^{+} μo=(n⋅v)+。Karis 提出了在GGX中使用的Smith G 1 G_1 G1函数的近似形式:
G 1 ( s ) ≈ 2 ( n ⋅ s ) ( n ⋅ s ) ( 2 − α ) + α , (9.44) G_{1}(\mathbf{s}) \approx \frac{2(\mathbf{n} \cdot \mathbf{s})}{(\mathbf{n} \cdot \mathbf{s})(2-\alpha)+\alpha}, \tag{9.44} G1(s)≈(n⋅s)(2−α)+α2(n⋅s),(9.44)
方程9.44中的 s \mathbf{s} s,可以用向量 l \mathbf{l} l或者向量 v \mathbf{v} v进行替换。Hammon表明,这种近似形式的 G 1 G_1 G1函数,可以对由高度相关的Smith G 2 G_2 G2函数和镜面微表面BRDF分母组成的组合项进行有效地近似:
G 2 ( l , v ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ ≈ 0.5 lerp ( 2 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ , ∣ n ⋅ l ∣ + ∣ n ⋅ v ∣ , α ) , (9.45) \frac{G_{2}(\mathbf{l}, \mathbf{v})}{4|\mathbf{n} \cdot \mathbf{l}||\mathbf{n} \cdot \mathbf{v}|} \approx \frac{0.5}{\operatorname{lerp}(2|\mathbf{n} \cdot \mathbf{l}||\mathbf{n} \cdot \mathbf{v}|,|\mathbf{n} \cdot \mathbf{l}|+|\mathbf{n} \cdot \mathbf{v}|, \alpha)}, \tag{9.45} 4∣n⋅l∣∣n⋅v∣G2(l,v)≈lerp(2∣n⋅l∣∣n⋅v∣,∣n⋅l∣+∣n⋅v∣,α)0.5,(9.45)
方程9.45使用了线性插值运算符,即 lerp ( x , y , s ) = x ( 1 − s ) + y s \operatorname{lerp}(x, y, s)=x(1-s)+y s lerp(x,y,s)=x(1−s)+ys。
当比较图9.36中的GGX分布和Beckmann分布时,很明显二者具有完全不同的形状。GGX的峰值比Beckmann更窄,而围绕这些峰值的“尾巴”则更长。在图9.36底部的渲染图中,我们可以看到,GGX较长的拖尾在高光的核心区域周围,产生了一个模糊(haze)或者微光(glow)外观。
图9.36:左上角:Blinn-Phong分布(蓝色虚线)和Beckmann分布(绿色实线)的对比图,参数 α b α_b αb在0.025-0.2范围内,并使用了参数关系 α p = 2 α b − 2 − 2 α_p=2α_b^{−2}−2 αp=2αb−2−2进行粗糙度的转换。右上角:GGX分布(红色实线)和Beckmann分布(绿色实线)的对比图,其中参数 α b α_b αb的值与左图中的完全相同。通过人眼调节参数 α g α_g αg的值,来匹配高光大小。底部渲染图中的球体也使用了相同的数值,其中第一行使用了Beckmann NDF,第二行则使用了GGX分布。
真实世界中的许多材质都具有类似的模糊高光,其尾部通常还要比GGX分布的尾部更长,详见图9.37。这种基于真实世界的观察认知对GGX分布的日益流行,以及探索能够更加准确地模拟被测材质的新分布,都做出了很大的贡献。
图9.37:MERL数据库中各种NDF对金属铬的匹配程度。左侧图中展示了相对于夹角 θ m \theta _m θm的镜面峰值,三条曲线分别代表金属铬(黑色)、GGX分布(红色,其中 α g = 0.006 \alpha_{g}= 0.006 αg=0.006),Beckmann分布(绿色,其中 α g = 0.013 \alpha_{g}= 0.013 αg=0.013),Blinn-Phong分布(蓝色虚线,其中 n = 12000 n = 12000 n=12000)。右侧展示了金属铬、GGX分布,Beckmann分布的高光渲染结果。
Burley提出了广义的Trowbridge-Reitz (GTR) NDF,其目标是对NDF的形状进行更多的控制,尤其是分布的拖尾,其数学表达如下:
D ( m ) = k ( α , γ ) π ( 1 + ( n ⋅ m ) 2 ( α g 2 − 1 ) ) γ (9.46) D(\mathbf{m}) = \frac{k(\alpha,\gamma)}{\pi(1+(\mathbf{n}\cdot\mathbf{m})^2(\alpha^2_g -1))^\gamma}\tag{9.46} D(m)=π(1+(n⋅m)2(αg2−1))γk(α,γ)(9.46)
γ \gamma γ 控制尾部形状,当 γ \gamma γ = 2,GTR 分布和 CGX 分布是等效的。当 γ \gamma γ 的值减小,分布的尾部会变得更长,当它增大,分布的尾部会变得更短。当 γ \gamma γ 较大时,GTR 分布与 Beckmann 分布类似, k ( α , γ ) k(\alpha,\gamma) k(α,γ) 项是归一化系数,因为它比其他 NDF 的归一项系数都复杂,所以我们要给出一个单独的数学表达式:
k ( α , γ ) = { ( γ − 1 ) ( α 2 − 1 ) ( 1 − ( α 2 ) ( 1 − γ ) , 当 γ ≠ 1 且 α ≠ 1 , ( α 2 − 1 ) l n ( α 2 ) , 当 γ = 1 且 α ≠ 1 , 1 , 当 α = 1 k(\alpha,\gamma)=\begin{cases} \frac{(\gamma - 1)(\alpha^2 - 1)}{(1-(\alpha^2)^{(1-\gamma)}},&\text{当 $\gamma\neq 1$ 且 $\alpha\neq 1,$}\\ \frac{(\alpha^2 - 1)}{ln(\alpha^2)},&\text{当 $\gamma=1$ 且 $\alpha\neq 1$,}\\ 1,&\text{当 $\alpha=1$} \end{cases} k(α,γ)=⎩ ⎨ ⎧(1−(α2)(1−γ)(γ−1)(α2−1),ln(α2)(α2−1),1,当 γ=1 且 α=1,当 γ=1 且 α=1,当 α=1
GTR 分布不是形状不变的,这使得查找他的 S m i t h Smith Smith G 2 G_2 G2 掩码函数变得复杂。在 NDF 发布后的三年时间才发布了 G 2 G_2 G2 的解决方案。这个 G 2 G_2 G2 的解相当复杂,他只给出了某些 γ \gamma γ 值对应的解析解表(而其他中间值必须使用插值获得)。GTR 分布的另一个问题是参数 α \alpha α 和 γ \gamma γ 会以一种非直观的方式感知到的粗糙度和“辉光”
Student t 分布(STD) 和 指数幂分布(EPD)这两个NDF中包含了形状控制参数。与GTR相比,这些函数相对于它们的粗糙度参数是形状不变的。在撰写本文的时候,它们才刚刚发布,因此尚不清楚它们在应用程序中的实用性。
为了更好地对被测材质进行模拟,一种替代方案是使用多个镜面波瓣,而不是增加单个NDF的复杂性,这个想法是由Cook和Torrance提出的。Ngan 对其进行了实验测试,他发现对于许多材质,添加第二个波瓣确实可以显著改善匹配度。皮克斯的PxrSurface材质中包含一个“粗糙镜面(roughspecular)”波瓣,它便是用于这个目的(与主镜面波瓣结合在一起)。这个额外的波瓣是一个具有所有相关参数和构成项的镜面微表面BRDF。Imageworks采用了一种更加精确的方法,它使用了两个GGX分布的混合,并将它们作为一个扩展的NDF暴露给用户,而不是作为一整个单独的镜面BRDF项。在这种情况下,只需要两个额外参数即可,分别是第二个粗糙度值和二者之间的混合量(用于控制插值)。
各项异性法线分布函数
虽然大多数材质的表面都是各向同性的,但有一些材料的微观结构具有显著的各向异性,这大大地影响了它们的材质外观,例如图9.26所示。为了准确地渲染这些材质,我们需要具有各向异性NDF的BRDF。
与各向同性的NDF不同,各向异性的NDF不能仅仅使用单独的夹角 θ m \theta _m θm进行描述,它还需要额外的方向信息。一般情况下,我们需要将微表面法线 m \mathbf{m} m变换到由法线 n \mathbf{n} n、切线(tangent)向量 t \mathbf{t} t、副切线(bitangent)向量 b \mathbf{b} b所定义的局部坐标系或者切线空间中。在实践中,这个变换通常被表示为三个独立的点积: m ⋅ n \mathbf{m} \cdot \mathbf{n} m⋅n, m ⋅ t \mathbf{m} \cdot \mathbf{t} m⋅t和 m ⋅ b \mathbf{m} \cdot \mathbf{b} m⋅b。
当我们将法线映射与各向异性BRDF相结合时,最重要的一点是,确保法线映射在变换法线的同时,也会对切线和副切线进行变换。通常来说,这个过程是通过对扰动法线 n \mathbf{n} n,以及顶点插值而来的切线 t 0 \mathbf{t}_0 t0和副切线 b 0 \mathbf{b}_0 b0,应用改进的Gram-Schmidt过程来完成的。其数学表达如下(假设 n \mathbf{n} n已经被事先归一化了):
t ′ = t 0 − ( t 0 ⋅ n ) n ⟹ t = t ′ ∥ t ′ ∥ , b ′ = b 0 − ( b 0 ⋅ n ) n , b ′ ′ = b ′ − ( b ′ ⋅ t ) t } ⇒ b = b ′ ′ ∥ b ′ ′ ∥ (9.48) \begin{array}{l}\mathbf{t}^{\prime}=\mathbf{t}_{0}-\left(\mathbf{t}_{0} \cdot \mathbf{n}\right) \mathbf{n} \quad \Longrightarrow \mathbf{t}=\frac{\mathbf{t}^{\prime}}{\left\|\mathbf{t}^{\prime}\right\|}, \\ \left.\begin{array}{rl}\mathbf{b}^{\prime} & =\mathbf{b}_{0}-\left(\mathbf{b}_{0} \cdot \mathbf{n}\right) \mathbf{n}, \\ \mathbf{b}^{\prime \prime} & =\mathbf{b}^{\prime}-\left(\mathbf{b}^{\prime} \cdot \mathbf{t}\right) \mathbf{t}\end{array}\right\} \Rightarrow \mathbf{b}=\frac{\mathbf{b}^{\prime \prime}}{\left\|\mathbf{b}^{\prime \prime}\right\|} \\\end{array} \tag{9.48} t′=t0−(t0⋅n)n⟹t=∥t′∥t′,b′b′′=b0−(b0⋅n)n,=b′−(b′⋅t)t}⇒b=∥b′′∥b′′(9.48)
或者也在第一行之后,通过 n \mathbf{n} n和 t \mathbf{t} t的叉乘来得到正交向量 n \mathbf{n} n。
在实现拉丝金属和卷发等效果的时候,需要对切线方向进行逐像素的修改,一般是通过一张切线贴图(tangent map)来实现的。这个纹理贴图存储了逐像素的切线信息,类似于法线贴图中存储的逐像素法线信息。切线贴图通常存储的是切线向量在垂直于法线的平面上的二维投影。这种数据表示方法可以很好地与纹理过滤进行工作,并且也可以像法线贴图一样进行压缩。有些应用程序存储的是一个标量旋转角度,用于将切线向量围绕法线 n \mathbf{n} n进行旋转。虽然这种数据表示方式更加紧凑,但是当旋转角度突然从 36 0 ∘ 360^{\circ} 360∘切换到 0 ∘ 0^{\circ} 0∘的时候,很容易产生纹理滤波的瑕疵。
创建各向异性NDF的一种常见方法是,将现有的各向同性NDF进行推广,这种一般性的方法可以应用于任何形状不变的各向同性NDF,这也是形状不变的NDF更加实用的另一个原因。这里我们回顾一下,形状不变的各向同性NDF可以写成下面的形式:
D ( m ) = χ + ( n ⋅ m ) α 2 ( n ⋅ m ) 4 g ( 1 − ( n ⋅ m ) 2 α ( n ⋅ m ) ) (9.49) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\alpha^{2}(\mathbf{n} \cdot \mathbf{m})^{4}} g\left(\frac{\sqrt{1-(\mathbf{n} \cdot \mathbf{m})^{2}}}{\alpha(\mathbf{n} \cdot \mathbf{m})}\right) \tag{9.49} D(m)=α2(n⋅m)4χ+(n⋅m)g(α(n⋅m)1−(n⋅m)2)(9.49)
方程中的函数 g g g是一个代表NDF形状的一维函数。方程9.49的其各向异性版本是:
D ( m ) = χ + ( n ⋅ m ) α x α y ( n ⋅ m ) 4 g ( ( t ⋅ m ) 2 α x 2 + ( b ⋅ m ) 2 α y 2 ( n ⋅ m ) ) (9.50) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\alpha_{x} \alpha_{y}(\mathbf{n} \cdot \mathbf{m})^{4}} g\left(\frac{\sqrt{\frac{(\mathbf{t} \cdot \mathbf{m})^{2}}{\alpha_{x}^{2}}+\frac{(\mathbf{b} \cdot \mathbf{m})^{2}}{\alpha_{y}^{2}}}}{(\mathbf{n} \cdot \mathbf{m})}\right) \tag{9.50} D(m)=αxαy(n⋅m)4χ+(n⋅m)g (n⋅m)αx2(t⋅m)2+αy2(b⋅m)2 (9.50)
方程中的参数 α x \alpha_{x} αx和 α y \alpha_{y} αy,分别代表了沿 t \mathbf{t} t方向和 b \mathbf{b} b方向的粗糙度。如果 α x = α y \alpha_{x}=\alpha_{y} αx=αy的话,方程9.50还可以退化为各向同性的形式。
各向异性NDF的 G 2 G_2 G2 masking-shadowing函数,与各向同性中的基本相同,除了变量 a a a(用于传递给 Λ \Lambda Λ函数)的计算有所不同:
a = n ⋅ s α x 2 ( t ⋅ s ) 2 + α y 2 ( b ⋅ s ) 2 (9.51) a=\frac{\mathbf{n} \cdot \mathbf{s}}{\sqrt{\alpha_{x}^{2}(\mathbf{t} \cdot \mathbf{s})^{2}+\alpha_{y}^{2}(\mathbf{b} \cdot \mathbf{s})^{2}}} \tag{9.51} a=αx2(t⋅s)2+αy2(b⋅s)2n⋅s(9.51)
其中方程9.51中的向量 s \mathbf{s} s,代表了相机的观察方向 v \mathbf{v} v或者光线的入射方向 l \mathbf{l} l。
利用这种方法,我们可以推导出各向异性版本的Beckmann NDF:
D ( m ) = χ + ( n ⋅ m ) π α x α y ( n ⋅ m ) 4 exp ( − ( t ⋅ m ) 2 α x 2 + ( b ⋅ m ) 2 α y 2 ( n ⋅ m ) 2 ) (9.52) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\pi \alpha_{x} \alpha_{y}(\mathbf{n} \cdot \mathbf{m})^{4}} \exp \left(-\frac{\frac{(\mathbf{t} \cdot \mathbf{m})^{2}}{\alpha_{x}^{2}}+\frac{(\mathbf{b} \cdot \mathbf{m})^{2}}{\alpha_{y}^{2}}}{(\mathbf{n} \cdot \mathbf{m})^{2}}\right) \tag{9.52} D(m)=παxαy(n⋅m)4χ+(n⋅m)exp −(n⋅m)2αx2(t⋅m)2+αy2(b⋅m)2 (9.52)
以及各向异性版本的GGX NDF,二者的效果如图9.38所示:
D ( m ) = χ + ( n ⋅ m ) π α x α y ( ( t ⋅ m ) 2 α x 2 + ( b ⋅ m ) 2 α y 2 + ( n ⋅ m ) 2 ) 2 (9.53) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\pi \alpha_{x} \alpha_{y}\left(\frac{(\mathbf{t} \cdot \mathbf{m})^{2}}{\alpha_{x}^{2}}+\frac{(\mathbf{b} \cdot \mathbf{m})^{2}}{\alpha_{y}^{2}}+(\mathbf{n} \cdot \mathbf{m})^{2}\right)^{2}} \tag{9.53} D(m)=παxαy(αx2(t⋅m)2+αy2(b⋅m)2+(n⋅m)2)2χ+(n⋅m)(9.53)
图9.38:利用各向异性NDF渲染的球体,其中第一行使用的是Beckmann NDF,第二行使用的是GGX NDF。在这两行中,粗糙度参数 α y \alpha_{y} αy保持不变, α x \alpha_{x} αx从左到右递增。
虽然将各向异性NDF参数化的最直接方法,就是将各向同性的粗糙度参数化表示使用两次,一次用于 α x \alpha_{x} αx,一次用于 α y \alpha_{y} αy,但有时也会使用其他形式的参数化表示。在Disney原则着色模型中,各向同性的粗糙度参数 r r r会与另一个范围为 [ 0 , 1 ] [0,1] [0,1]的标量参数 k a n i s o k_{aniso} kaniso相结合,然后通过以下方式来计算出 α x \alpha_{x} αx和 α y \alpha_{y} αy的值:
k aspect = 1 − 0.9 k aniso , α x = r 2 k aspect , α y = r 2 k aspect . (9.54) \begin{aligned} k_{\text {aspect }} & =\sqrt{1-0.9 k_{\text {aniso }}}, \\ \alpha_{x} & =\frac{r^{2}}{k_{\text {aspect }}}, \\ \alpha_{y} & =r^{2} k_{\text {aspect }} .\end{aligned} \tag{9.54} kaspect αxαy=1−0.9kaniso ,=kaspect r2,=r2kaspect .(9.54)
方程中的0.9将长宽比限制为 10 : 1 10:1 10:1。
Imageworks 使用了另一种不同形式的参数化方法,它允许构建任意程度的各向异性:
α x = r 2 ( 1 + k aniso ) , α y = r 2 ( 1 − k aniso ) . (9.55) \begin{array}{l}\alpha_{x}=r^{2}\left(1+k_{\text {aniso }}\right), \\ \alpha_{y}=r^{2}\left(1-k_{\text {aniso }}\right) .\end{array} \tag{9.55} αx=r2(1+kaniso ),αy=r2(1−kaniso ).(9.55)
多次反弹的表面反射
正如章节9.7中所提到的,微表面BRDF理论并没有考虑到在微表面间进行多次反弹(bounce)的那部分光线。这种简化会导致一些能量损失和表面变暗,尤其是对于那些具有粗糙表面的金属而言。
Imageworks 所使用的技术,将之前工作进行结合,创建了一个可以被添加到BRDF中的项,从而对多次反弹的表面反射进行模拟:
f m s ( l , v ) = F ˉ R s F 1 ‾ π ( 1 − R s F 1 ‾ ) ( 1 − F ˉ ( 1 − R s F 1 ) ‾ ) ( 1 − R s F 1 ( l ) ) ( 1 − R s F 1 ( v ) ) (9.56) f_{\mathrm{ms}}(\mathbf{l}, \mathbf{v})=\frac{\bar{F} \overline{R_{\mathrm{sF} 1}}}{\pi\left(1-\overline{R_{\mathrm{sF} 1}}\right)\left(1-\bar{F}\left(1-\overline{\left.R_{\mathrm{sF} 1}\right)}\right)\right.}\left(1-R_{\mathrm{sF} 1}(\mathbf{l})\right)\left(1-R_{\mathrm{sF} 1}(\mathbf{v})\right) \tag{9.56} fms(l,v)=π(1−RsF1)(1−Fˉ(1−RsF1))FˉRsF1(1−RsF1(l))(1−RsF1(v))(9.56)
其中 R s F 1 R_{\mathrm{sF} 1} RsF1是指 f s F 1 f_{\mathrm{sF} 1} fsF1上的定向反照率(directional albedo),也就是当 F 0 = 1 F_0 = 1 F0=1时的镜面BRDF项。函数 R s F 1 R_{\mathrm{sF} 1} RsF1依赖于粗糙度 α \alpha α和仰角 θ \theta θ,这个函数是相对平滑的,因此可以对它进行预计算(使用方程9.8或者方程9.9),并将结果存储在一个尺寸很小的二维纹理中,Imageworks发现使用 32 × 32 32 × 32 32×32的分辨率就足够了。
函数 R s F 1 ‾ \overline{R_{\mathrm{sF} 1}} RsF1是 R s F 1 R_{\mathrm{sF} 1} RsF1在半球上的余弦加权平均值,这消除了仰角 θ \theta θ带来的变化,使得 R s F 1 ‾ \overline{R_{\mathrm{sF} 1}} RsF1只依赖于粗糙度 α \alpha α,因此可以将其存储在一个一维纹理中,或者是使用一个便于计算的曲线来对其进行近似。由于 R s F 1 R_{\mathrm{sF} 1} RsF1是关于表面法线 n \mathbf{n} n旋转对称的,因此可以用一个一维积分来计算 R s F 1 ‾ \overline{R_{\mathrm{sF} 1}} RsF1,这里我们还使用了换元法 μ = cos θ \mu=\cos \theta μ=cosθ来进行推导(详见方程9.6):
R s F 1 ‾ = ∫ s ∈ Ω R s F 1 ( s ) ( n ⋅ s ) d s ∫ s ∈ Ω ( n ⋅ s ) d s = 1 π ∫ ϕ = 0 2 π ∫ μ = 0 1 R s F 1 ( μ ) μ d μ d ϕ = 2 ∫ μ = 0 1 R s F 1 ( μ ) μ d μ . (9.57) \begin{aligned} \overline{R_{\mathrm{sF} 1}} & =\frac{\int_{\mathbf{s} \in \Omega} R_{\mathrm{sF} 1}(\mathbf{s})(\mathbf{n} \cdot \mathbf{s}) d \mathbf{s}}{\int_{\mathbf{s} \in \Omega}(\mathbf{n} \cdot \mathbf{s}) d \mathbf{s}}=\frac{1}{\pi} \int_{\phi=0}^{2 \pi} \int_{\mu=0}^{1} R_{\mathrm{sF} 1}(\mu) \mu d \mu d \phi \\ & =2 \int_{\mu=0}^{1} R_{\mathrm{sF} 1}(\mu) \mu d \mu .\end{aligned} \tag{9.57} RsF1=∫s∈Ω(n⋅s)ds∫s∈ΩRsF1(s)(n⋅s)ds=π1∫ϕ=02π∫μ=01RsF1(μ)μdμdϕ=2∫μ=01RsF1(μ)μdμ.(9.57)
最后,方程9.56中的 F ‾ \overline{F} F代表了菲涅尔项的余弦加权平均值,可以用同样的方法来计算它:
F ˉ = 2 ∫ μ = 0 1 F ( μ ) μ d μ (9.58) \bar{F}=2 \int_{\mu=0}^{1} F(\mu) \mu d \mu \tag{9.58} Fˉ=2∫μ=01F(μ)μdμ(9.58)
Imageworks提供了一个方程9.58的封闭解,即 F F F的广义Schlick形式(方程9.18):
F ˉ = 2 p 2 F 90 + ( 3 p + 1 ) F 0 2 p 2 + 3 p + 1 (9.59) \bar{F}=\frac{2 p^{2} F_{90}+(3 p+1) F_{0}}{2 p^{2}+3 p+1} \tag{9.59} Fˉ=2p2+3p+12p2F90+(3p+1)F0(9.59)
如果使用原始形式的Schlick近似(方程9.16),那么这个解可以简化为以下形式:
F ˉ = 20 21 F 0 + 1 21 (9.60) \bar{F}=\frac{20}{21} F_{0}+\frac{1}{21} \tag{9.60} Fˉ=2120F0+211(9.60)
在各向异性的情况下,Imageworks使用了介于 α x \alpha_{x} αx和 α y \alpha_{y} αy之间的中间粗糙度来计算 f m s f_{ms} fms。这种近似策略可以避免增加 R s F 1 R_{\mathrm{sF} 1} RsF1查找表的维度,同时引入的误差很小。
Imageworks多次反弹的高光项结果如图9.39所示。
图9.39:每一行的表面粗糙度从左到右递增。上面两行展示的是一种金色的金属材质,其中第一行在渲染的时候并没有使用Imageworks多次反弹项,而第二行在渲染的时候则使用了多次反弹项。二者之间的差异,对于表面粗糙度较高的球体而言最为明显。接下来的两行是黑色的电介质材质,其中第三行在渲染的时候没有使用多次反弹项,而第四行则使用了多次反弹项。第三行和第四行的差异更加细微,因为它们的镜面反射率要低得多。
次表面散射的BRDF模型
在上一小节中,我们讨论了表面反射(surface reflection),或者叫做镜面反射(specular reflection);而在这一小节中,我们将讨论反射问题的另一方面,即在表面以下的折射光线会发生什么。正如我们在章节9.1.4中讨论的那样,这些折射光线经历了某种散射作用(scatter)和吸收作用(absorption)的组合,其中一部分光线最终会被重新发射回原始表面。在本小节中,我们将重点讨论不透明电介质中的局部次表面散射,以及它们的BRDF模型。这里我们并不会讨论有关金属材质的话题,因为金属材质并没有任何明显的次表面光线作用(因为金属的对光线的吸收作用很强)。有关透明电介质材质,以及表现出全局次表面散射的电介质材质的话题,将在第14章进行讨论。
我们将首先从漫反射模型开始讨论,介绍漫反射颜色的相关特性,以及真实世界中漫反射材质可能具有的颜色值。而在接下来的几个小节中,我们会解释表面粗糙度是如何对漫反射着色产生影响的;以及对于给定的材质表面,到底是选择使用光滑表面还是粗糙表面的着色模型,以及这个选择的标准。在最后两个小节中,我们会主要关注光滑表面模型和粗糙表面模型本身。
次表面反照率
不透明电介质的次表面反照率(subsurface albedo) ρ s s \rho_{ss} ρss指的是从表面逃逸的光线能量,与进入物质内部的光线能量之比。 ρ s s \rho_{ss} ρss的值在0(光线被全部吸收)到1(没有任何光线被吸收)之间,并且与波长有关,因此 ρ s s \rho_{ss} ρss在渲染中被表示为一个RGB向量。对于艺术家创作而言, ρ s s \rho_{ss} ρss通常会被称为表面的漫反射颜色(diffuse color),就像是法线入射的菲涅尔反射率 F 0 F_0 F0,通常会被称为镜面颜色(specular color)一样。
对于电介质而言,由于大部分光线都会透射进物质内部,而不是在表面上直接被反射出去,因此这些材质的次表面反照率 ρ s s \rho_{ss} ρss通常会更加明亮,在视觉上要比高光颜色 F 0 F_0 F0更加重要。与表面的菲涅尔反射不同,光线在物质内部的吸收是一个独特的物理过程,因此 ρ s s \rho_{ss} ρss通常具有与 F 0 F_0 F0不同的光谱分布(即不同的RGB颜色)。例如:彩色塑料是由透明的基板和嵌入在其内部的颜料颗粒组成的,光线照射到彩色塑料表面上,所产生的镜面反射光线是无色的,而漫反射光线有一部分(特定波长)会被颜料颗粒吸收,因此剩余被反射出来的光线会具有某种颜色。比如我们能够看到在一个红色的塑料球上看到一个白色的高光。
次表面反照率可以被认为是光线吸收与光线散射之间“相互竞争”所产生的结果,即光线到底是先被散射出物体,还是先被吸收?这也就是为什么液体上的泡沫,要比液体本身亮得多的原因:起泡过程并不会改变液体对光线的吸收率,但是所产生的大量气液界面会大大增加光线的散射量,这使得大部分入射光线在被吸收之前,会先被散射出去,最终导致了较高的次表面反照率和明亮的材质外观。新鲜的积雪是高反照率物质的另一个例子:新鲜的积雪十分蓬松,内部充满了空气,雪花颗粒与空气之间界面的散射量很大,吸收量很少,从而导致次表面反照率在可见光谱上可以达到0.8或者更大。白色油漆的次表面反照率要稍少小一些,约为0.7。日常生活中遇到的许多物质,例如混凝土、石头、土壤等,反照率大约在0.15 ~ 0.4之间。而煤炭是一种次表面反照率极低的物质,接近0.0。
和液体泡沫的例子相反,许多物质在潮湿之后反而会变得更暗。如果一个材料表面是多孔的,那么水就会渗入到原本充满空气的空间。相比于空气的折射率,电介质材料的折射率要更加接近于水。表面两侧相对折射率的下降,会降低物体内部的散射率,这使得光线在逃逸出物质之前,需要传播的平均距离更长。这种变化会导致更多的光线被吸收,从而使得次表面反照率变得更暗。
有一个常见的误解,即真实感材质的 ρ s s \rho_{ss} ρss永远不应该低于0.015-0.03的下限(在8 bit非线性sRGB编码中为30-50),这个误解甚至出现在了一些广受好评的材质创作指南中[1163]。然而,这个下限所基于的颜色测量,包含了表面反射(specular)和次表面反射(diffuse)两部分,因此是过高的。实际材质可以有更低的 ρ s s \rho_{ss} ρss值。例如:联邦规范中的“OSHA Black”涂料标准 [524],其 Y Y Y值为0.35(最大为100)。考虑到测量条件和表面光泽效应,这个 Y Y Y所对应的 ρ s s \rho_{ss} ρss值约为0.0035(在8 bit非线性sRGB编码中为11)。
当从真实世界的表面材质获取点值或者纹理时,从中分离镜面反射是十分重要的,这种提取操作可以通过精确控制光照和偏振滤光器来完成。为获得更加准确的颜色数据,还应当进行校准。
不是所有的 RGB 三元组都代表一个合理的(甚至是物理上存在的) ρ s s \rho_{ss} ρss 值,反射光谱比发射光谱功率分布更受限制:对于任何波长,他们都不超过1,并且他们通常非常光滑,这个限制定义了色彩空间中的体积,其中包含了 ρ s s \rho_{ss} ρss 所有合理的 RGB 值。甚至相对较小的 sRGB 色域也包含超出了这个体积的颜色,所以在设置 ρ s s \rho_{ss} ρss 值的时候要小心已避免指定不自然的饱和和明亮颜色。除了降低真实感外,预先计算全局照明时此类颜色还会导致过亮的全局照明。
次表面反射和粗糙度的规模
一些用于次表面反射的 BRDF 模型考虑了表面粗糙度(通常是通过使用具有一个漫反射微 BRDF f μ f_\mu fμ 的微面理论),而有些不考虑。使用哪种类型的模型的决定因素不仅仅是表面的粗糙程度,尽管这是一个常见的误区。正确的决定因素涉及到表面的不规则的相对大小,和次表面散射距离
如图9.40所示,如果微观几何的不规则性大于次表面散射的距离(图9.40左上),那么次表面散射将会表现出一些与微观几何有关的效果(microgeometry-related effects),例如逆反射(详见图9.29)。对于这种类型的表面,应当使用一个粗糙表面的漫反射模型。如上所述,这类模型一般都基于微表面理论,它将次表面散射现象视为每个微表面的局部散射(即将此表面散射视为微表面的局部现象),即只会对micro-BRDF f μ f_{\mu} fμ产生影响。
如果次表面散射的距离都大于表面的不规则性(图9.40右上),那么在模拟次表面散射现象的时候,应该认为表面是平坦的,不会出现逆反射等效应。此时次表面散射对于微表面而言,并不是一个局部现象,因此无法使用微表面理论来进行描述。在这种情况下,应当使用一个光滑表面的漫反射模型。
图9.40:具有相似NDF,但是微观几何尺度与次表面散射距离相对大小不同的三个表面。左上角:次表面散射距离小于表面不规则性;右上角:次表面散射距离大于表面不规则性。下方:展示了一个具有多种不同尺度粗糙度的微表面,图中红色虚线代表了其有效表面,它仅包含大于次表面散射距离的微观结构。
而在其他中间情况下,即表面在比散射距离更大或者更小的尺度上都具有一定的粗糙度,那么这时应当使用一个粗糙表面的漫反射模型,但是其有效表面(effective surface)只包含那些比散射距离更大的不规则性。在这种情况下,漫反射和镜面反射都可以使用微表面理论来进行建模,但是二者的粗糙度值是不同的:其中高光项将会使用一个基于实际表面粗糙度的值;而漫反射项将会使用一个较低的值,它基于的是有效表面的粗糙度。
观察尺度也与此相关,因为它决定了“微观几何”的具体含义。例如:一个应当使用粗糙表面漫反射模型的经典例子是月球,因为它表现出了明显的逆反射效应。当我们从地球上观察月球的时候,观察尺度非常大,以至于月球表面上一个五英尺高的巨石都可以算是“微观几何”。因此,我们能够观察到粗糙表面的漫反射效应(例如后反射)也就并不奇怪了。
光滑表面的次表面模型
本小节我们将讨论光滑表面的次表面模型(smooth-surface subsurface model)。这些方法适用于对表面不规则性小于次表面散射距离的材质进行建模,这些材质的表面粗糙度并不会直接影响它们的漫反射着色,但是如果漫反射项和高光项是耦合的(本小节中一些模型是这样的),那么表面粗糙度可能会对漫反射着色产生间接影响。
如章节9.3中所提到的,实时渲染程序通常会使用Lambertian项来对局部次表面散射现象进行建模,在这种情况下,BRDF的漫反射项是次表面反照率 ρ s s \rho_{ss} ρss除以 π \pi π:
f d i f f ( l , v ) = ρ s s π (9.61) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\frac{\rho_{\mathrm{ss}}}{\pi} \tag{9.61} fdiff(l,v)=πρss(9.61)
Lambertian模型并没有考虑到这样一个事实,即表面反射的光线并不能用于次表面散射。为了对这个模型进行改进,应当在表面反射项(镜面反射项)和次表面反射项(漫反射项)之间进行能量权衡。菲涅尔效应表明,这种表面-次表面之间的能量权衡,应当随着入射光角 θ i \theta_i θi的变化而变化。随着光线入射角度(尤其是靠近掠射角度时)的增大,漫反射率会减小,镜面反射率会增大。实现这种平衡的最基本方法是,将漫反射项乘以1减去镜面项的菲涅尔部分( F F F项)。如果某个高光项是由平坦镜面所产生的话,那么对应产生的漫反射项为:
f d i f f ( l , v ) = ( 1 − F ( n , l ) ) ρ s s π (9.62) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=(1-F(\mathbf{n}, \mathbf{l})) \frac{\rho_{\mathrm{ss}}}{\pi} \tag{9.62} fdiff(l,v)=(1−F(n,l))πρss(9.62)
如果镜面反射项是一个微表面BRDF项的话,那么对应产生的漫反射项为:
f d i f f ( l , v ) = ( 1 − F ( h , l ) ) ρ s s π (9.63) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=(1-F(\mathbf{h}, \mathbf{l})) \frac{\rho_{\mathrm{ss}}}{\pi} \tag{9.63} fdiff(l,v)=(1−F(h,l))πρss(9.63)
方程9.62最终会生成均匀分布的出射光线,因为这个BRDF的结果并不依赖于出射方向 v \mathbf{v} v。这种光线行为是有一定道理的,因为光线在重新发射出表面之前,通常都会经历多次散射事件,因此其最终的出射方向将会是随机的。然而,存在有两个理由使得我们怀疑其实出射光线的分布并不是完全均匀的。首先,由于方程9.62中的漫反射BRDF项会随光线入射方向的变化而变化,Helmholtz互易性意味着,它也会随着出射方向的变化而变化。第二,光线在最终射出表面的时候会发生折射,根据光线折射的性质,这些最终射出的光线会具有一定的方向性,即会偏向于某些方向。
Shirley等人提出了一种用于平坦表面的耦合漫反射项,它解决了菲涅尔效应与表面-次表面反射之间的权衡问题,同时它还满足能量守恒和Helmholtz互易性。推导中假设菲涅尔反射使用了Schlick近似方法(方程9.16),其数学形式如下:
f d i f f ( l , v ) = 21 20 π ( 1 − F 0 ) ρ s s ( 1 − ( 1 − ( n ⋅ l ) + ) 5 ) ( 1 − ( 1 − ( n ⋅ v ) + ) 5 ) (9.64) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\frac{21}{20 \pi}\left(1-F_{0}\right) \rho_{\mathrm{ss}}\left(1-\left(1-(\mathbf{n} \cdot \mathbf{l})^{+}\right)^{5}\right)\left(1-\left(1-(\mathbf{n} \cdot \mathbf{v})^{+}\right)^{5}\right) \tag{9.64} fdiff(l,v)=20π21(1−F0)ρss(1−(1−(n⋅l)+)5)(1−(1−(n⋅v)+)5)(9.64)
方程9.64只适用于镜面反射为完美菲涅尔镜面的表面。Ashikhmin和Shirley提出了一个广义的版本,它可以用来计算一个互易的(reciprocal)、能量守恒的漫反射项,并且它可以与任何高光项结合使用。Kelemen和Szirmay-Kalos 对其进行了进一步完善:
f d i f f ( l , v ) = ρ s s ( 1 − R s p e c ( l ) ) ( 1 − R s p e c ( v ) ) π ( 1 − R s p e c ‾ ) (9.65) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\rho_{\mathrm{ss}} \frac{\left(1-R_{\mathrm{spec}}(\mathbf{l})\right)\left(1-R_{\mathrm{spec}}(\mathbf{v})\right)}{\pi\left(1-\overline{R_{\mathrm{spec}}}\right)} \tag{9.65} fdiff(l,v)=ρssπ(1−Rspec)(1−Rspec(l))(1−Rspec(v))(9.65)
方程中的 R s p e c R_{\mathrm{spec}} Rspec是高光项的定向反照率(directional albedo,详见章节9.3),而 R s p e c ‾ \overline{R_{\mathrm{spec}}} Rspec则是它在半球上的余弦加权平均值。值 R s p e c R_{\mathrm{spec}} Rspec可以使用方程9.8或者方程9.9预计算出来,并将结果存储在一个查找表中。平均值 R s p e c ‾ \overline{R_{\mathrm{spec}}} Rspec的计算方法与我们之前所遇到的 R s F 1 ‾ \overline{R_{\mathrm{sF1}}} RsF1相同(方程9.57)。
方程9.65在形式上与方程9.56有一些明显的相似之处,这并不奇怪,因为Imageworks的多次弹射高光项,就是从Kelemen-Szirmay-Kalos耦合漫反射项中推导出来的。然而,二者之间有一个重要的区别:在这里我们使用的是 R s p e c R_{\mathrm{spec}} Rspec而不是 R s F 1 R_{\mathrm{sF1}} RsF1,即使用了包含菲涅尔项、多次弹射高光项 f m s f_{ms} fms(如果使用了的话)在内的、完整的镜面反射BRDF项的定向反照率。这种差异增加了 R s p e c R_{\mathrm{spec}} Rspec查找表的维度,因为它不仅取决于粗糙度 α \alpha α和仰角 θ \theta θ,还取决于菲涅尔反射率。
在Imageworks对Kelemen-Szirmay-Kalos耦合漫反射项的实现中,他们使用了一个三维查找表,其中的第三个维度是折射率。他们发现,在积分中使用多次弹射项,可以使 R s p e c R_{\mathrm{spec}} Rspec变得比 R s F 1 R_{\mathrm{sF1}} RsF1更加平滑,因此 16 × 16 × 16 16\times 16\times 16 16×16×16查找表很足够了,图9.41展示了相应的结果。
图9.41:第一行和第三行图片展示了在一个Lambertian项中添加高光项的渲染结果。第二行和第四行图片使用了Kelemen-Szirmay-Kalos耦合漫反射项,并添加了一个相同的高光项。上面两行的粗糙度值要比下面两行低。在每一行中,粗糙度从左到右递增。
如果BRDF使用Schlick Fresnel近似方法,但是不包含多次反弹高光项的话,那么 F 0 F_0 F0的值可以从积分中提取出来。这样我们就可以只使用一个二维的 R s p e c R_{\mathrm{spec}} Rspec查找表,而不是Karis 所讨论的三维表。此外,Lazarov 提出了一个用于拟合 R s p e c R_{\mathrm{spec}} Rspec的解析函数,我们同样将系数 F 0 F_0 F0从积分中提取出来,从而对拟合函数进行简化。
粗糙表面次表面模型
作为迪士尼原则着色模型的一部分,burley 引入了一个漫反射BRDF项,用于匹配被测材质的粗糙度效果:
f d i f f ( l , v ) = χ + ( n ⋅ l ) χ + ( n ⋅ v ) ρ s s π ( ( 1 − k s s ) f d + 1.25 k s s f s s ) (9.66) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\chi^{+}(\mathbf{n} \cdot \mathbf{l}) \chi^{+}(\mathbf{n} \cdot \mathbf{v}) \frac{\rho_{\mathrm{ss}}}{\pi}\left(\left(1-k_{\mathrm{ss}}\right) f_{\mathrm{d}}+1.25 k_{\mathrm{ss}} f_{\mathrm{ss}}\right) \tag{9.66} fdiff(l,v)=χ+(n⋅l)χ+(n⋅v)πρss((1−kss)fd+1.25kssfss)(9.66)
其中
f d = ( 1 + ( F D 90 − 1 ) ( 1 − n ⋅ l ) 5 ) ( 1 + ( F D 90 − 1 ) ( 1 − n ⋅ v ) 5 ) , F D 90 = 0.5 + 2 α ( h ⋅ l ) 2 , f s s = ( 1 ( n ⋅ l ) ( n ⋅ v ) − 0.5 ) F S S + 0.5 , F S S = ( 1 + ( F S S 90 − 1 ) ( 1 − n ⋅ l ) 5 ) ( 1 + ( F S S 90 − 1 ) ( 1 − n ⋅ v ) 5 ) , F S S 90 = α ( h ⋅ l ) 2 , (9.67) \begin{aligned} f_{\mathrm{d}} & =\left(1+\left(F_{\mathrm{D} 90}-1\right)(1-\mathbf{n} \cdot \mathbf{l})^{5}\right)\left(1+\left(F_{\mathrm{D} 90}-1\right)(1-\mathbf{n} \cdot \mathbf{v})^{5}\right), \\[1mm] F_{\mathrm{D} 90} & =0.5+2 \sqrt{\alpha}(\mathbf{h} \cdot \mathbf{l})^{2}, \\ f_{\mathrm{ss}} & =\left(\frac{1}{(\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v})}-0.5\right) F_{\mathrm{SS}}+0.5, \\ F_{\mathrm{SS}} & =\left(1+\left(F_{\mathrm{SS} 90}-1\right)(1-\mathbf{n} \cdot \mathbf{l})^{5}\right)\left(1+\left(F_{\mathrm{SS} 90}-1\right)(1-\mathbf{n} \cdot \mathbf{v})^{5}\right), \\[1mm] F_{\mathrm{SS} 90} & =\sqrt{\alpha}(\mathbf{h} \cdot \mathbf{l})^{2},\end{aligned} \tag{9.67} fdFD90fssFSSFSS90=(1+(FD90−1)(1−n⋅l)5)(1+(FD90−1)(1−n⋅v)5),=0.5+2α(h⋅l)2,=((n⋅l)(n⋅v)1−0.5)FSS+0.5,=(1+(FSS90−1)(1−n⋅l)5)(1+(FSS90−1)(1−n⋅v)5),=α(h⋅l)2,(9.67)
方程9.67中的 α \alpha α是镜面粗糙度,在各向异性的情况下,则使用 α x \alpha_x αx和 α y \alpha_y αy之间的中间值。这个方程通常被称为迪斯尼漫反射模型(Disney diffuse model)。
次表面项 f s s f_{ss} fss的灵感来自于Hanrahan-Krueger BRDF,用于作为对远处物体的全局次表面散射现象的廉价近似。这个漫反射模型会基于用户控制的参数 k s s k_{ss} kss,将 f s s f_{ss} fss与粗糙漫反射项 f d f_{d} fd混合在一起。
迪士尼漫反射模型被广泛应用于电影和游戏(尽管没有次表面项)中。完整的迪斯尼漫反射BRDF还包含一个光泽(sheen)项,这主要是为了对纤维织物进行建模,同时也有助于补偿因缺乏多次弹射高光项而造成的能量损失。有关迪士尼光泽项的内容将在章节9.10中进行讨论。几年后,Burley提出了一个更新后的模型,旨在对全局次表面散射的渲染技术进行整合。
由于迪斯尼漫反射模型使用了与镜面BRDF相同的粗糙度参数,因此在对某些材质进行建模的时候,可能会遇到困难,详见图9.40。然而,可以通过一个很小的修改,从而使用一个单独的漫反射粗糙度值。
其他大多数粗糙表面的漫反射BRDF都是基于微表面理论开发的,它们具有不同的NDF、micro-BRDF f μ f_{\mu} fμ以及masking-shadowing函数 G 2 G_2 G2。其中最著名的模型是由Oren和Nayar提出的。Oren-Nayar BRDF使用了Lambertian的micro-BRDF、球面高斯NDF以及Torrance-Sparrow“V-cavity”的masking-shadowing函数。完整形式的BRDF模型了对二次反弹也进行了建模。Oren和Nayar还在他们的论文中引入了一个简化的“定性”模型。多年来,人们提出了一些对Oaren-Nayar模型的改进方法,包括对“定性”模型进行优化调整,使其在不增加额外成本的前提下,尽可能地接近完整模型;以及将micro-BRDF更改为一个更加精确的光滑表面漫反射模型。
Oren-Nayar模型假设了一个全新的微表面,与当前镜面模型所使用的微表面相比,它具有完全不同的法线分布和masking-shadowing函数。利用各向同性的GGX NDF和高度相关的Smith masking-shadowing函数,可以推导出两种不同的漫反射微表面模型。第一个模型是由Gotanda 提出的,他使用了方程9.64所描述的镜面耦合漫反射项来作为micro-BRDF,再对通用的微表面方程(方程9.26)进行数值积分,最后使用一个解析函数来对数值积分的数据进行拟合。Gotanda提出的BRDF并没有考虑微表面之间的相互反射,并且拟合函数也相对复杂。
使用与Gotanda BRDF相同的NDF、masking-shadowing函数和micro-BRDF,Hammon 对BRDF进行了数值模拟,同时将相互反射考虑在内。他指出,相互反射对于这种微表面结构而言十分重要,对于粗糙表面来说,相互反射大约占据了总反射中的一半。Hammon发现第二次反弹几乎包含了所有丢失的能量(即考虑更多的反弹次数,对最终结果的贡献并不大),因此他使用了两次反弹模拟的数据。 此外,可能是因为添加了相互反射,使得数据变得更加平滑,因此Hammon能够使用一个相当简单的函数,来对模拟结果进行拟合,最终的数学表达如下:
f d i f f ( l , v ) = χ + ( n ⋅ l ) χ + ( n ⋅ v ) ρ s s π ( ( 1 − α g ) f s m o o t h + α g f r o u g h + ρ s s f m u l t i ) (9.68) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\chi^{+}(\mathbf{n} \cdot \mathbf{l}) \chi^{+}(\mathbf{n} \cdot \mathbf{v}) \frac{\rho_{\mathrm{ss}}}{\pi}\left(\left(1-\alpha_{g}\right) f_{\mathrm{smooth}}+\alpha_{g} f_{\mathrm{rough}}+\rho_{\mathrm{ss}} f_{\mathrm{multi}}\right) \tag{9.68} fdiff(l,v)=χ+(n⋅l)χ+(n⋅v)πρss((1−αg)fsmooth+αgfrough+ρssfmulti)(9.68)
其中
f smooth = 21 20 ( 1 − F 0 ) ( 1 − ( 1 − n ⋅ l ) 5 ) ( 1 − ( 1 − n ⋅ v ) 5 ) , f rough = k facing ( 0.9 − 0.4 k facing ) ( 0.5 + n ⋅ h n ⋅ h ) , k facing = 0.5 + 0.5 ( l ⋅ v ) , f multi = 0.3641 α g , (9.69) \begin{aligned} f_{\text {smooth }} & =\frac{21}{20}\left(1-F_{0}\right)\left(1-(1-\mathbf{n} \cdot \mathbf{l})^{5}\right)\left(1-(1-\mathbf{n} \cdot \mathbf{v})^{5}\right), \\ f_{\text {rough }} & =k_{\text {facing }}\left(0.9-0.4 k_{\text {facing }}\right)\left(\frac{0.5+\mathbf{n} \cdot \mathbf{h}}{\mathbf{n} \cdot \mathbf{h}}\right), \\ k_{\text {facing }} & =0.5+0.5(\mathbf{l} \cdot \mathbf{v}), \\ f_{\text {multi }} & =0.3641 \alpha_{g},\end{aligned} \tag{9.69} fsmooth frough kfacing fmulti =2021(1−F0)(1−(1−n⋅l)5)(1−(1−n⋅v)5),=kfacing (0.9−0.4kfacing )(n⋅h0.5+n⋅h),=0.5+0.5(l⋅v),=0.3641αg,(9.69)
方程中的 α g \alpha_{g} αg是GGX镜面粗糙度。为了清楚起见,这里所使用术语与Hammon的陈述略有不同。请注意,方程9.69中的 f smooth f_{\text {smooth }} fsmooth ,其实就是方程9.64中不含 ρ s s / π \rho_{\mathrm{ss}} / \pi ρss/π因子的耦合漫反射BRDF,因为这个因子被包含在了方程9.68中。Hammon讨论了一些“混合”BRDF,即使用其他光滑表面的漫反射BRDF来替代 f smooth f_{\text {smooth }} fsmooth ,从而提高性能表现,或者改进旧着色模型下的资产兼容性。
总的来说,尽管Hammon并没有给出与测量数据的比较,但是他提出漫反射BRDF的计算开销很低,并且建立在可靠的理论原理之上。需要注意的是,表面不规则性大于散射距离的这个假设,是BRDF推导的基础,这可能会对它能够准确建模的材质类型有所限制,详见图9.40。
方程9.61中展示的简单Lambertian项仍然被许多实时渲染程序所采用,除了较低的计算成本之外,与其他的漫反射模型相比,它可以更加容易地和间接烘焙光照一起使用;与更加复杂的着色模型相比,二者之间的视觉差异通常是不易察觉的。然而,对于真实感的持续追求,正在推动精确模型的广泛使用。
布料的 BRDF 模型
布料往往具有不同于其他类型材质的微观几何结构,根据织物类型的不同,它可能还会具有高度重复的编织微观结构、从表面垂直突出的圆柱体(线),又或是二者都有。由于布料表面独特的特征外观,因此通常需要使用专门的着色模型来进行渲染,这些独特外观包括:各向异性的镜面高光,粗糙散射(光线在突出的、半透明的纤维中发生散射,从而导致边缘明亮的效果), 甚至颜色也会随着观察方向的变化而变化(这是由织物中不同颜色的线所引起的)。
除了BRDF之外,大多数织物还具有高频空间变化,这也是生成令人信服的布料材质的关键因素,如图9.42所示。
图9.42:一种使用《神秘海域4》布料系统的材质。左上方的球体使用了标准的BRDF,它具有GGX微表面镜面反射和Lambertian漫反射。上部中间的球体使用了纤维织物的BRDF。其他每个球体上都添加了不同类型的逐像素变化,从左上到右下分别是:织物编织细节,织物老化程度,细节瑕疵和小皱纹。
在游戏《神秘海域2》中,布料表面使用了以下的漫反射BRDF项:
f d i f f ( l , v ) = ρ s s π ( k r i m ( ( v ⋅ n ) + ) α r i m + k inner ( 1 − ( v ⋅ n ) + ) α inner + k diff ) (9.70) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})=\frac{\rho_{\mathrm{ss}}}{\pi}\left(k_{\mathrm{rim}}\left((\mathbf{v} \cdot \mathbf{n})^{+}\right)^{\alpha_{\mathrm{rim}}}+k_{\text {inner }}\left(1-(\mathbf{v} \cdot \mathbf{n})^{+}\right)^{\alpha_{\text {inner }}}+k_{\text {diff }}\right) \tag{9.70} fdiff(l,v)=πρss(krim((v⋅n)+)αrim+kinner (1−(v⋅n)+)αinner +kdiff )(9.70)
其中 k r i m k_{rim} krim是边缘光项(rim)的比例系数, k i n n e r k_{inner} kinner是正面(内部,inner)亮度项的比例系数, k d i f f k_{diff} kdiff是Lambertian项的比例系数。此外, α r i m \alpha_{\mathrm{rim}} αrim和 α i n n e r \alpha_{\mathrm{inner}} αinner分别控制了边缘项和内部项的衰减。这种行为并不是物理正确的,因为这些效果只与观察方向有关,与入射光线的方向无关。
相比之下,《神秘海洋4》中的布料材质使用了微表面模型或者微圆柱体模型,具体使用哪一种模型,取决于布料的高光项(会在之后的两个小节中进行详细描述),并且使用了一种叫做“环绕光照(wrap lighting)”的经验次表面散射方法,来对漫反射项进行近似:
f d i f f ( l , v ) ( n ⋅ l ) + ⇒ ρ s s π ( c s c a t t e r + ( n ⋅ l ) + ) ∓ ( n ⋅ l + w ) ∓ 1 + w (9.71) f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})(\mathbf{n} \cdot \mathbf{l})^{+} \Rightarrow \frac{\rho_{\mathrm{ss}}}{\pi}\left(\mathbf{c}_{\mathrm{scatter}}+(\mathbf{n} \cdot \mathbf{l})^{+}\right)^{\mp} \frac{(\mathbf{n} \cdot \mathbf{l}+w)^{\mp}}{1+w} \tag{9.71} fdiff(l,v)(n⋅l)+⇒πρss(cscatter+(n⋅l)+)∓1+w(n⋅l+w)∓(9.71)
这里我们使用了章节1中介绍过的符号 ( x ) ∓ (x)^{\mp} (x)∓,它表示0-1之间的限制操作。左侧这个奇怪的符号 f d i f f ( l , v ) ( n ⋅ l ) + ⇒ … f_{\mathrm{diff}}(\mathbf{l}, \mathbf{v})(\mathbf{n} \cdot \mathbf{l})^{+} \Rightarrow \dots fdiff(l,v)(n⋅l)+⇒…代表了这个模型会影响光照和BRDF,并使用箭头右边的项来取代左边的项。用户指定的参数 c s c a t t e r c_{scatter} cscatter是一种散射颜色;值 w w w的范围为 [ 0 , 1 ] [0,1] [0,1],用于控制环绕光照的宽度。
对于布料材质的建模,迪士尼将他们的漫反射BRDF项和一个光泽项相结合,从而对粗糙散射(asperity scattering)进行模拟:
f sheen ( l , v ) = k sheen c sheen ( 1 − ( h ⋅ l ) + ) 5 (9.72) f_{\text {sheen }}(\mathbf{l}, \mathbf{v})=k_{\text {sheen }} \mathbf{c}_{\text {sheen }}\left(1-(\mathbf{h} \cdot \mathbf{l})^{+}\right)^{5} \tag{9.72} fsheen (l,v)=ksheen csheen (1−(h⋅l)+)5(9.72)
其中 k s h e e n k_{sheen} ksheen是用于调节光泽项强度的用户参数。光泽颜色 c sheen \mathbf{c}_{\text {sheen }} csheen 会在白色和亮度归一化的 ρ s s \rho_{ss} ρss之间进行插值(由另一个用户参数进行控制)。这里的亮度归一化是指用 ρ s s \rho_{ss} ρss除以其亮度值,从而分离它的色相(hue)和饱和度(saturation)。
微表面布料模型
Ashikhmin等人提出使用一个逆高斯NDF来模拟天鹅绒(velvet)材质。这个NDF在后续工作中又进行了一些微调,同时还提出了一种用于模拟一般材质的微表面BRDF变体,这个变体没有 masking-shadowing项,也没有对分母进行修改。
在游戏《教团:1886》所使用的布料BRDF中,结合了改进的微表面BRDF、Ashikhmin和Premoze在后续报告中提到的天鹅绒NDF的一般化形式、以及方程9.63中的漫反射项。天鹅绒NDF的一般化形式如下:
D ( m ) = χ + ( n ⋅ m ) π ( 1 + k a m p α 2 ) ( 1 + k a m p exp ( ( n ⋅ m ) 2 α 2 ( ( n ⋅ m ) 2 − 1 ) ) ( 1 − ( n ⋅ m ) 2 ) 2 ) (9.73) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})}{\pi\left(1+k_{\mathrm{amp}} \alpha^{2}\right)}\left(1+\frac{k_{\mathrm{amp}} \exp \left(\frac{(\mathbf{n} \cdot \mathbf{m})^{2}}{\alpha^{2}\left((\mathbf{n} \cdot \mathbf{m})^{2}-1\right)}\right)}{\left(1-(\mathbf{n} \cdot \mathbf{m})^{2}\right)^{2}}\right) \tag{9.73} D(m)=π(1+kampα2)χ+(n⋅m) 1+(1−(n⋅m)2)2kampexp(α2((n⋅m)2−1)(n⋅m)2) (9.73)
其中, α \alpha α控制了逆高斯分布的宽度, k a m p k_{amp} kamp控制了逆高斯分布的振幅。完整形式的布料BRDF如下:
f ( l , v ) = ( 1 − F ( h , l ) ) ρ s s π + F ( h , l ) D ( h ) 4 ( n ⋅ l + n ⋅ v − ( n ⋅ l ) ( n ⋅ v ) ) (9.74) f(\mathbf{l}, \mathbf{v})=(1-F(\mathbf{h}, \mathbf{l})) \frac{\rho_{\mathrm{ss}}}{\pi}+\frac{F(\mathbf{h}, \mathbf{l}) D(\mathbf{h})}{4(\mathbf{n} \cdot \mathbf{l}+\mathbf{n} \cdot \mathbf{v}-(\mathbf{n} \cdot \mathbf{l})(\mathbf{n} \cdot \mathbf{v}))} \tag{9.74} f(l,v)=(1−F(h,l))πρss+4(n⋅l+n⋅v−(n⋅l)(n⋅v))F(h,l)D(h)(9.74)
在游戏《神秘海域4》中使用了这种BRDF的变体,用于模拟羊毛和棉花等粗糙纤维织物。
Imageworks 在光泽项中使用了一个不同的逆NDF,同时这个光泽项可以被添加到任何BRDF中,这个NDF的形式如下:
D ( m ) = χ + ( n ⋅ m ) ( 2 + 1 α ) ( 1 − ( n ⋅ m ) 2 ) 1 2 α 2 π (9.75) D(\mathbf{m})=\frac{\chi^{+}(\mathbf{n} \cdot \mathbf{m})\left(2+\frac{1}{\alpha}\right)\left(1-(\mathbf{n} \cdot \mathbf{m})^{2}\right)^{\frac{1}{2 \alpha}}}{2 \pi} \tag{9.75} D(m)=2πχ+(n⋅m)(2+α1)(1−(n⋅m)2)2α1(9.75)
尽管对于这个NDF而言,并不存在Smith masking-shadowing函数的闭式解,但是Imageworks使用了一个解析函数来逼近其数值解。Estevez和Kulla 讨论了masking-shadowing函数的细节,以及光泽项和BRDF其余部分之间的能量守恒。图9.43展示了一些使用Imageworks光泽项进行渲染的样例。
图9.43:将Imageworks光泽高光项添加到一个红色漫反射项中。从左到右的光泽粗糙度值分别为 α \alpha α= 0.15,0.25,0.40,0.65,1.0。
到目前为止,我们所看到的各种布料模型,都仅限于对特定类型的布料进行模拟,而在下一节中讨论的模型则试图以一种更加一般的方式来对布料进行建模。
微圆柱体布料模型
用于布料材质的微圆柱体模型(micro-cylinder model),与用于头发材质的微圆柱体模型非常相似。这类模型背后的思想是假设表面被很多一维线段所覆盖。Kajiya和Kay针对该假设建立了一个简单的BRDF模型,Banks也为该模型提供了坚实的理论基础,因此它也被称为Kajiya-Kay BRDF或者Banks BRDF。这个理念基于了这样的一个观察:一个由一维直线所组成的曲面,它在任何给定位置上都具有无限多的法线,这些法线是由垂直于该位置切向量 t \mathbf{t} t的法线平面(normal plane)所定义的。虽然从这个理论框架中开发出了许多新的微圆柱体模型,但是由于其简单性,因此原来的Kajiya-Kay模型仍然有一些用途。例如:在游戏《神秘海域4》中,Kajiya-Kay BRDF用于表示丝绸和天鹅绒等闪亮织物的高光项。
Dreamworks 使用了一种相对简单的、艺术家可控的微圆柱体模型来模拟布料材质,这个模型允许使用纹理用来改变粗糙度、颜色和线的方向,其中线的方向还可以指向表面以外,从而模拟天鹅绒以及其他类似的织物。这个模型还可以对经纬线(横向和竖向的线)设置不同的参数,从而模拟更加复杂的变色织物,例如闪光丝绸(shot silk);在经过归一化处理后,这个模型可以实现能量守恒。
Sadeghi等人提出了一种基于织物样品和单根纤维测量的微圆柱体模型,这个模型还考虑了线和线之间的masking和shadowing效应。
在某些情况下,头发的BSDF模型也可以用于布料模拟。RenderMan的PxrSurface材质有一个“模糊”波瓣,它使用了来自Marschner等人提出的头发模型中的 R R R项。Wu和Yuksel 在实时布料渲染系统中所实现的模型之一,就是源自迪士尼动画电影中所使用的头发模型。