Microfacet模型采样下的brdf

本文前言

在学习图形学(games101 from bilibili)的时候,也遇到了像这样的问题,Cook-Torrance模型无法实现粗糙度为0时,物体微表面呈现绝对镜面的效果(呈现出一面镜子),为了搜寻解决办法,因此看到了这篇博客,因为是全英文,所以就花了一点时间翻译了一下,方便日后重新观看,红色字对原博客的补充说明

前言

最近我正在为我的渲染器开发microfacet brdf模型,我注意到为microfacet brdf提供一个单独的采样方法是非常必要的,而不是使用默认的方法,因为默认的方法通常用于像漫反射一样的表面,而对于像镜面一样的带有mirror的brdf,效率非常低。下面的图片是由默认采样方法生成的。

左边的猴子是纯反射brdf,这在我之前的博文中提到过,右边的猴子使用microfacet模型,粗糙度值为0(对于一个平滑的光面,光线大体上更趋向于向同一个方向反射,造成更小更锐利的反射)。我本来以为这两只猴子会有类似的结果,但事实证明这里是错误的,我们几乎看不到猴子的反射。其实没有什么问题,事实是,默认采样的粗糙度为0的microfacet模型的收敛率非常低。只要有足够的样本,它就会达到与左图相似的外观。然而,足够的样本数可以是任意的高,这取决于你的brdf有多尖锐。

本文中提到了对microfacet brdf进行采样的正确方法。我想在这篇博客中记录的是这些结论是如何从原始microfacet模型中得出的。使用这些更好的采样方法,我们最终会对那两只猴子得到类似的结果。

为什么默认的抽样方法是低效的

那么,为什么这种默认的抽样方法对于像brdf模型这样的镜像来说是低效的。首先,默认的抽样方法与以下的pdf。
p h ( ω ) = c o s ( θ ) π p_h(ω)=\frac{cos(θ)}{π} ph(ω)=πcos(θ)
对于像Lambert, OrenNayar这样的漫反射表面,它能达到很好的效果。事实上,它不是漫反射brdfs的取样方法,Lambert brdf的取样方法会尊重一个恒定值的pdf,它还涉及到位于渲染方程或LTE中的余弦因子。

漫反射的brdf是一个均匀分布的,而金属表面呈现出的高光项,更像是集中于一点向周围扩散,所以需要对某个方向进行重要性采样,就像是一个函数中间部分的权重,比两旁的权重占比更大
L o ω o = ∫ L i ( ω i ) ∗ f ( ω i , ω o ) ∗ cos ⁡ ( θ i ) d ω i L_o\omega _o=\int{L_i\left( \omega _i \right) *f\left( \omega _i,\omega _o \right) *\cos \left( \theta _i \right) d\omega _i} Loωo=Li(ωi)f(ωi,ωo)cos(θi)dωi
由于对入射光的radiance了解极为困难,甚至不可能,我们唯一拥有的就是brdf和余弦系数。如果brdf和余弦系数的乘积是这个方程中的主导因素,那么上面提到的采样方法可能是有效的。在大多数时候,它在实践中是非常有效的。

然而,当brdf成为主导因素,且粗糙度为0时,默认的取样方法的效率就会迅速下降。对于这里的microfacet brdf,其极端形式就像dirac-delta函数(狄拉克δ函数),几乎不可能得到brdf为非零值的样本。而对于那些幸运的、有非零brdf值的样本,由于其概率低,可能会达到超高值,给采样结果带来高方差。换句话说,收敛率相当低,这正是我们看到上述图像的原因。它甚至可以被当作是一个bug。很明显,我们需要一个更好的方法来对这些microfacet brdfs进行采样。

微表面模型

