博客 / Blog
PBR 系列#5

【PBR系列-5】 几何函数(Geometry Function)相关总结

·渲染, PBR, 几何函数, Smith

参考:【基于物理的渲染(PBR)白皮书】(五)几何函数相关总结

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

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

几何函数定义与要点总结

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

在基于物理的渲染中,几何函数(Geometry Function)是一个 0到1 之间的标量,描述了微平面自阴影的属性,表示了具有半矢量法线的微平面(microfacet)中,同时被入射方向和反射方向可见(没有被遮挡的)的 比例,即未被遮挡的m= h微表面的百分比

在microfacet BRDF中,单纯的 法线分布函数 得到数值不是有效的微表面的 法线强度,需 结合几何函数,才能得到有效入射和出射法线,得到能对microfacet BRDF产生贡献的强度。

有一堆别名:

  • 几何项(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)和分母中的校正因子4(nl)(nv)4(n·l)(n·v)会合并为可见性项(The Visibility Term),Vis项,简称V项。其也经常作为几何函数的代指:

  • 通常, 除了近掠射角或非常粗糙的表面,几何函数对BRDF的形状影响相对较小,但对于 BRDF保持能量守恒而言,几何函数至关重要。
  • 几何函数取决于微表面的细节,并且很少有精确的表达式。很多情况下,各类文献会使用各种统计模型和简化假设推导出近似值。

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

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

  • G1为微平面在单个方向( 光照方向L或观察方向V )上可见比例,一般代表 遮蔽函数 (masking function)或 阴影函数 (shadowing function)
  • G2为微平面在光照方向L和观察方向V 两个方向 上可见比例,一般代表 联合遮蔽阴影函数 (joint masking-shadowing function)
  • 在实践中,G2由G1推导而来
  • 默认情况下, microfacet BRDF 中使用的几何函数代指 G2

图 几何函数的两种主要形式:G1和G2。G1为微平面在单个方向(光照方向L或观察方向V)上可见比例。G2为微平面在光照方向L和观察方向V两个方向上可见比例图 几何函数的两种主要形式:G1和G2。G1为微平面在单个方向(光照方向L或观察方向V)上可见比例。G2为微平面在光照方向L和观察方向V两个方向上可见比例

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

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

  • 几何函数的解析形式的确认依赖于法线分布函数。

在微平面理论中,可见的微平面投影面积之和等于宏观表面积之和(详细看一下法线分布项的内容)。

在选定法线分布函数和几何函数之后,就可以得到一个唯一的表达式。几何函数的解析形式需要由对应的法线分布函数决定。

  • 法线分布函数需要结合几何函数,得到有效的法线分布强度。

单纯的法线分布函数的输出值并不是能产生有效反射的法线强度,因为光线的入射和出射会被微平面部分遮挡,即并不是所有朝向m=h的微表面,能在给定光照方向L和观察方向V时可以顺利完成有效的反射。 几何函数即是对能顺利完成入射和出射的微平面概率进行建模的函数。 法线分布函数需要结合几何函数,得到最终对microfacet BRDF能产生贡献的 有效法线分布强度

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

自2014年之后,游戏和电影业界主流的遮蔽函数为 Smith高度相关遮蔽阴影函数(Smith height-correlated masking-shadowing function) 以及其近似,因为其具有与不相关形式相似的成本和更高的精度:

另外,如果追求性价比,可以选择部分游戏和电影制作中采用的 隐式遮蔽函数(The Implicit Masking Function)

隐式遮蔽函数 ( The Implicit Masking Function )可以和Specular的分母校正因子4(nl)(nv)4(n·l)(n·v)相消为1,虽然不是严格基于物理,但具有非常好的性价比。

从微平面理论到遮蔽阴影函数

从微平面理论引出几何函数

微平面理论(microfacet theory)作为一种研究微观几何(microgeometry)对反射率影响的数学分析方法,基于将微观几何(microgeometry)建模为微平面(microfacets)的集合的思想。

在微平面中,正确朝向(即m = h)的微平面法线m的统计分布由 法线分布函数D(m) 进行建模。

