PBR 五 几何遮蔽函数

法线分布函数

前言

PBR 三介绍了从渲染方程到BRDF的三项。这章是深入介绍各个几何遮蔽函数的模型。本章主要参考了毛星云的专栏几何函数相关总结,大家可以跳转过去仔细阅读。本文补充了Google Filament关于能量补偿的讲解。

参考资料

  1. Real-Time Rendering 4th Edition, Tomas et al. , CRC Press
  2. Physical Based Rendering: From Theory to Implementation
  3. 几何函数相关总结
  4. Google Filament
  5. [Heitz 2014]Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs

几何遮蔽函数

在基于物理的渲染技术中,几何函数(Geometry Function)是保证Microfacet BRDF理论上能量守恒,逻辑上自洽的重要一环。其描述了微平面自阴影的属性,表示具有半矢量法线的微平面(microfacet)中,同时被入射方向 l l l和反射方向 v v v可见(没有被遮挡的)的比例,即未被遮挡的 m = h m=h m=h微表面的百分比。

在Microfacet Specular BRDF的D,G,F三项中,如果说法线分布函数是最核心的一项,那么几何函数则是核心的辅助项,而且是三项中最复杂的一项。

历史上主流的几何函数建模,按提出或归纳的时间进行排序,可以总结为:

  1. Smith [1967]
  2. V-cavity(Cook-Torrance)[1982]
  3. Schlick-Smith [1994]
  4. Neumann [1999]
  5. Kelemen [2001]
  6. Implicit [2010]

其中,Smith遮蔽函数(Smith masking function)是现在业界所采用的主流遮蔽函数,Eric Heitz在2014年[Heitz 2014]将其拓展为Smith联合遮蔽阴影函数(Smith Joint Masking-Shadowing Function)。

几何函数的定义与要点总结

几何函数的定义与主要属性

几何函数(Geometry Function)是对能顺利完成对光线的入射和出射交互的微平面概率进行建模的函数。在microfacet BRDF中,单纯的法线分布函数得到数值不是有效的微表面的法线强度,需结合几何函数,才能得到有效入射和出射法线,得到能对microfacet BRDF产生贡献的强度。
在各种文献中,几何函数(Geometry Function)还有大量不同的别名。一些主要的常见叫法有:

  • 几何项(Geometry Term)
  • Specular G
  • 几何衰减因子(Geometric Attenuation)
  • 阴影因子(Shadowing Factor)
  • 遮蔽函数(Masking Function)
  • 阴影函数(Shadowing Function)
  • 遮蔽阴影函数(Masking-Shadowing Function)
  • 双向遮蔽阴影函数(Bidirectional Shadowing-Masking Function)

在部分游戏引擎和文献中,几何函数 G ( l , v , h ) G(l,v,h) G(l,v,h)和分母中的校正因子 4 ( n ⋅ l ) ( n ⋅ v ) 4(n\cdot l)(n\cdot v) 4(nl)(nv)(见PBR 三 中的Torrance-Sparrow Model小节)会合并为可见性项(The Visibility Term),Vis项,简称V项。其也经常作为几何函数的代指:
V ( v , l ) = G ( l , v , h ) 4 ( n ⋅ l ) ( n ⋅ v ) V(v,l)=\frac{G(l,v,h)}{4(n\cdot l)(n\cdot v)} V(v,l)=4(nl)(nv)G(l,v,h)
通常,除了近掠射角或非常粗糙的表面,几何函数对BRDF的形状影响相对较小,但对于BRDF保持能量守恒而言,几何函数至关重要。几何函数取决于微表面的细节,并且很少有精确的表达式。很多情况下,各类文献会使用各种统计模型和简化假设推导出近似值。

几何函数的两种主要形式:G1和G2

几何函数具有两种主要形式:G1和G2,其中:

  • G1为微平面在单个方向(光照方向 l l l或观察方向 v v v)上可见比例,一般代表遮蔽函数(masking function)或阴影函数(shadowing function)
  • G2为微平面在光照方向 l l l和观察方向 v v v两个方向上可见比例,一般代表联合遮蔽阴影函数(joint masking-shadowing function)

在实践中,G2由G1推导而来。默认情况下,microfacet BRDF中使用的几何函数代指G2。
在这里插入图片描述
G1为微平面在单个方向(光照方向L或观察方向V)上可见比例。G2为微平面在光照方向L和观察方向V两个方向上可见比例
图片来源:GDC 2017, PBR Diffuse Lighting for GGX+SmithMicrosurfaces, Earl Hammon

几何函数与法线分布函数的联系

几何函数与法线分布函数作为Microfacet Specular BRDF中的重要两项,两者之间具有紧密的联系:

  • 几何函数的解析形式的确认依赖于法线分布函数。 在微平面理论中,通过可见微平面的投影面积之和等于宏观表面的投影面积的恒等式,选定法线分布函数,并选定几何函数的模型,就可以唯一确认几何函数的准确形式。在选定几何函数的模型后(一般为Smith),几何函数的解析形式的确认则由对应的法线分布函数决定。
  • 法线分布函数需要结合几何函数,得到有效的法线分布强度。 单纯的法线分布函数的输出值并不是能产生有效反射的法线强度,因为光线的入射和出射会被微平面部分遮挡,即并不是所有朝向 m = h m=h m=h的微表面,能在给定光照方向 l l l和观察方向 v v v时可以顺利完成有效的反射。几何函数即是对能顺利完成入射和出射的微平面概率进行建模的函数。法线分布函数需要结合几何函数,得到最终对microfacet BRDF能产生贡献的有效法线分布强度。

业界对几何函数模型的选择