Microfacet Model是这几年在实时渲染中比较热门的,它是基于物理的着色算法的基本原理。一般来说,它的基本形式是这样的。
f ( ω i , ω o , x ) = F ( ω i , h ) G ( ω i , ω o , h ) D ( h ) 4 c o s ( θ i ) c o s ( θ o ) f(ω_i,ω_o,x)=\frac{F(ω_i,h)G(ω_i,ω_o,h)D(h)}{4cos(θ_i)cos(θ_o)} f(ωi,ωo,x)=4cos(θi)cos(θo)F(ωi,h)G(ωi,ωo,h)D(h)
第一个分量是Fresnel,第二个分量是几何项G项(Geometry Function,一般来说包含Geometry Obstruction和Geometry Shadowing),最后一个分量是正态分布函数(Normal Distribution Function,简称NDF)。与传统的bxdf模型相比,microfacet模型遵守能量守恒规则,允许艺术家通过一个参数而不是两个参数来改变材料的粗糙度,即镜面颜色和镜面功率。

在这个方程式的所有这些因素中,NDF项通常是最主要的。NDF的具体形状在很大程度上受到bxdf的粗糙度的影响。为了对microfacet brdf模型进行采样,通常是先对NDF进行采样,得到一个遵循NDF的随机microfacet法线,然后沿法线反射出射radiance,产生入射方向。

目前有几种NDF。本博客将介绍以下三种,所提到的都是各向同性(当旋转一定方位角时,能得到相同的BRDF)的。

  • GGX
  • Beckmann
  • Blinn

在我们继续之前,有一条规则是所有NDF应该遵循的。
∫ Ω D ( m ) cos ⁡ ( θ m ) d ω = 1 \int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1} ΩD(m)cos(θm)dω=1
我们将在下面的推导中使用这个方程。解释这个方程不在本博客的范围内,你们可以参考这里的进一步细节。公式的由来

NDF(补充)

NDF详细的定义可了解这篇文章(How Is The NDF Really Defined),文章中有对上述规则的说明

接下来介绍下面公式推导之前需要了解的

NDF遵循公式
d A h = D ( h ) d ω h A       ( 1 ) dA_h=D(h)d\omega_hA\,\,\,\,\,(1) dAh=D(h)dωhA(1)
同时NDF的归一化条件:
∫ Ω D ( m ) cos ⁡ ( θ m ) d ω = 1       ( 2 ) \int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1} \,\,\,\,\,(2) ΩD(m)cos(θm)dω=1(2)
根据式(2)可知 ∫ Ω D ( m ) cos ⁡ ( θ m ) d ω = 1 \int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1} ΩD(m)cos(θm)dω=1,因此 D ( h ) c o s ( θ h ) D(h)cos(θ_h) D(h)cos(θh),即表示当前所采取模型NDF的概率密度(pdf)

概率密度函数的转换有: p ( θ , φ ) = s i n θ p ( ω ) p(θ,φ)=sinθp(ω) p(θ,φ)=sinθp(ω)

请注意无论我们接下来用哪种形式进行采样,我们最终都需要得到该采样形式的 p d f pdf pdf p h ( ω ) p_h(\omega) ph(ω),而非 p h ( θ , ϕ ) p_h(θ,\phi) ph(θ,ϕ)

GGX采样