但并非所有m = h的微平面都会对microfacet BRDF有所贡献:有些微平面会被光照方向或视图方向遮挡,这些被遮挡的光线在业界主流的微平面理论中被忽略不计。

所以需要引入几何项G来对这种现象进行建模,得到最终对microfacet BRDF能产生贡献的法线分布。

仅m = h的表面点的朝向才会将光线l反射到视线v的方向,其他表面点对BRDF没有贡献仅m = h的表面点的朝向才会将光线l反射到视线v的方向,其他表面点对BRDF没有贡献

实际上:Microfacet理论忽略了阴影区域会接收从其他表面区域反射的光。

此时引出两种不同光与微表面的交互行为

  • 阴影(Shadowing):表面微平面对入射光的遮挡,一般为对 光源方向 LL而言
  • 遮蔽(masking):表示微平面对出射光的遮挡,一般为对 观察方向 VV而言

左图:光线被微表面从l的方向进行遮挡,右图:光线被微表面从v的方向进行遮挡。左图:光线被微表面从l的方向进行遮挡,右图:光线被微表面从v的方向进行遮挡。

对可见微平面的投影区域(亮红色)进行积分,得到宏观表面在垂直于v的平面上的投影面积对可见微平面的投影区域(亮红色)进行积分,得到宏观表面在垂直于v的平面上的投影面积

  • 从上篇文章可以得知,可见微平面的投影面积之和等于宏观表面的投影面积。我们可以通过定义遮蔽函数(masking function)G1(m,v)G_1(m,v)来对其进行数学表达,它给出了沿着 视图向量v可见的具有法线m的微平面的比率。
  • G1(m,v)D(m)(vm)+G_1(m,v)D(m)(v·m)^+在球体上的积分然后给出投影到垂直于v的平面上的宏观表面的面积:

ΩG1(m,v)D(m)(vm)+dm=vn\int_{\Omega}G_1(m,v)D(m)(v·m)^+dm = v·n

  • G1(m,v)G_1(m,v):遮蔽函数/几何函数,从vv看过去,有多少比例的法线mm实际上是可见的。
  • D(m)D(m):法线分布函数,微表面的法线是如何分布的。
  • (vm)+(v·m)^+:几何投影因子,只有当微表面朝向视角方向时才有贡献。
  • vnv·n:宏观表面本身的投影面积。

积分的含义: 如果我正确地选了G1G_1DD,那么从某个方向vv看过去,所有微表面拼起来的可见面积,正好等于整个宏观表面投影的面积。

  • 通过x+的表示方法表达将v · m限制为大于等于0。背面微平面不可见,因此在这种情况下不对其进行计算。乘积G1(m,v)D(m)G1(m,v)D(m)则表示了可见法线的分布。
  • 上式对G1(m,v)G_1(m,v)施加约束, 但并不能唯一地确定它。有无数个函数满足给定微平面 法线分布 D(m)D(m)的约束。这是因为D(m)D(m)没有完全指定微表面(microsurface)。
  • 它仅告诉我们有多少百分比的微平面(microfacets)的法线 指向了某些方向,而没有告诉我们这些法线是 如何进行排列。而且对于固定的输出方向v,遮蔽函数(masking functions)是二维,存在无限多个函数满足等式。

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

为了确定 唯一的G项,Heitz在[Heitz 2014]中引入了第二个约束:选择合适的 微表面轮廓 (microsurface profile),从而对G项进行 具象化建模

轮廓的选择 可对所得 BRDF的形状产生强烈影响

具有相同法线分布但具有不同轮廓(profiles)的微表面导致不同的BRDF具有相同法线分布但具有不同轮廓(profiles)的微表面导致不同的BRDF

一旦选择好合适的微表面轮廓(microsurface profile),即选择了合适的微表面模型,加上等式(1)的约束,就可以完全确定 遮蔽函数,用于BRDF中的实际使用。

业界提出的表面轮廓/模型,按照提出或者归纳的时间,总结如下:

Smith模型和真世界连续微表面的对比。左图:具有大自相关距离的真实世界连续微表面。右图:Smith模型,其具有不相关的表面,即每个微平面与其邻域不相关。Smith模型和真世界连续微表面的对比。左图:具有大自相关距离的真实世界连续微表面。右图:Smith模型,其具有不相关的表面,即每个微平面与其邻域不相关。

图 V腔散射模型(V-cavity scattering mode) 该模型不是对一个微表面上的散射进行建模,而是计算单独微表面上的散射并混合结果。图 V腔散射模型(V-cavity scattering mode) 该模型不是对一个微表面上的散射进行建模,而是计算单独微表面上的散射并混合结果。

Heitz还证明了Smith遮蔽函数是唯一既遵循公式(1),又具有 法线遮蔽独立性 (normal-masking independence)便利特性的函数。

且Smith遮蔽函数具有比Cook-Torrance使用的V腔遮蔽函数(V-cavity masking function)更好地匹配真实世界的反射现象,这也是业界在两种基于物理的遮蔽函数中,更加青睐Smith遮蔽函数的原因。

Smith遮蔽函数的性质

  • Smith遮蔽函数(Smith masking function)是现在业界所采用的 主流 遮蔽函数。 Smith系列遮蔽函数 被广泛认为比Cook-Torrance使用的 V腔遮蔽函数 (V-cavity masking function)函数更准确,并且考虑了法线分布的粗糙度和形状。
  • 最初的Smith函数是为Beckmann NDF所设计,但Brown [Brown 1980]和后来的Bourlier等人 [Bourlier 2002]将Smith函数推广到计算几何函数以匹配任何NDF的方法中。
  • Smith遮蔽函数(Smith masking function),该函数最初是为 高斯正态分布 (Gaussian normal distributions)导出的,后来推广到 任意NDF

SmithG1Smith G_1函数 形式 如下:

G1(m,v)=χ+(mv)1+Λ(v),G_1(m,v) = \frac{\chi^+(m·v)}{1+\Lambda(v)},

其中χ+(x)\chi ^ +(x)表示正特征函数:

χ+(x)={1,wherex>0,0,wherex0.\chi^+(x) = \begin{cases} 1,&where&x>0,\\ 0,&where&x\le0. \end{cases}

  • 11+Λ(v)\frac{1}{1+\Lambda(v)}是Smith遮蔽函数的广义形式。对于许多随机曲面,其具有闭合形式的解。因此,在法线遮蔽独立的假设下,Smith遮蔽函数是精确的。
  • Λ(v)\Lambda(v)表示微表面斜率上的积分(integral over the slopes of the microsurface),表达式为

Λ=1cotθocotθo(xm˜cotθo)P2(xm˜)dxm˜\Lambda = \frac{1}{cot\theta_o}\int_{cot\theta_o}^\infty(x_{\~m} - cot\theta_o)P^{2-}(x_{\~m})dx_{\~m}

  • 在上式中:

P2(xm˜)=+P22(xm˜,ym˜)dym˜P^{2-}(x_{\~m})=\int_{-\infty}^{+\infty}P^{22}(x_{\~m},y_{\~m})dy_{\~m}

为视图方向上斜率的 1D分布

  • P22(xm˜,ym˜)P^{22}(x_{\~m},y_{\~m})为微表面斜率分布
  • m˜{\~m}是与法线m=(xm,ym,zm)m =(x_m,y_m,z_m)相关的斜率:

m˜=(xm˜,ym˜)=(xmzm,ymzm)=(tanθmcosϕm,tanθmsinϕm){\~m} =(x_{\~m},y_{\~m}) = (-\frac{x_m}{z_m},-\frac{y_m}{z_m}) = (-tan\theta_mcos\phi_m,-tan\theta_msin\phi_m)

  • θm\theta_m与宏观法线的夹角
  • ϕm\phi_m方位角
  • 斜率的分布必然是标准化的:

P22(xm˜,ym˜)dxm˜dym˜=1\int^{\infty}_{-\infty}\int^{\infty}_{-\infty}P^{22}(x_{\~m},y_{\~m})dx_{\~m}dy_{\~m} = 1

  • 且斜率分布和法线分布的关系为:

D(m)=P22(xm˜,ym˜)cos4θmD(m)=\frac{P^{22}(x_{\~m},y_{\~m})}{cos^4\theta_m}

  • Smith遮蔽函数的每个法线分布函数会导出不同的Λ\Lambda函数。仅具有 形状不变性 的法线分布函数可以导出具有解析形式的Λ\Lambda函数。(且 不具备形状不变性 的函数,则Λ\Lambda不存在解析形式
  • Smith遮蔽函数是常见遮蔽函数中,满足能量守恒又具有法线遮蔽独立性(Normal/Masking Independence)。
  • 法线/遮蔽独立(Normal/Masking Independence)作为Smith遮蔽函数的一大特点,源自 Smith微表面轮廓假设微曲面不是自相关的(autocorrelated),即在微表面的一个点处的高度(或法线)与任何相邻点处的高度(或法线)之间没有相关性。 这意味着一组 随机的微平面并不是连续的表面,微表面的 高度和法线是独立的随机变量。 如下图所示:

(左)具有大自相关距离的真实连续微表面(右)不相关型表面,其中每个微平面与其邻域不相关,如Smith模型(左)具有大自相关距离的真实连续微表面(右)不相关型表面,其中每个微平面与其邻域不相关,如Smith模型

  • Smith遮蔽函数(Smith masking function)对非随机表面与重复或结构化图案(例如布料(fabric))的相关性的影响可能非常显著。因此,对于布料之类的非随机表面或结构化图案,推荐使用专用模型,如专门的布料shading model。
  • Smith遮蔽函数确实也有一些缺点。从理论角度来看,其假设是与实际表面的结构不一致的,甚至可能在物理上无法实现。从实际的角度来看,虽然它对于随机表面非常准确,但是对于在法线方向和遮蔽之间具有更强依赖性的表面,例如下图中所示的表面,其预期精度会降低,特别是如果表面具有一些重复结构(如多数面料)。然而,在找到更好的替代方案之前,Smith遮蔽函数目前依然是业界的最佳选择。

  • 在图示的上半部分中,表面从接近宏观表面法线的角度照射。
    • 在这个角度,许多入射光线可以触及粗糙的凹坑,并且许多光线在不同的方向上散射。
  • 在图示下半部分中,表面从掠射角入射。
    • 阴影(Shadowing)阻挡了大部分凹坑,因此很少有光线触及到它们,所以大多数光线都从表面的光滑部分反射。
    • 在这种情况下,表面粗糙度的作用很大程度上取决于光照角度,这就是Smith遮蔽的函数的缺陷所在。

Smith联合遮蔽-阴影函数

业界常常使用Eric Heitz在[Heitz 2014]中提出的Smith联合遮蔽阴影函数(Smith Joint Masking-Shadowing Function)G2(l, v, m)来代替遮蔽函数G1(m, v)。

该函数具有四种形式:

  • 分离的遮蔽阴影型(Separable Masking and Shadowing)
  • 高度相关的遮蔽阴影型(Height-Correlated Masking and Shadowing)
  • 方向相关的遮蔽阴影型(Direction-Correlated Masking and Shadowing)
  • 高度-方向相关遮蔽阴影型(Height-Direction-Correlated Masking and Shadowing)

分离的遮蔽阴影型(Separable Masking and Shadowing)

最简单和最广泛使用的遮蔽阴影函数的变体是Walter等人推广的可分离形式[Walter 2007]。 在这种情况下,遮蔽(masking)和阴影(shadowing)是 独立 的,并且 分别计算并相乘

这种形式不模拟遮蔽和阴影之间的相关性,因此总会多估算阴影,因为一些相关性总是存在的。

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

更精确形式的遮蔽阴影函数模拟了由于微表面 高度 引起的 遮蔽和阴影 之间的相关性。

直观来说,微平面(microfacet)在微表面(microsurface)内升高得越多,对于出射方向未被遮蔽(unmasked)和入射方向未被掩蔽(unshadowed)的可见概率会同时增加。

这种相关性以联合遮蔽阴影函数(joint masking-shadowing function)的高度相关形式进行表达:

  • 当出射方向和入射方向彼此远离时,此形式是准确的,但是当方向接近时,此形式会估算出更多的阴影。
  • Heitz建议在实践中使用此版本的遮蔽阴影函数,因为它比可分离的遮蔽阴影函数更精确,却同时具有相同的计算复杂度。

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

Ashikhmin等 [Ashikhmin 2000]通过混合可分离的遮蔽阴影函数与两个方向完全相关的情形来表达方向相关:

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

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

。。补全吧,累了晚点看

多重散射微平面BRDF

几何函数的基本性质

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

  • 标量性
  • 对称性
  • 同向可见性
  • 拉伸不变性

标量性

  • 几何函数是0~1之间的一个标量:

0G(l,v,m)10\le G(l,v,m) \le1

  • 地粗糙度下几何函数大多情况下数值接近1,如下图所示。

GGX对应的遮蔽阴影函数,增加表面粗糙度(更高的值)会使函数更快地降至零。(图片来自[Physically Based Rendering 3rd])GGX对应的遮蔽阴影函数,增加表面粗糙度(更高的值)会使函数更快地降至零。(图片来自[Physically Based Rendering 3rd])

GGX-Smith几何项,从左到右的粗糙度为 0.0, 0.2, 0.5, 0.8, 1.0GGX-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)

同向可见性

几何函数从宏观表面正面方向上无法看到微表面的背面,反之亦然:

拉伸不变性(Stretch Invariance)

  • 微表面几何轮廓具有拉伸不变性(Stretch Invariance)。拉伸后,遮挡的光线仍会被遮挡,未遮挡的光线仍未被遮挡。
  • 当微表面轮廓中涉及的所有斜率同时缩放,遮蔽概率对于配置拉伸时不变的。
    • 包括微表面的斜率和出射方向相关的斜率,都是通过拉伸因子的倒数来缩放的。

将1D的微表面配置拉伸2倍不会改变遮蔽概率,但是配置的所有斜率都会缩放1倍,包括微表面的斜率以及与出射方向相关的斜率将1D的微表面配置拉伸2倍不会改变遮蔽概率,但是配置的所有斜率都会缩放1倍,包括微表面的斜率以及与出射方向相关的斜率

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

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

SmithG1Smith G_1函数 形式 如下:

G1(m,v)=χ+(mv)1+Λ(v),G_1(m,v) = \frac{\chi^+(m·v)}{1+\Lambda(v)},

其中χ+(x)\chi ^ +(x)表示正特征函数:

χ+(x)={1,wherex>0,0,wherex0.\chi^+(x) = \begin{cases} 1,&where&x>0,\\ 0,&where&x\le0. \end{cases}

下面将总结主流各项同性法线分布函数对应的Λ函数的解析形式。

Beckmann法线分布的 Lambda函数

Beckmann法线分布函数具备形状不变性,其Smith这不函数对应的解析式为:

其中a=1αtanθoa = \frac{1}{\alpha tan\theta_o}

计算成本很高,包括误差函数erferf于是Walter 等人[Walter et al. 2007] 为其提出了精确的有理逼近,可以用于近似Λ(v)\Lambda(v):

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

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

GGX法线分布的Λ\Lambda函数

GGX法线分布函数具备形状不变性,Smith遮蔽函数对应的Λ\Lambda解析形式相对简单:

Λ=1+1+1a22\Lambda = \frac{-1+\sqrt{1+\frac{1}{a^2}}}{2}

其中,a=1αtanθa = \frac{1}{\alpha tan\theta}

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

Smith GGX的演变和发展

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

  • SIGGRAPH 2014之前, Smith分离的 遮蔽阴影函数
  • SIGGRAPH 2014之后, Smith相关的 遮蔽阴影函数

SIGGRAPH 2012:Disney

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

以下是Disney 实现的SmithGGX的几何项表达:

α=(0.5+roughness2)2\alpha = (0.5 + \frac{roughness}{2})^2

G1=2(nv)(nv)+α2+(1α2)(nv)2G_1 = \frac{2(n·v)}{(n·v)+\sqrt{\alpha^2 + (1-\alpha^2)(n·v)^2}}

G(l,v,h)=G1(l)G1(v)G(l,v,h)=G_1(l)G_1(v)

SIGGRAPH 2013:UE4

其中UE4在SIGGRAPH 2013上公布的方案为基于Schlick近似,将k映射为k=a2k = \frac{a}{2},去匹配GGX Smith方程,并采用了Disney对粗糙度的重映射:

\begin{align} k &= \frac{\alpha}{2}\\ \alpha &= (\frac{roughness+1}{2})^2\\ G_1(v) &= \frac{n·v}{(n·v)(1-k)+k}\\ G(l,v,h)&= G_1(l)G_1(v) \end{align}

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) 的理解上升到了一个新的层次。

Frostbite的GGX-Smith Joint 近似方案

寒霜引擎的近似方案。Frostbite的Lagarde[Lagarde 2014 ]观察到对GGX高度相关的Smith G2(height-correlated Smith G2)具有与镜面微平面BRDF的分母组合时抵消的项, 因此可以简化组合项为:

其中

UE4的GGX-Smith Correlated Joint 近似方案

UE4采用GGX-Smith Correlated Joint Approximate为:

// 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为:

// 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为:

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);
}