自2014年之后,游戏和电影业界主流的遮蔽函数为Smith高度相关遮蔽阴影函数(Smith height-correlated masking-shadowing function)以及其近似,因为其具有与不相关形式相似的成本和更高的精度:
G 2 ( v , l , m ) = χ + ( v ⋅ m ) χ + ( l ⋅ m ) 1 + Λ ( v ) + Λ ( l ) G_2(v,l,m)=\frac{\chi^+(v\cdot m)\chi^+(l\cdot m)}{1+\Lambda(v)+\Lambda(l)} G2(v,l,m)=1+Λ(v)+Λ(l)χ+(vm)χ+(lm)
其中, χ + ( x ) \chi^+(x) χ+(x)是符号特征函数:
χ + ( x ) = { 1 , if  x > 0 ; 0 , otherwise. \chi^+(x)= \begin{cases} 1, & \text {if } x>0; \\ 0, &\text{otherwise.} \end{cases} χ+(x)={1,0,if x>0;otherwise.
另外,如果追求性价比,可以选择部分游戏和电影制作中采用的隐式遮蔽函数(The Implicit Masking Function):
G i m p l i c i t ( l , v , m ) = ( n cot ⁡ l ) ( n ⋅ v ) G_{implicit}(l,v,m)=(n\cot l)(n\cdot v) Gimplicit(l,v,m)=(ncotl)(nv)
隐式遮蔽函数 (The Implicit Masking Function)可以和Specular的分母校正因子 4 ( n ⋅ l ) ( n ⋅ v ) 4(n\cdot l)(n\cdot v) 4(nl)(nv)相消,虽然不是严格基于物理,但具有非常好的性价比。

选择合适的微表面轮廓(microsurface profile)

为了确定唯一的G项,Heitz在[Heitz 2014]中引入了第二个约束:选择合适的微表面轮廓(microsurface profile),从而对G项进行具象化建模。
下图描述了具有相同法线分布但具有不同轮廓(profiles)的微表面导致不同的BRDF,可见:轮廓的选择可对所得BRDF的形状产生强烈影响。
在这里插入图片描述
一旦选择好合适的微表面轮廓(microsurface profile),即选择了合适的微表面模型,加下面公式(见PBR 三的G项)的约束,就可以完全确定遮蔽函数,用于BRDF中的实际使用。
∫ ∈ Θ G 1 ( m , v ) D ( m ) ( v ⋅ m ) + d m = v ⋅ n \int_{\in\Theta}G_1(m,v)D(m)(v\cdot m)^+dm=v\cdot n ΘG1(m,v)D(m)(vm)+dm=vn

Heitz在[Heitz 2014]对业界提出的表面轮廓模型进行证明,仅如下两种是基于物理的:

  • Smith遮蔽函数(Smith masking function)
  • V腔遮蔽函数(V-cavity masking function)
    两者的微表面轮廓(microsurface profile)建模可以通过下面两幅图进行表达。
    在这里插入图片描述
    Smith模型和真世界连续微表面的对比。左图:具有大自相关距离的真实世界连续微表面。右图:Smith模型,其具有不相关的表面,即每个微平面与其邻域不相关。
    图片来源:[Heitz 2014]
    在这里插入图片描述
    V腔散射模型(V-cavity scattering mode)。该模型不是对一个微表面上的散射进行建模,而是计算单独微表面上的散射并混合结果。
    图片来源:[Heitz 2014]

Heitz还证明了Smith遮蔽函数是唯一既上述公式,又具有法线遮蔽独立性(normal-masking independence)便利特性的函数。且Smith遮蔽函数具有比Cook-Torrance使用的V腔遮蔽函数(V-cavity masking function)更好地匹配真实世界的反射现象,这也是业界在两种基于物理的遮蔽函数中,更加青睐Smith遮蔽函数的原因。下图展示了使用V-cavity和Smith遮蔽阴影函数的各向同性Beckmann分布产生的BRDF,以及Reference BRDF的对比。其中,Smith遮蔽函数随着粗糙度的增加,分布向输出方向移动,更匹配Reference BRDF。
在这里插入图片描述
图片来源:[Heitz 2014]

Smith遮蔽函数

Smith遮蔽函数(Smith masking function)是现在业界所采用的主流遮蔽函数。Smith系列遮蔽函数被广泛认为比Cook-Torrance使用的V腔遮蔽函数(V-cavity masking function)函数更准确,并且考虑了法线分布的粗糙度和形状。
最初的Smith函数是为Beckmann NDF所设计,该函数最初是为高斯正态分布(Gaussian normal distributions)导出的。后经过Brown [Brown 1980]和Bourlier等人 [Bourlier 2002]将Smith函数推广到计算几何函数以匹配任何NDF的方法中。其Smith G1函数的形式如下:
G 1 ( m , v ) = χ + ( m ⋅ v ) 1 + Λ ( v ) G_1(m,v)=\frac{\chi^+(m\cdot v)}{1+\Lambda(v)} G1(m,v)=1+Λ(v)χ+(mv)
1 1 + Λ ( v ) \frac{1}{1+\Lambda(v)} 1+Λ(v)1是Smith遮蔽函数的广义形式 [Brown 1980; Walter 2007]。对于许多随机曲面,其具有闭合形式的解。因此,在法线/遮蔽独立(normal/masking independence)的假设下,Smith遮蔽函数是精确的。

Λ ( v ) \Lambda(v) Λ(v)表示微表面斜率上的积分(integral over the slopes of the microsurface),其表达式为:
Λ ( v ) = 1 c o t θ o ∫ c o t θ o ∞ ( x m ~ − c o t θ o ) P 2 − ( x m ~ ) d x m ~ \Lambda(v)=\frac{1}{{\rm cot}\theta_o}\int_{{\rm cot}\theta_o}^{\infty}(x_{\tilde{m}}-{\rm cot}\theta_o)P^{2-}(x_{\tilde{m}})dx_{\tilde{m}} Λ(v)=cotθo1cotθo(xm~cotθo)P2(xm~)dxm~
其中: P 2 − ( x m ~ ) = ∫ − ∞ + ∞ P 22 ( x m ~ , y m ~ ) d y m ~ P^{2-}(x_{\tilde{m}})=\int_{-\infty}^{+\infty}P^{22}(x_{\tilde{m}},y_{\tilde{m}})dy_{\tilde{m}} P2(xm~)=+P22(xm~,ym~)dym~
为视图方向上斜率的1D分布。

  • P 22 ( x m ~ , y m ~ ) P^{22}(x_{\tilde{m}},y_{\tilde{m}}) P22(xm~,ym~)为微表面的斜率分布(distribution of slopes of the microsurface)。
  • m ~ \tilde{m} m~为与法线 m = ( x m , y m , z m ) m=(x_m,y_m,z_m) m=(xm,ym,zm)相关的斜率:
    m ~ = ( x m ~ , y m ~ ) = ( − x m z m , − y m z m ) = − t a n θ h ( c o s ϕ h , s i n ϕ h ) \tilde{m}=(x_{\tilde{m}},y_{\tilde{m}})=(-\frac{x_m}{z_m}, -\frac{y_m}{z_m})=-{\rm tan}\theta_h({\rm cos}\phi_h, {\rm sin}\phi_h) m~=(xm~,ym~)=(zmxm,zmym)=tanθh(cosϕh,sinϕh)
  • 斜率的分布必然是标准化的:
    ∫ − ∞ + ∞ ∫ − ∞ + ∞ P 22 ( x m ~ , y m ~ ) d x m ~ d y m ~ = 1 \int_{-\infty}^{+\infty}\int_{-\infty}^{+\infty}P^{22}(x_{\tilde{m}},y_{\tilde{m}})dx_{\tilde{m}}dy_{\tilde{m}}=1 ++P22(xm~,ym~)dxm~dym~=1
  • 斜率分布与法线分布的关系为:
    D ( m ) = P 22 ( x m ~ , y m ~ ) c o s 4 θ h D(m)=\frac{P^{22}(x_{\tilde{m}},y_{\tilde{m}})}{{\rm cos}^4\theta_h} D(m)=cos4θhP22(xm~,ym~)

Smith遮蔽函数的每个法线分布函数会导出不同的 Λ \Lambda Λ(lambda)函数。需要注意,仅具有形状不变性的法线分布函数(如GGX、Beckmann)可以导出具有解析形式的 Λ \Lambda Λ函数,而且不具备形状不变性的函数(Blinn-Phong),则 Λ \Lambda Λ不存在解析形式。在[Walter 2007]和[Heitz 2014]中都有描述推导出给定NDF的 Λ \Lambda Λ的过程。

Smith遮蔽函数是常见遮蔽函数中,唯一既满足能量守恒又具有法线遮蔽独立性(Normal/Masking Independence)便利特性的函数。
法线/遮蔽独立(Normal/Masking Independence)作为Smith遮蔽函数的一大特点,源自Smith微表面轮廓假设微曲面不是自相关的(autocorrelated),即在微表面的一个点处的高度(或法线)与任何相邻点处的高度(或法线)之间没有相关性。 这意味着一组随机的微平面并不是连续的表面,微表面的高度和法线是独立的随机变量。

Smith遮蔽函数(Smith masking function)对非随机表面与重复或结构化图案(例如布料(fabric))的相关性的影响可能非常显著。因此,对于布料之类的非随机表面或结构化图案,推荐使用专用模型,如专门的布料shading model。

需要注意的是,业界选择Smith遮蔽函数的原因其实并不是因为它是由法线分布参数化的物理上可信的近似。真正原因在于Smith公式是在所选择的微表面轮廓(即法线/遮蔽独立性)的假设下的精确遮蔽函数。

Smith遮蔽函数确实也有一些缺点。从理论角度来看,其假设是与实际表面的结构不一致的,甚至可能在物理上无法实现。从实际的角度来看,虽然它对于随机表面非常准确,但是对于在法线方向和遮蔽之间具有更强依赖性的表面,例如下图中所示的表面,其预期精度会降低,特别是如果表面具有一些重复结构(如多数面料)。然而,在找到更好的替代方案之前,Smith遮蔽函数目前依然是业界的最佳选择。
在这里插入图片描述
图片来源:Real-Time Rendering 4th
上图中所示的微观几何体在高度和表面法线之间具有很强的相关性,其中凸起区域是平滑的而下部区域是粗糙的。 在图示的上半部分中,表面从接近宏观表面法线的角度照射。 在这个角度,许多入射光线可以触及粗糙的凹坑,并且许多光线在不同的方向上散射。 在图示下半部分中,表面从掠射角入射。阴影(Shadowing)阻挡了大部分凹坑,因此很少有光线触及到它们,所以大多数光线都从表面的光滑部分反射。在这种情况下,表面粗糙度的作用很大程度上取决于光照角度,这就是Smith遮蔽的函数的缺陷所在。

Smith联合遮蔽-阴影函数

除了G1之外,业界常常使用Eric Heitz在[Heitz 2014]中提出的Smith联合遮蔽阴影函数(Smith Joint Masking-Shadowing Function) G 2 ( l , v , m ) G2(l, v, m) G2(l,v,m)来代替遮蔽函数 G 1 ( m , v ) G1(m, v) G1(m,v)。该函数具有四种形式:

  1. 分离遮蔽阴影型(Separable Masking and Shadowing)
  2. 高度相关遮蔽阴影型(Height-Correlated Masking and Shadowing)
  3. 方向相关遮蔽阴影型(Direction-Correlated Masking and Shadowing)
  4. 高度-方向相关遮蔽阴影型(Height-Direction-Correlated Masking and Shadowing)
    其中,高度相关遮蔽阴影型(Height-Correlated Masking and Shadowing)以及其近似,是目前业界采用的主流遮蔽阴影函数。

分离的遮蔽阴影函数(Separable Masking and Shadowing Function)

最简单和最广泛使用的遮蔽阴影函数的变体是Walter等人推广的可分离形式[Walter 2007]。 在这种情况下,遮蔽(masking)和阴影(shadowing)是独立的,并且分别计算并相乘:
G 2 ( v , l , m ) = G 1 ( v , m ) G 1 ( l , m ) = χ + ( v ⋅ m ) 1 + Λ ( v ) χ + ( l ⋅ m ) 1 + Λ ( l ) G_2(v,l,m)=G_1(v,m)G_1(l,m)=\frac{\chi^+(v\cdot m)}{1+\Lambda(v)}\frac{\chi^+(l\cdot m)}{1+\Lambda(l)} G2(v,l,m)=G1(v,m)G1(l,m)=1+Λ(v)χ+(vm)1+Λ(l)χ+(lm)
这种形式不模拟遮蔽和阴影之间的相关性,会多估算阴影,因为一些相关性总是存在的。

高度相关的遮蔽阴影函数(Height-Correlated Masking and Shadowing Function)

模拟了由于微表面高度引起的遮蔽和阴影之间的相关性[Ross et al. 2005]。 直观来说,微平面(microfacet)在微表面(microsurface)内升高得越多,对于出射方向未被遮蔽(unmasked)和入射方向未被掩蔽(unshadowed)的可见概率会同时增加。 因此,遮蔽和阴影通过微平面的升高而相关。 这种相关性以联合遮蔽阴影函数(joint masking-shadowing function)的高度相关形式进行表达:
G 2 ( v , l , m ) = χ + ( v ⋅ m ) χ + ( l ⋅ m ) 1 + Λ ( v ) + Λ ( l ) G_2(v,l,m)=\frac{\chi^+(v\cdot m)\chi^+(l\cdot m)}{1+\Lambda(v)+\Lambda(l)} G2(v,l,m)=1+Λ(v)+Λ(l)χ+(vm)χ+(lm)
需要注意的是,当出射方向和入射方向彼此远离时,此形式是准确的,但是当方向接近时,此形式会估算出更多的阴影。Heitz建议在实践中使用此版本的遮蔽阴影函数,因为它比可分离的遮蔽阴影函数更精确,却同时具有相同的计算复杂度。

方向相关的遮蔽阴影函数(Direction-Correlated Masking and Shadowing Function)

Ashikhmin等 [Ashikhmin 2000]通过混合可分离的遮蔽阴影函数与两个方向完全相关的情形来表达方向相关:
G 2 ( v , l , m ) = λ ( ϕ ) G 1 ( v , m ) G 1 ( l , m ) + ( 1 − λ ( ϕ ) ) m i n [ G 1 ( v , m ) , G 1 ( l , m ) ] G_2(v,l,m)=\lambda(\phi)G_1(v,m)G_1(l,m)+(1-\lambda(\phi))min[G_1(v,m),G_1(l,m)] G2(v,l,m)=λ(ϕ)G1(v,m)G1(l,m)+(1λ(ϕ))min[G1(v,m),G1(l,m)]

其中 λ ( ϕ ) \lambda(\phi) λ(ϕ)是类似于Ginneken等人的经验因子。
作者没有找到函数Λ的Smith解析表达式,所以必须分别计算遮蔽和阴影。 这就是为什么他们必须混合可分离的形式和方向相关的形式,并且无法将高度相关性结合到他们的模型中。

高度方向相关的遮蔽阴影函数(Height-Direction-Correlated Masking and Shadowing Function)

遮蔽和阴影之间的方向相关可以通过将方向相关因子λ纳入高度相关形式来进行建模:
G 2 ( v , l , m ) = χ + ( v ⋅ m ) χ + ( l ⋅ m ) 1 + m a x [ Λ ( v ) , Λ ( l ) ] + λ ( v , l ) m i n [ Λ ( v ) , Λ ( l ) ] G_2(v,l,m)=\frac{\chi^+(v\cdot m)\chi^+(l\cdot m)}{1+max[\Lambda(v),\Lambda(l)]+\lambda(v,l)min[\Lambda(v),\Lambda(l)]} G2(v,l,m)=1+max[Λ(v),Λ(l)]+λ(v,l)min[Λ(v),Λ(l)]χ+(vm)χ+(lm)
这里,当出射和入射方向平行且 λ = 0 \lambda=0 λ=0时,遮蔽和阴影完全相关。相关性随着方向之间的角度增加而减小,并且随着 λ \lambda λ增加到1,遮蔽和阴影不再是方向相关,公式会返回高度相关的形式。

Ginneken等人[Ginneken 1998]提出了一个经验因子 λ = 4.41 ϕ 4.41 ϕ + 1 \lambda=\frac{4.41\phi}{4.41\phi+1} λ=4.41ϕ+14.41ϕ,此因子取决于 ϕ \phi ϕ,即 v v v l l l之间的方位角,此因子与表面粗糙度无关。

Heitz等人在2014年[Heitz 2014]对这个问题进行了更深入的研究,并对 λ ( v , l ) \lambda(v,l) λ(v,l)进行了解析近似,当 D D D是Beckmann分布时,其结合了表面粗糙度。他们仅给出了各向同性Beckmann分布的结果。

多重散射微平面BRDF

通过包含G2函数,Microfacet BRDF能够考虑遮蔽(masking)和阴影(shadowing),但依然没有考虑微平面之间的互反射(interreflection),或多表面反射(multiple surface bounce)。 而缺少微平面互反射(interreflection)是业界主流Microfacet BRDF的共有的限制。

标准Microfacet BRDF模型的最大问题,是虽然它们能量守恒(即不会产生任何能量),但它们也不能在高粗糙度时维持能量。 这是由于建模微平面模型时所做出的单散射假设,没有模拟微表面上的多次散射,即缺少微平面互反射(interreflection)。单散射的在高粗糙度时会有较大的能量损失,从而显得过暗。尤其对于高粗糙度的金属而言,如下图所示。
在这里插入图片描述
单次散射,反射随着粗糙度增加而变暗
图片来源:Figure 13 in https://google.github.io/filament/Filament.html在这里插入图片描述
多散射则是能量守恒的
图片来源:Figure 14 in https://google.github.io/filament/Filament.html
在这里插入图片描述
GGX + height-correlated masking & shadowing,在粗糙度1时会损失接近一半的入射能量
图片来源:[Kulla 2017]

对此Heitz在[Heitz 2016]中深入讨论了多重散射微平面BRDF(Multiple-scattering microfacet BRDF),但该文章仅介绍了多尺度BRDF的随机计算,并不适用于实时渲染。

随后,Sony ImageWork的Kulla和Conty[Kulla 2017]在SIGGRPAPH 2017上中提出了一项新的技术方案,创建一个模拟多次反射表面反射的附加BRDF波瓣,作为能量补偿项(Energy Compensation Term):
f m s ( l , v ) = ( 1 − E ( l ) ) ( 1 − E ( v ) ) F a v g 2 E a v g π ( 1 − E a v g ) [ 1 − F a v g ( 1 − E a v g ) ] f_{ms}(l,v)=\frac{(1-E(l))(1-E(v))F^2_{avg}E_{avg}}{\pi(1-E_{avg})[1-F_{avg}(1-E_{avg})]} fms(l,v)=π(1Eavg)[1Favg(1Eavg)](1E(l))(1E(v))Favg2Eavg
其中, E E E是,在 F 0 = 1 F_0=1 F0=1时,BRDF反射项 f r f_r fr中的directional albedo:
E ( l ) = ∫ Ω f ( l , v ) ( n ⋅ v ) d v E(l)=\int_\Omega f(l,v)(n\cdot v)dv E(l)=Ωf(l,v)(nv)dv
E a v g E_{avg} Eavg是对E的余弦平均(cosine-weighted):
E a v g = 2 ∫ 0 1 E ( μ ) μ d μ E_{avg}=2\int^1_0E(\mu)\mu d\mu Eavg=201E(μ)μdμ
E E E E a v g E_{avg} Eavg一般预先计算并存储在表格中(lookup tables)。
同样的, F a v g F_{avg} Favg是对菲涅尔项的余弦平均:
F a v g = 2 ∫ 0 1 F ( μ ) μ d μ F_{avg}=2\int^1_0F(\mu)\mu d\mu Favg=201F(μ)μdμ
F a v g F_{avg} Favg如果使用原始Schlick近似,则可以表示为
F a v g = 20 21 F 0 + 1 21 F_{avg}=\frac{20}{21}F_0+\frac{1}{21} Favg=2120F0+211
这样,BRDF的反射重新计算为: f r ( l , v ) = f s s ( l , v ) + f m s ( l , v ) f_r(l,v)=f_{ss}(l,v)+f_{ms}(l,v) fr(l,v)=fss(l,v)+fms(l,v);其中 f s s f_{ss} fss为单次散射。

在[Lagarde18]中,Lagarde and Golubev根据观察给出 F a v g F_{avg} Favg项还可以简化为 F 0 F_0 F0。提出可以通过加入一个尺度可变的GGX反射尾巴来给予能量补偿,如下式:
f m s ( l , v ) = F 0 1 − E ( l ) E ( l ) f s s ( l , v ) f_{ms}(l,v)=F_0\frac{1-E(l)}{E(l)}f_{ss}(l,v) fms(l,v)=F0E(l)1E(l)fss(l,v)
这样,能量守恒的BRDF公式为:
f r ( l , v ) = f s s ( l , v ) + F 0 ( 1 r − 1 ) f s s ( l , v ) f_r(l,v)=f_{ss}(l,v)+F_0(\frac{1}{r}-1)f_{ss}(l,v) fr(l,v)=fss(l,v)+F0(r11)fss(l,v)
其中, r = ∫ Ω D ( l , v ) V ( l , v ) ( n ⋅ l ) d l r=\int_\Omega D(l,v)V(l,v)(n\cdot l)dl r=ΩD(l,v)V(l,v)(nl)dl。这样做的优势在于 E ( l ) E(l) E(l)不但可以预先计算,还可以加入到基于图像的光照(imaged-based lighting)中。在实际中,我们会将 r r r保存到DFG表格(DFG lookup table)中。DFG请见[PBR 七 IBL]。

Google Filament代码:

vec3 energyCompensation = 1.0 + f0 * (1.0 / dfg.y - 1.0);
// Scale the specular lobe to account for multiscattering
Fr *= pixel.energyCompensation;

几何函数的基本性质

几何函数的基本性质可以总结为如下四条:

  1. 标量性
  2. 对称性
  3. 同向可见性
  4. 拉伸不变性(Stretch Invariance)

标量性

几何函数是0和1之间的一个标量: 0 ≤ G ( l , v , m ) ≤ 1 0\leq G(l,v,m)\leq 1 0G(l,v,m)1
低粗糙度下几何函数大多情况下数值接近1,如下图所示。
在这里插入图片描述
GGX对应的遮蔽阴影函数,增加表面粗糙度(更高的值)会使函数更快地降至零。
图片来源:Physically Based Rendering 3rd
在这里插入图片描述
GGX-Smith几何项,从左到右的粗糙度为 0.0, 0.2, 0.5, 0.8, 1.0

对称性

几何函数在两个可见方向(出射和入射)上是对称的: G ( l , v , m ) = G ( v , l , m ) G(l,v,m)=G(v,l,m) G(l,v,m)=G(v,l,m)

同向可见性

几何函数从宏观表面正面方向上无法看到微表面的背面,反之亦然:
G ( l , v , m ) = 0    i f   ( l ⋅ m ) ( l ⋅ n ) ≤ 0   o r   ( v ⋅ m ) ( v ⋅ n ) ≤ 0 G(l,v,m)=0 \ \ {\rm if}\ (l\cdot m)(l\cdot n)\leq0 \ {\rm or}\ (v\cdot m)(v\cdot n)\leq0 G(l,v,m)=0  if (lm)(ln)0 or (vm)(vn)0

拉伸不变性(Stretch Invariance)

PBR 四 法线分布函数中介绍了法线分布函数的形状不变性,这里更进一步的介绍这个性质,以及具有这个性质的NDF相应的Smith遮蔽函数的解析解。

微表面几何轮廓具有拉伸不变性(Stretch Invariance)。拉伸微表面轮廓就像拉伸一张图片,即在一个维度上乘以常数因子,不会更改微表面轮廓的拓扑结构:拉伸后,遮挡的光线仍会被遮挡,未遮挡的光线仍未被遮挡。这是因为微表面的斜率和出射方向(视线)相关的斜率都是通过该拉伸因子的倒数来缩放的。从而,斜率宽度的分布也被反向拉伸因子拉伸。如下图中,下面显示拉伸为2时,表面斜率和出射方向的拉伸。
在这里插入图片描述
图片来源:[Heitz 2014]Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs

从法线分布函数导出的Smith遮蔽函数

由上文可知,Smith G1函数的形式如下:
G 1 ( m , v ) = χ + ( m ⋅ v ) 1 + Λ ( v ) G_1(m,v)=\frac{\chi^+(m\cdot v)}{1+\Lambda(v)} G1(m,v)=1+Λ(v)χ+(mv)
对于形状不变的法线分布函数,通过 ∫ ∈ Θ G 1 ( m , v ) D ( m ) ( v ⋅ m ) + d m = v ⋅ n \int_{\in\Theta}G_1(m,v)D(m)(v\cdot m)^+dm=v\cdot n ΘG1(m,v)D(m)(vm)+dm=vn约束可以得到其遮蔽函数的解析形式。

Beckmann法线分布的 Λ \Lambda Λ函数

Beckmann法线分布函数具备形状不变性,其Smith遮蔽函数对应的 Λ \Lambda Λ解析形式为:
Λ ( v ) = e r f ( a ) − 1 2 + 1 2 a π e x p ( − a 2 ) \Lambda(v)=\frac{erf(a)-1}{2}+\frac{1}{2a\sqrt{\pi}}{\rm exp}(-a^2) Λ(v)=2erf(a)1+2aπ 1exp(a2)

其中, a = 1 α t a n θ o a=\frac{1}{\alpha{\rm tan}\theta_o} a=αtanθo1
上式的计算成本很高,因为它包括误差函数erf,于是Walter 等人[Walter et al. 2007] 为其提出了精确的有理逼近,可以用于近似的公式 :
Λ ( v ) = { 1 − 1.259 a + 0.396 a 2 3.535 a + 2.18 a 2 , if  a < 1.6 ; 0 , otherwise. \Lambda(v)= \begin{cases} \frac{1-1.259a+0.396a^2}{3.535a+2.18a^2}, & \text {if } a<1.6; \\ 0, &\text{otherwise.} \end{cases} Λ(v)={3.535a+2.18a211.259a+0.396a2,0,if a<1.6;otherwise.

Blinn-Phong法线分布的 Λ \Lambda Λ函数

Blinn-Phong NDF不具备形状不变的(shape-invariant),所以其 Λ \Lambda Λ函数不存在解析形式。Walter等人建议使用Beckmann的 Λ \Lambda Λ函数结合参数 α p = 2 α − 2 − 2 \alpha_p=2\alpha^{-2}-2 αp=2α22进行等价。

GGX法线分布的 Λ \Lambda Λ函数

GGX法线分布函数具备形状不变性,其Smith遮蔽函数对应的 Λ \Lambda Λ解析形式相对简单,为:
Λ ( v ) = − 1 + 1 + a − 2 2 \Lambda(v)=\frac{-1+\sqrt{1+a^{-2}}}{2} Λ(v)=21+1+a2
其中, a = 1 α t a n θ o a=\frac{1}{\alpha{\rm tan}\theta_o} a=αtanθo1

GGX分布和GGX –Smith遮蔽阴影函数的组合,是目前游戏和电影业界主流的方案。且业界一直致力于优化两者的组合。

Smith遮蔽函数的各项异性

从上一博文PBR 四 法线分布函数中,通过拉伸表面(stretching the surface)将各向同性的形状不变分布转换为各向异性分布,反之亦然。假设形不变的各向异性有参数 α x \alpha_x αx α y \alpha_y αy,视线 v = ( x o , y o , z o ) v=(x_o,y_o,z_o) v=(xo,yo,zo),通过 x x x轴拉伸 α x α y \frac{\alpha_x}{\alpha_y} αyαx,转换成各向同性分布。这时,表面的粗糙度变成:
α x ′ = α x α y α x = α y α y ′ = α y \begin{aligned}\alpha^\prime_x&=\alpha_x\frac{\alpha_y}{\alpha_x}=\alpha_y\\ \alpha^\prime_y&=\alpha_y\end{aligned} αxαy=αxαxαy=αy=αy
也就是说 α = α y 。 \alpha=\alpha_y。 α=αy相应的视线 v ′ v^\prime v和它的斜率为:
v ′ = ( α x α y x o , y o , z o ) = ( α x α y c o s ϕ o s i n θ o , s i n ϕ o s i n θ o , c o s θ o ) 1 t a n θ o ′ = z o α x 2 α y 2 x o 2 + y o 2 = 1 α x 2 α y 2 c o s 2 ϕ o + s i n 2 ϕ o ⋅ t a n θ o \begin{aligned}v^\prime&=(\frac{\alpha_x}{\alpha_y}x_o,y_o,z_o)=(\frac{\alpha_x}{\alpha_y}{\rm cos}\phi_o{\rm sin}\theta_o,{\rm sin}\phi_o{\rm sin}\theta_o,{\rm cos}\theta_o)\\ \frac{1}{{\rm tan}\theta^\prime_o}&=\frac{z_o}{\sqrt{\frac{\alpha^2_x}{\alpha^2_y}x^2_o+y^2_o}}=\frac{1}{\sqrt{\frac{\alpha^2_x}{\alpha^2_y}{\rm cos}^2\phi_o+{\rm sin}^2\phi_o}\cdot {\rm tan}\theta_o}\end{aligned} vtanθo1=(αyαxxo,yo,zo)=(αyαxcosϕosinθo,sinϕosinθo,cosθo)=αy2αx2xo2+yo2 zo=αy2αx2cos2ϕo+sin2ϕo tanθo1
有上述可知,各向同性的遮蔽函数只与参数 a = 1 α t a n θ o a=\frac{1}{\alpha{\rm tan}\theta_o} a=αtanθo1相关,则有:
a ′ = 1 α y t a n θ o ′ = 1 α y α x 2 α y 2 c o s 2 ϕ o + s i n 2 ϕ o ⋅ t a n θ o = 1 c o s 2 ϕ o α x 2 + s i n 2 ϕ o α y 2 ⋅ t a n θ o = 1 α o t a n θ o \begin{aligned}a^\prime=\frac{1}{\alpha_y {\rm tan}\theta^\prime_o}&=\frac{1}{\alpha_y\sqrt{\frac{\alpha^2_x}{\alpha^2_y}{\rm cos}^2\phi_o+{\rm sin}^2\phi_o}\cdot {\rm tan}\theta_o}\\ &=\frac{1}{\sqrt{{\rm cos}^2\phi_o\alpha^2_x+{\rm sin}^2\phi_o\alpha^2_y}\cdot {\rm tan}\theta_o}\\ &=\frac{1}{\alpha_o {\rm tan}\theta_o}\end{aligned} a=αytanθo1=αyαy2αx2cos2ϕo+sin2ϕo tanθo1=cos2ϕoαx2+sin2ϕoαy2 tanθo1=αotanθo1
其中, α o = c o s 2 ϕ o α x 2 + s i n 2 ϕ o α y 2 \alpha_o=\sqrt{{\rm cos}^2\phi_o\alpha^2_x+{\rm sin}^2\phi_o\alpha^2_y} αo=cos2ϕoαx2+sin2ϕoαy2
这样,上面遮蔽函数的各向异性公式参数 a = 1 α o t a n θ o a=\frac{1}{\alpha_o {\rm tan}\theta_o} a=αotanθo1,其中 α o \alpha_o αo为上式所得的 c o s 2 ϕ o α x 2 + s i n 2 ϕ o α y 2 \sqrt{{\rm cos}^2\phi_o\alpha^2_x+{\rm sin}^2\phi_o\alpha^2_y} cos2ϕoαx2+sin2ϕoαy2

Smith GGX的演变和发展

游戏和电影工业对GGX-Smith遮蔽函数的选用方面,可以总结为两个主要阶段:

  • SIGGRAPH 2014之前,Smith分离的遮蔽阴影函数
  • SIGGRAPH 2014之后,Smith相关的遮蔽阴影函数
    而这两个阶段的演变,主要在于2014年Eric Heitz于JCGT 2014上发表了著名的paper 《Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs》,以及其后续在SIGGPRAPH 2014上进行的同名的talk。
SIGGRAPH 2012:Disney

Disney参考了 [Walter 2007]的近似方法,使用Smith GGX导出的G项,并将粗糙度参数进行重映射以减少光泽表面的极端增益,即将 α \alpha α [ 0 , 1 ] [0,1] [0,1]重映射到 [ 0.5 , 1 ] [0.5, 1] [0.5,1] α \alpha α的值为 ( 0.5 + r o u g h n e s s / 2 ) 2 (0.5 + roughness/2)^2 (0.5+roughness/2)2。从而使几何项的粗糙度变化更加平滑,更便于美术人员的使用。

以下为Disney 实现的Smith GGX的几何项的表达式:
α = ( 0.5 + r o u g h n e s s / 2 ) 2 G 1 ( v ) = 2 ( n ⋅ v ) ( n ⋅ v ) + α 2 + ( 1 − α 2 ) ( n ⋅ v ) 2 G ( l , v , h ) = G 1 ( l ) G 1 ( v ) \begin{aligned}\alpha&=(0.5+roughness/2)^2\\ G_1(v)&=\frac{2(n\cdot v)}{(n\cdot v)+\sqrt{\alpha^2+(1-\alpha^2)(n\cdot v)^2}}\\ G(l,v,h)&=G_1(l)G_1(v)\end{aligned} αG1(v)G(l,v,h)=(0.5+roughness/2)2=(nv)+α2+(1α2)(nv)2 2(nv)=G1(l)G1(v)

SIGGRAPH 2013:UE4

其中UE4在SIGGRAPH 2013上公布的方案为基于Schlick近似,将 k k k映射为 k = a / 2 k=a/2 k=a/2,去匹配GGX Smith方程,并采用了Disney对粗糙度的重映射:
α = ( 0.5 + r o u g h n e s s / 2 ) 2 k = α / 2 G 1 ( v ) = ( n ⋅ v ) ( n ⋅ v ) ( 1 − k ) + k G ( l , v , h ) = G 1 ( l ) G 1 ( v ) \begin{aligned}\alpha&=(0.5+roughness/2)^2\\ k&=\alpha/2\\ G_1(v)&=\frac{(n\cdot v)}{(n\cdot v)(1-k)+k}\\ G(l,v,h)&=G_1(l)G_1(v)\end{aligned} αkG1(v)G(l,v,h)=(0.5+roughness/2)2=α/2=(nv)(1k)+k(nv)=G1(l)G1(v)

SIGGRAPH 2014至今:业界转向Smith Joint Masking-Shadowing Function

在2014年,Heitz在JCGT 2014发表了著名的paper 《Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs》,以及后续在SIGGPRAPH 2014上进行了同名的talk,将游戏和电影业界对遮蔽阴影函数(The Smith Joint Masking-Shadowing Function)的理解上升到了一个新的层次。
UE4 ,Frostbite 和Unity等引擎都受到Heitz的启发,为了得到更精确的几何遮挡关系,开始考虑入射阴影和出射遮蔽之间的相关性,并在后续更新中各自转向了Smith联合遮蔽阴影函数(The Smith Joint Masking-Shadowing Function)的高度相关遮蔽阴影形式(Height-Correlated Masking and Shadowing),并相应地都做了一些近似与优化。

Frostbite的GGX-Smith Joint近似方案

Frostbite的Lagarde[Lagarde 2014 ]观察到对GGX高度相关的Smith G2(height-correlated Smith G2)具有与镜面微平面BRDF的分母组合时抵消的项, 因此可以简化组合项为:
G 2 ( l , v ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ ⇒ 0.5 μ o α 2 + μ i ( μ i − α 2 μ i ) + μ i α 2 + μ o ( μ o − α 2 μ o ) \frac{G_2(l,v)}{4|n\cdot l||n\cdot v|}\Rightarrow\frac{0.5}{\mu_o\sqrt{\alpha^2+\mu_i(\mu_i-\alpha^2\mu_i)}+\mu_i\sqrt{\alpha^2+\mu_o(\mu_o-\alpha^2\mu_o)}} 4nlnvG2(l,v)μoα2+μi(μiα2μi) +μiα2+μo(μoα2μo) 0.5
其中, μ i = ( n ⋅ l ) + , μ o = ( n ⋅ v ) + \mu_i=(n\cdot l)^+, \mu_o=(n\cdot v)^+ μi=(nl)+,μo=(nv)+

下面用 V ( l , v , h ) V(l,v,h) V(l,v,h)来代替 G 2 ( l , v ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ \frac{G_2(l,v)}{4|n\cdot l||n\cdot v|} 4nlnvG2(l,v)

UE4的GGX-Smith Correlated Joint 近似方案

UE4采用的 GGX-Smith Correlated Joint Approximate为:
α = r o u g h n e s s 2 Λ ( v ) = ( n ⋅ l ) [ ( n ⋅ v ) ( 1 − α ) + α ] Λ ( l ) = ( n ⋅ v ) [ ( n ⋅ l ) ( 1 − α ) + α ] V ( l , v , h ) = 0.5 Λ ( v ) + Λ ( l ) \begin{aligned}\alpha&=roughness^2\\ \Lambda(v)&=(n\cdot l)[(n\cdot v)(1-\alpha)+\alpha]\\ \Lambda(l)&=(n\cdot v)[(n\cdot l)(1-\alpha)+\alpha]\\ V(l,v,h)&=\frac{0.5}{\Lambda(v)+\Lambda(l)}\end{aligned} αΛ(v)Λ(l)V(l,v,h)=roughness2=(nl)[(nv)(1α)+α]=(nv)[(nl)(1α)+α]=Λ(v)+Λ(l)0.5

// Appoximation of joint Smith term for GGX
// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"]
float Vis_SmithJointApprox( float a2, float NoV, float NoL )
{
    float a = sqrt(a2);// a2 = Pow4( Roughness )
    float Vis_SmithV = NoL * ( NoV * ( 1 - a ) + a );
    float Vis_SmithL = NoV * ( NoL * ( 1 - a ) + a );
    return 0.5 * rcp( Vis_SmithV + Vis_SmithL );
}
Unity HDRP 的GGX-Smith Correlated Joint近似方案

Unity HDRP采用的GGX-Smith Correlated Joint Approximate为:
α = r o u g h n e s s Λ ( v ) = ( n ⋅ l ) [ ( n ⋅ v ) ( 1 − α ) + α ] Λ ( l ) = ( n ⋅ v ) [ − ( n ⋅ l ) α 2 + ( n ⋅ l ) ] ( n ⋅ l ) + α 2 V ( l , v , h ) = 0.5 Λ ( v ) + Λ ( l ) \begin{aligned}\alpha&=roughness\\ \Lambda(v)&=(n\cdot l)[(n\cdot v)(1-\alpha)+\alpha]\\ \Lambda(l)&=(n\cdot v)\sqrt{[-(n\cdot l)\alpha^2+(n\cdot l)](n\cdot l)+\alpha^2}\\ V(l,v,h)&=\frac{0.5}{\Lambda(v)+\Lambda(l)}\end{aligned} αΛ(v)Λ(l)V(l,v,h)=roughness=(nl)[(nv)(1α)+α]=(nv)[(nl)α2+(nl)](nl)+α2 =Λ(v)+Λ(l)0.5

// Note: V = G / (4 * NdotL * NdotV)
// [Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs"]
float V_SmithJointGGX(float NdotL, float NdotV, float roughness, float partLambdaV)
{
    float a2 = Sq(roughness);
    // Original formulation:
    // lambda_v = (-1 + sqrt(a2 * (1 - NdotL2) / NdotL2 + 1)) * 0.5
    // lambda_l = (-1 + sqrt(a2 * (1 - NdotV2) / NdotV2 + 1)) * 0.5
    // G        = 1 / (1 + lambda_v + lambda_l);

    // Reorder code to be more optimal:
    float lambdaV = NdotL * partLambdaV;
    float lambdaL = NdotV * sqrt((-NdotL * a2 + NdotL) * NdotL + a2);

    // Simplify visibility term: (2.0 * NdotL * NdotV) /  ((4.0 * NdotL * NdotV) * (lambda_v + lambda_l))
    return 0.5 / (lambdaV + lambdaL);
}

float V_SmithJointGGX(float NdotL, float NdotV, float roughness)
{
    float partLambdaV = GetSmithJointGGXPartLambdaV(NdotV, roughness);
    return V_SmithJointGGX(NdotL, NdotV, roughness, partLambdaV);
}

float GetSmithJointGGXPartLambdaVApprox(float NdotV, float roughness)
{
    float a = roughness;
    return NdotV * (1 - a) + a;
}
Google Filament渲染器 的GGX-Smith Joint近似方案

Google Filament渲染器采用的 GGX-Smith Correlated Joint Approximate为:
α = r o u g h n e s s Λ ( l ) = ( n ⋅ v ) ( n ⋅ l ) 2 ( 1 − α 2 ) + α 2 Λ ( v ) = ( n ⋅ l ) ( n ⋅ v ) 2 ( 1 − α 2 ) + α 2 V ( l , v , h ) = 0.5 Λ ( v ) + Λ ( l ) \begin{aligned}\alpha&=roughness\\ \Lambda(l)&=(n\cdot v)\sqrt{(n\cdot l)^2(1-\alpha^2)+\alpha^2}\\ \Lambda(v)&=(n\cdot l)\sqrt{(n\cdot v)^2(1-\alpha^2)+\alpha^2}\\ V(l,v,h)&=\frac{0.5}{\Lambda(v)+\Lambda(l)}\end{aligned} αΛ(l)Λ(v)V(l,v,h)=roughness=(nv)(nl)2(1α2)+α2 =(nl)(nv)2(1α2)+α2 =Λ(v)+Λ(l)0.5

float V_SmithGGXCorrelated(float NoV, float NoL, float a)
{
    float a2 = a * a;
    float GGXL = NoV * sqrt((-NoL * a2 + NoL) * NoL + a2);
    float GGXV = NoL * sqrt((-NoV * a2 + NoV) * NoV + a2);
    return 0.5 / (GGXV + GGXL);
}

上式也常用下式来近似:
Λ ( l ) = ( n ⋅ v ) [ ( n ⋅ l ) ( 1 − α ) + α ] Λ ( v ) = ( n ⋅ l ) [ ( n ⋅ v ) ( 1 − α ) + α ] \begin{aligned} \Lambda(l)&=(n\cdot v)[(n\cdot l)(1-\alpha)+\alpha]\\ \Lambda(v)&=(n\cdot l)[(n\cdot v)(1-\alpha)+\alpha]\end{aligned} Λ(l)Λ(v)=(nv)[(nl)(1α)+α]=(nl)[(nv)(1α)+α]

float V_SmithGGXCorrelatedFast(float NoV, float NoL, float roughness) {
    float a = roughness;
    float GGXV = NoL * (NoV * (1.0 - a) + a);
    float GGXL = NoV * (NoL * (1.0 - a) + a);
    return 0.5 / (GGXV + GGXL);
}
Respawn Entertainment的 GGX-Smith Joint近似方案

Hammon[Hammon 2017]在GDC 2017上提出,UE4在2013年提出的近似G1可以导出由高度相关的Vis项的高效近似:
G 2 ( l , v ) 4 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ ≈ 0.5 l e r p ( 2 ∣ n ⋅ l ∣ ∣ n ⋅ v ∣ , ∣ n ⋅ l ∣ + ∣ n ⋅ v ∣ , α ) \frac{G_2(l,v)}{4|n\cdot l||n\cdot v|}\approx\frac{0.5}{{\rm lerp}(2|n\cdot l||n\cdot v|,|n\cdot l|+|n\cdot v|,\alpha)} 4nlnvG2(l,v)lerp(2nlnv,nl+nv,α)0.5

其中, l e r p \rm lerp lerp表示线性插值算子, l e r p ( x , y , s ) = x ∗ ( 1 − s ) + y ∗ s lerp(x, y, s) = x * (1 − s) + y * s lerp(x,y,s)=x(1s)+ys

BRDF标准化测试:白炉测试与弱白炉测试

Eric Heitz在[Heitz 2014]中提出了白炉测试与弱白炉测试,作为BSDF和BRDF是否能量守恒的标准化测试方法。
在这里插入图片描述
GGX Furnace Test。可以看到在高粗糙度有能量损失。
在这里插入图片描述
GGX + Energy Compensation Furnace Test。可以看到基本可以保持能量守恒

白炉测试(The White Furnace Test)

白炉测试(The White Furnace Test)的思路为验证入射总能量为1的光线的反射光线分布是否归一化的测试。如果能量守恒时,一个纯反射金属表面(菲涅尔反射项 F 0 = 1 F_0=1 F0=1)应该不能从背景中辨认出来。
可以将白炉测试理解为一束辉度(irrandiance)为1的光线从上往下照到菲涅尔反射项 F 0 = 1 F_0=1 F0=1的材质表面,并测定反射光线总能量是否为1的过程。若反射光线总能量为1,则通过白炉测试,否则,便不通过白炉测试。
在这里插入图片描述
在白炉测试中,菲涅尔反射项始终为1,光线永远不会透射,即所有的入射光线都会被全部反射,投射的光线将被散射一次或多次并最终离开表面。
白炉测试(The White Furnace Test)方程由下式给出:
∫ Ω l ρ ( v , l ) ∣ n ⋅ l ∣ d l = 1 \int_{\Omega_l}\rho(v,l)|n\cdot l|dl=1 Ωlρ(v,l)nldl=1
其中, ρ \rho ρ即为待测试的BRDF。

白炉测试的一版代码实现可见:https://github.com/knarkowicz/FurnaceTest

图 不同microfacet材质的白炉试验。

弱白炉测试(The Weak White Furnace Test)

因为在2014年白炉测试被提出时,主流的BRDF模拟微表面上的单次反射,并不能多次散射,具有能量损失。所以业界主流的BRDF模型即使在“完美的反射表面(perfect reflector)”微表面上进行参数化时也不会积分到1,并且不满足白炉测试方程。对此,Eric Heitz在[Heitz 2014]中设计了另一个限制性较小的,用于测试常见的基于microfacet的BRDF是否标准化的测试:弱白炉测试(The Weak White Furnace Test)。
弱白炉测试(The Weak White Furnace Test)的主要思路为验证在第一次反弹之后和离开表面之前反射的光线分布是否归一化。对几何项而言,即没有入射的阴影(shadowing)项,只有出射的遮蔽(masking)项。可以通过用遮蔽(masking)函数替换遮蔽阴影(masking-shadowing)函数,即 G 2 ( l , v , h ) = G 1 ( v , h ) G_2(l,v,h) = G_1(v,h) G2(l,v,h)=G1(v,h)来实现。
弱白炉测试方程(Weak White Furnace Test)由下式给出:
∫ Ω l G 1 ( v , h ) D ( h ) 4 ∣ n ⋅ v ∣ d l = 1 \int_{\Omega_l}\frac{G_1(v,h)D(h)}{4|n\cdot v|}dl=1 Ωl4nvG1(v,h)D(h)dl=1
弱白炉测试对于漫反射微平面BRDF也同样适用,具体方案可见[Heitz 2014]。[Heitz 2014]的附录中也有实现弱白炉测试的Matlab代码。
对微平面Specular BRDF的弱白炉测试的具体过程如下:
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值