下面是GGX的基本形式。
D ( h ) = α 2 π ( ( α 2 − 1 ) cos ⁡ 2 θ + 1 ) 2 D\left( h \right) =\frac{\alpha ^2}{\pi \left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2} D(h)=π((α21)cos2θ+1)2α2
因此,关于立体角的pdf是这样的。
p h ( ω ) = α 2 cos ⁡ θ π ( ( α 2 − 1 ) cos ⁡ 2 θ + 1 ) 2 p_h(ω) =\frac{\alpha ^2\cos \theta}{\pi \left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2} ph(ω)=π((α21)cos2θ+1)2α2cosθ
我们通常不直接对立体角进行采样,而是用球面坐标来采样。所以我们感兴趣的不是关于立体角的pdf,而是关于球坐标的pdf。
p h ( θ , ϕ ) = s i n θ p h ( ω ) = α 2 cos ⁡ θ sin ⁡ θ π ( ( α 2 − 1 ) cos ⁡ 2 θ + 1 ) 2 p_h\left( \theta ,\phi \right) =sinθp_h(\omega)=\frac{\alpha ^2\cos \theta \sin \theta}{\pi \left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2} ph(θ,ϕ)=sinθph(ω)=π((α21)cos2θ+1)2α2cosθsinθ
下面的公式非常简单,基本上是根据特定的pdf进行抽样,反转法在本博客中适用于所有ndf。请注意,这个公式没有 π \pi π,也就是说NDF是完全各向同性的,我们可以均匀地采样 π \pi π。详细地证明,请参考这里。这里唯一剩下的是如何对 θ \theta θ进行采样。为了做到这一点,我们需要先得到 θ θ θ的pdf。
p h ( θ ) = ∫ 0 2 π p h ( θ , ϕ ) d ϕ = 2 α 2 cos ⁡ θ sin ⁡ θ ( ( α 2 − 1 ) cos ⁡ 2 θ + 1 ) 2 p_h\left( \theta \right) =\int_0^{2\pi}{p_h\left( \theta ,\phi \right) d\phi}=\frac{2\alpha ^2\cos \theta \sin \theta}{\left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2} ph(θ)=02πph(θ,ϕ)dϕ=((α21)cos2θ+1)22α2cosθsinθ
接下来我们来计算CDF(Cumulative Distribution Function)
p h ( θ ) = ∫ 0 θ 2 α 2 cos ⁡ t sin ⁡ t ( ( α 2 − 1 ) cos ⁡ 2 t + 1 ) 2 d t p_h\left( \theta \right) =\int_0^{\theta}{\frac{2\alpha ^2\cos t\sin t}{\left( \left( \alpha ^2-1 \right) \cos ^2t+1 \right) ^2}dt} ph(θ)=0θ((α21)cos2t+1)22α2costsintdt

= ∫ θ 0 2 α 2 cos ⁡ t ( ( α 2 − 1 ) cos ⁡ 2 t + 1 ) 2 d ( cos ⁡ t ) =\int_\theta^{0}{\frac{2\alpha ^2\cos t}{\left( \left( \alpha ^2-1 \right) \cos ^2t+1 \right) ^2}d\left( \cos t \right)} =θ0((α21)cos2t+1)22α2costd(cost)

= ∫ θ 0 α 2 ( ( α 2 − 1 ) cos ⁡ 2 t + 1 ) 2 d ( cos ⁡ 2 t ) =\int_\theta^{0}{\frac{\alpha ^2}{\left( \left( \alpha ^2-1 \right) \cos ^2t+1 \right) ^2}d\left( \cos ^2t \right)} =θ0((α21)cos2t+1)2α2d(cos2t)

= − α 2 α 2 − 1 ∫ θ 0 d 1 cos ⁡ 2 t ( α 2 − 1 ) + 1 =-\frac{\alpha ^2}{\alpha ^2-1}\int_\theta^{0}{d\frac{1}{\cos ^2t\left( \alpha ^2-1 \right) +1}} =α21α2θ0dcos2t(α21)+11

= α 2 α 2 − 1 ∫ 0 θ d 1 cos ⁡ 2 t ( α 2 − 1 ) + 1 =\frac{\alpha ^2}{\alpha ^2-1}\int_0^{\theta}{d\frac{1}{\cos ^2t\left( \alpha ^2-1 \right) +1}} =α21α20θdcos2t(α21)+11

= α 2 α 2 − 1 ( 1 cos ⁡ 2 θ ( α 2 − 1 ) + 1 − 1 α 2 ) =\frac{\alpha ^2}{\alpha ^2-1}\left( \frac{1}{\cos ^2\theta \left( \alpha ^2-1 \right) +1}-\frac{1}{\alpha ^2} \right) =α21α2(cos2θ(α21)+11α21)