Respawn Entertainment的 GGX-Smith Joint近似方案

Hammon[Hammon 2017]在GDC 2017上提出,UE4在2013年提出的近似G1可以导出由高度相关的Vis项的高效近似:

lerp线性插值算子,lerp(x, y, s) = (1 - s) * x + s * y

图 GDC 2017, PBR Diffuse Lighting for GGX+Smith Microsurfaces ,Earl图 GDC 2017, PBR Diffuse Lighting for GGX+Smith Microsurfaces ,Earl

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

Eric Heitz在[Heitz 2014]中提出了白炉测试与弱白炉测试,作为 BSDFBRDF 是否能量守恒的标准化测试方法。

白炉测试(The White Furnace Test)

白炉测试代码参考:白炉测试代码

白炉测试(The White Furnace Test)的思路为验证入射总能量为1的光线的反射光线分布是否归一化的测试。

可以将白炉测试理解为一束辉度(irrandiance)为1的光线从上往下照到菲涅尔反射项为1(菲涅尔反射项始终为1,则光线永远不会透射,即所有的入射光线都会被全部反射,则表示投射的光线将被散射一次或多次并最终离开表面。)的材质表面,并测定反射光线总能量是否为1的过程。若反射光线总能量为1,则通过白炉测试,否则,便不通过白炉测试。