= α 2 cos ⁡ 2 θ ( α 2 − 1 ) 2 + ( α 2 − 1 ) − 1 α 2 − 1 =\frac{\alpha ^2}{\cos ^2\theta \left( \alpha ^2-1 \right) ^2+\left( \alpha ^2-1 \right)}-\frac{1}{\alpha ^2-1} =cos2θ(α21)2+(α21)α2α211

当一个标准随机数 ϵ \epsilon ϵ等于这个CDF时,我们有以下方程:
ϵ = α 2 cos ⁡ 2 θ ( α 2 − 1 ) 2 + ( α 2 − 1 ) − 1 α 2 − 1 \epsilon =\frac{\alpha ^2}{\cos ^2\theta \left( \alpha ^2-1 \right) ^2+\left( \alpha ^2-1 \right)}-\frac{1}{\alpha ^2-1} ϵ=cos2θ(α21)2+(α21)α2α211

解这个方程不需要比初中数学多的知识,我想也没有必要把整个过程展示出来。上式的最终解为:
θ = a r c cos ⁡ 1 − ϵ ϵ ( α 2 − 1 ) + 1 \theta =\mathrm{arc}\cos \sqrt{\frac{1-\epsilon}{\epsilon \left( \alpha ^2-1 \right) +1}} θ=arccosϵ(α21)+11ϵ or θ = a r c tan ⁡ ( α ϵ 1 − ϵ ) \theta =\mathrm{arc}\tan \left( \alpha \sqrt{\frac{\epsilon}{1-\epsilon}} \right) θ=arctan(α1ϵϵ )

上述两个方程式是完全相同的东西。选择使用哪一个只是一个品味问题。

Beckmann采样

Beckmann抽样法的推导过程与上述过程十分相似。这是Beckmann分布:
D ( h ) = 1 π α 2 cos ⁡ 4 θ e − tan ⁡ 2 θ α 2 D\left( h \right) =\frac{1}{\pi \alpha ^2\cos ^4\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}} D(h)=πα2cos4θ1eα2tan2θ

关于球面坐标的pdf是这样的:
p h ( θ , ϕ ) = sin ⁡ θ π α 2 cos ⁡ 3 θ e − tan ⁡ 2 θ α 2 p_h\left( \theta ,\phi \right) =\frac{\sin \theta}{\pi \alpha ^2\cos ^3\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}} ph(θ,ϕ)=πα2cos3θsinθeα2tan2θ
同理, ϕ \phi ϕ可以被均匀地采样。 θ \theta θ的pdf应该是这样的
p h ( θ ) = 2 sin ⁡ θ α 2 cos ⁡ 3 θ e − tan ⁡ 2 θ α 2 p_h\left( \theta \right) =\frac{2\sin \theta}{\alpha ^2\cos ^3\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}} ph(θ)=α2cos3θ2sinθeα2tan2θ
θ \theta θ的CDF可以这样计算:
P h ( θ ) = ∫ 0 θ 2 sin ⁡ ( t ) α 2 cos ⁡ 3 t e − tan ⁡ 2 t α 2 d t = ∫ 0 θ − 2 α 2 cos ⁡ 3 t e − tan ⁡ 2 t α 2 d ( cos ⁡ ( t ) ) = ∫ 0 θ 1 α 2 e − tan ⁡ 2 t α 2 d ( 1 cos ⁡ 2 ( t ) ) = ∫ 0 θ 1 α 2 e 1 α 2 ( 1 − 1 cos ⁡ 2 t ) d ( 1 cos ⁡ 2 ( t ) ) = ∫ 0 θ 1 α 2 e 1 α 2 ( 1 − 1 cos ⁡ 2 t ) d ( 1 cos ⁡ 2 ( t ) ) = ∫ θ 0 d ( e 1 α 2 ( 1 − 1 cos ⁡ 2 t ) ) = 1 − e 1 α 2 ( 1 − 1 cos ⁡ 2 θ ) P_h\left( \theta \right) =\int_0^{\theta}{\frac{2\sin \left( t \right)}{\alpha ^2\cos ^3t}e^{-\frac{\tan ^2t}{\alpha ^2}}}dt \\ =\int_0^{\theta}{\frac{-2}{\alpha ^2\cos ^3t}e^{-\frac{\tan ^2t}{\alpha ^2}}}d\left( \cos \left( t \right) \right) \\ =\int_0^{\theta}{\frac{1}{\alpha ^2}e^{-\frac{\tan ^2t}{\alpha ^2}}}d\left( \frac{1}{\cos ^2\left( t \right)} \right) \\ =\int_0^{\theta}{\frac{1}{\alpha ^2}e^{\frac{1}{\alpha ^2}\left( 1-\frac{1}{\cos ^2t} \right)}}d\left( \frac{1}{\cos ^2\left( t \right)} \right) \\ =\int_0^{\theta}{\frac{1}{\alpha ^2}e^{\frac{1}{\alpha ^2}\left( 1-\frac{1}{\cos ^2t} \right)}}d\left( \frac{1}{\cos ^2\left( t \right)} \right) \\ =\int_{\theta}^0{d\left( e^{\frac{1}{\alpha ^2}\left( 1-\frac{1}{\cos ^2t} \right)} \right)} \\ =1-e^{\frac{1}{\alpha ^2}\left( 1-\frac{1}{\cos ^2\theta} \right)} Ph(θ)=0θα2cos3t2sin(t)eα2tan2tdt=0θα2cos3t2eα2tan2td(cos(t))=0θα21eα2tan2td(cos2(t)1)=0θα21eα21(1cos2t1)d(cos2(t)1)=0θα21eα21(1cos2t1)d(cos2(t)1)=θ0d(eα21(1cos2t1))=1eα21(1cos2θ1)
解决 P h ( θ ) = ϵ P_h(\theta)= \epsilon Ph(θ)=ϵ的方程可以得到以下解决方案。