白炉测试:将光线投射到微表面上,并测试反射光线的总能量是否为1白炉测试:将光线投射到微表面上,并测试反射光线的总能量是否为1

白炉测试方程由以下的式子给出:

Ωlρ(v,l)nldl=1\int_{\Omega_l}\rho(v,l)|n·l|dl = 1

其中ρ\rho为待测试的BRDF

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

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

因为在2014年白炉测试被提出时,主流的BRDF模拟微表面上的单次反射,并不能多次散射,具有能量损失。所以业界主流的BRDF模型即使在“完美的反射表面(perfect reflector)”

微表面上进行参数化时也不会积分到1,并且不满足白炉测试方程。

对此,Eric Heitz在[Heitz 2014]中设计了另一个限制性较小的,用于测试常见的基于microfacet的BRDF是否标准化的测试: 弱白炉测试(The Weak White Furnace Test)

主要思路为验证在 第一次反弹之后和离开表面之前反射的光线分布是否归一化。 对几何项而言,即 没有 入射的阴影(shadowing)项, 只有 出射的遮蔽(masking)项。可以通过用遮蔽(masking)函数替换遮蔽阴影(masking-shadowing)函数,即G2(l,v,h)=G1(v,h)G2(l,v,h) = G1(v,h)来实现。

ΩlG1(v,h)D(h)4nvdl=1\int_{\Omega_l}\frac{G_1(v,h)D(h)}{4|n·v|}dl = 1

微平面Specular BRDF的弱白炉测试的具体过程微平面Specular BRDF的弱白炉测试的具体过程

评论 / Comments