θ = a r c cos ⁡ 1 1 − α 2 ln ⁡ ( 1 − ϵ ) \theta =\mathrm{arc}\cos \sqrt{\frac{1}{1-\alpha ^2\ln \left( 1-\epsilon \right)}} θ=arccos1α2ln(1ϵ)1 or θ = a r c tan ⁡ − α 2 ln ⁡ ( 1 − ϵ ) \theta =\mathrm{arc}\tan \sqrt{-\alpha ^2\ln \left( 1-\epsilon \right)} θ=arctanα2ln(1ϵ)

Blinn采样

这里是Blinn的NDF:
D ( h ) = α + 2 2 π ( cos ⁡ θ ) α D\left( h \right) =\frac{\alpha +2}{2\pi}\left( \cos \theta \right) ^{\alpha} D(h)=2πα+2(cosθ)α
关于球面坐标的pdf是:
p h ( θ , ϕ ) = α + 2 2 π ( cos ⁡ θ ) α + 1 sin ⁡ θ p_h\left( \theta ,\phi \right) =\frac{\alpha +2}{2\pi}\left( \cos \theta \right) ^{\alpha +1}\sin \theta ph(θ,ϕ)=2πα+2(cosθ)α+1sinθ
分离 ϕ \phi ϕ可以得到以下结果:
p h ( θ ) = ( α + 2 ) ( cos ⁡ θ ) α + 1 sin ⁡ θ p_h\left( \theta \right) =\left( \alpha +2 \right) \left( \cos \theta \right) ^{\alpha +1}\sin \theta ph(θ)=(α+2)(cosθ)α+1sinθ
这个比前两个简单多了,这是CDF:
P h ( θ ) = ∫ 0 θ ( α + 2 ) cos ⁡ ( t ) α + 1 sin ⁡ ( t ) d ( t ) = ∫ θ 0 ( α + 2 ) cos ⁡ ( t ) α + 1 d ( cos ⁡ ( t ) ) = ∫ θ 0 d ( cos ⁡ ( t ) α + 2 ) = 1 − cos ⁡ ( θ ) α + 2 P_h\left( \theta \right) =\int_0^{\theta}{\left( \alpha +2 \right) \cos \left( t \right) ^{\alpha +1}\sin \left( t \right) d\left( t \right)} \\ =\int_{\theta}^0{\left( \alpha +2 \right) \cos \left( t \right) ^{\alpha +1}d\left( \cos \left( t \right) \right)} \\ =\int_{\theta}^0{d\left( \cos \left( t \right) ^{\alpha +2} \right)} \\ =1-\cos \left( \theta \right) ^{\alpha +2} Ph(θ)=0θ(α+2)cos(t)α+1sin(t)d(t)=θ0(α+2)cos(t)α+1d(cos(t))=θ0d(cos(t)α+2)=1cos(θ)α+2
以下是经典随机数与 θ \theta θ之间的关系
θ = a r c cos ⁡ ( ( 1 − ϵ ) 1 α + 2 ) \theta =\mathrm{arc}\cos \left( \left( 1-\epsilon \right) ^{\frac{1}{\alpha +2}} \right) θ=arccos((1ϵ)α+21)
由于 ϵ \epsilon ϵ是一个经典的随机数, 1 − ϵ 1-\epsilon 1ϵ也是一个。因此,我们可以用下面的方程式来简化上述方程式。
θ = a r c cos ⁡ ( ϵ 1 α + 2 ) \theta =\mathrm{arc}\cos \left( \epsilon^{\frac{1}{\alpha +2}} \right) θ=arccos(ϵα+21)
关于这种抽样方法,再多说一点。我对这个解决方案不太自信,尽管我看不出这个推导有什么问题。PBRT(Physically Based Rendering: From Theory to Implemention 3rd)对Blinn给出了一个类似的解决方案,这就是:
θ = a r c cos ⁡ ( ϵ 1 α + 1 ) \theta =\mathrm{arc}\cos \left( \epsilon^{\frac{1}{\alpha +1}} \right) θ=arccos(ϵα+11)
而另一个开源的光线追踪器Mitsuba也采用了这种采样方式。我不太理解书中的推导,所以我就坚持用这个,也是这里提到的那个。我试了一下pbrt的取样方式,从图片上可以看出只有微小的差别。

一个额外的步骤

还有一步没有完成。我们感兴趣的是入射方向的采样,而不是法线。我们之所以直接对法线而不是入射方向进行采样,是因为NDF通常是microfacet模型中的主导因素。在对法线采样后生成入射方向是比入射方向本身采样更有效的方法。

然而,我们计算给定入射方向的PDF的方式与上述尊重半向量的方式不同,无论是实体角还是球面坐标。到目前为止,我们所拥有的是半向量的PDF,一个转换是必要的。
p ( θ ) = p h ( θ ) d ω h d ω i = p h ( θ ) 4 ( ω o ⋅ ω h ) p\left( \theta \right) =p_h\left( \theta \right) \frac{d\omega _h}{d\omega _i}=\frac{p_h\left( \theta \right)}{4\left( \omega _o·\omega _h \right)} p(θ)=ph(θ)dωidωh=4(ωoωh)ph(θ)

结论

下面是新的取样方法之后和之前产生的图像。

64spp,GGX被选为NDF,三只猴子的粗糙度值不同(0.0,0.5,1.0)。从图中我们可以看到,最左边的猴子得到的结果比默认的采样方法好得多。对于其他两只猴子,我们用余弦-pdf取样方法得到了类似的结果。

已经有一些研究工作改进了这个博客中提到的采样方法。一旦我有一些空闲时间,我可能需要试试他们的方法。

本文后续

原文的翻译到这里就结束了,来看看用了重要性采样后的作业7对比吧!

第一幅图的粗糙度因为接近于0,可以看到略微的镜面效果,但是不如第二张(去掉漫反射项)明显

请忽略第二幅图,球体中映射灯光为全黑,我仍在查找这个问题的solution

扩展阅读

引用

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值