本文前言

在學習圖形學(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(ω)=\frac{cos(θ)}{π}
\]

對於像Lambert, OrenNayar這樣的漫反射表面,它能達到很好的效果。事實上,它不是漫反射brdfs的取樣方法,Lambert brdf的取樣方法會尊重一個恆定值的pdf,它還涉及到位於渲染方程或LTE中的餘弦因子。

漫反射的brdf是一個均勻分佈的,而金屬表面呈現出的高光項,更像是集中於一點向周圍擴散,所以需要對某個方向進行重要性取樣,就像是一個函式中間部分的權重,比兩旁的權重佔比更大

\[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}
\]

由於對入射光的radiance瞭解極為困難,甚至不可能,我們唯一擁有的就是brdf和餘弦係數。如果brdf和餘弦係數的乘積是這個方程中的主導因素,那麼上面提到的取樣方法可能是有效的。在大多數時候,它在實踐中是非常有效的。

然而,當brdf成為主導因素,且粗糙度為0時,預設的取樣方法的效率就會迅速下降。對於這裡的microfacet brdf,其極端形式就像dirac-delta函式(狄拉克δ函式),幾乎不可能得到brdf為非零值的樣本。而對於那些幸運的、有非零brdf值的樣本,由於其概率低,可能會達到超高值,給取樣結果帶來高方差。換句話說,收斂率相當低,這正是我們看到上述影象的原因。它甚至可以被當作是一個bug。很明顯,我們需要一個更好的方法來對這些microfacet brdfs進行取樣。

微表面模型

Microfacet Model是這幾年在實時渲染中比較熱門的,它是基於物理的著色演算法的基本原理。一般來說,它的基本形式是這樣的。

\[f(ω_i,ω_o,x)=\frac{F(ω_i,h)G(ω_i,ω_o,h)D(h)}{4cos(θ_i)cos(θ_o)}
\]

第一個分量是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應該遵循的。

\[\int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1}
\]

我們將在下面的推導中使用這個方程。解釋這個方程不在本部落格的範圍內,你們可以參考這裡的進一步細節。公式的由來hows-the-ndf-really-defined/

NDF(補充)

NDF詳細的定義可瞭解這篇文章(How Is The NDF Really Defined),文章中有對上述規則的說明

接下來介紹下面公式推導之前需要了解的

NDF遵循公式

\[dA_h=D(h)d\omega_hA\,\,\,\,\,(1)
\]

同時NDF的歸一化條件:

\[\int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1} \,\,\,\,\,(2)
\]

根據式(2)可知\(\int_{\varOmega}{D\left( m \right) \cos \left( \theta _m \right) d\omega =1}\),因此\(D(h)cos(θ_h)\),即表示當前所採取模型NDF的概率密度(pdf)

概率密度函式的轉換有:\(p(θ,φ)=sinθp(ω)\)

GGX取樣

下面是GGX的基本形式。

\[D\left( h \right) =\frac{\alpha ^2}{\pi \left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2}
\]

因此,關於立體角的pdf是這樣的。

\[p_h(ω) =\frac{\alpha ^2\cos \theta}{\pi \left( \left( \alpha ^2-1 \right) \cos ^2\theta +1 \right) ^2}
\]

我們通常不直接對立體角進行取樣,而是用球面座標來取樣。所以我們感興趣的不是關於立體角的pdf,而是關於球座標的pdf。

\[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}
\]

下面的公式非常簡單,基本上是根據特定的pdf進行抽樣,反轉法在本部落格中適用於所有ndf。請注意,這個公式沒有\(\pi\),也就是說NDF是完全各向同性的,我們可以均勻地取樣\(\pi\)。詳細地證明,請參考這裡。這裡唯一剩下的是如何對\(\theta\)進行取樣。為了做到這一點,我們需要先得到\(θ\)的pdf。

\[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}
\]

接下來我們來計算CDF(Cumulative Distribution Function):

\[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}
\]
\[=\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)}
\]
\[=\int_\theta^{0}{\frac{\alpha ^2}{\left( \left( \alpha ^2-1 \right) \cos ^2t+1 \right) ^2}d\left( \cos ^2t \right)}
\]
\[=-\frac{\alpha ^2}{\alpha ^2-1}\int_\theta^{0}{d\frac{1}{\cos ^2t\left( \alpha ^2-1 \right) +1}}
\]
\[=\frac{\alpha ^2}{\alpha ^2-1}\int_0^{\theta}{d\frac{1}{\cos ^2t\left( \alpha ^2-1 \right) +1}}
\]
\[=\frac{\alpha ^2}{\alpha ^2-1}\left( \frac{1}{\cos ^2\theta \left( \alpha ^2-1 \right) +1}-\frac{1}{\alpha ^2} \right)
\]
\[=\frac{\alpha ^2}{\cos ^2\theta \left( \alpha ^2-1 \right) ^2+\left( \alpha ^2-1 \right)}-\frac{1}{\alpha ^2-1}
\]

當一個標準隨機數\(\epsilon\)等於這個CDF時,我們有以下方程:

\[\epsilon =\frac{\alpha ^2}{\cos ^2\theta \left( \alpha ^2-1 \right) ^2+\left( \alpha ^2-1 \right)}-\frac{1}{\alpha ^2-1}
\]

解這個方程不需要比初中數學多的知識,我想也沒有必要把整個過程展示出來。上式的最終解為:

\(\theta =\mathrm{arc}\cos \sqrt{\frac{1-\epsilon}{\epsilon \left( \alpha ^2-1 \right) +1}}\) or \(\theta =\mathrm{arc}\tan \left( \alpha \sqrt{\frac{\epsilon}{1-\epsilon}} \right)\)

上述兩個方程式是完全相同的東西。選擇使用哪一個只是一個品味問題。

Beckmann取樣

Beckmann抽樣法的推導過程與上述過程十分相似。這是Beckmann分佈:

\[D\left( h \right) =\frac{1}{\pi \alpha ^2\cos ^4\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}}
\]

關於球面座標的pdf是這樣的:

\[p_h\left( \theta ,\phi \right) =\frac{\sin \theta}{\pi \alpha ^2\cos ^3\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}}
\]

同理,\(\phi\)可以被均勻地取樣。\(\theta\)的pdf應該是這樣的

\[p_h\left( \theta \right) =\frac{2\sin \theta}{\alpha ^2\cos ^3\theta}e^{-\frac{\tan ^2\theta}{\alpha ^2}}
\]

\(\theta\)的CDF可以這樣計算:

\[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)}
\]

解決\(P_h(\theta)= \epsilon\)的方程可以得到以下解決方案。

\(\theta =\mathrm{arc}\cos \sqrt{\frac{1}{1-\alpha ^2\ln \left( 1-\epsilon \right)}}\) or \(\theta =\mathrm{arc}\tan \sqrt{-\alpha ^2\ln \left( 1-\epsilon \right)}\)

Blinn取樣

這裡是Blinn的NDF:

\[D\left( h \right) =\frac{\alpha +2}{2\pi}\left( \cos \theta \right) ^{\alpha}
\]

關於球面座標的pdf是:

\[p_h\left( \theta ,\phi \right) =\frac{\alpha +2}{2\pi}\left( \cos \theta \right) ^{\alpha +1}\sin \theta
\]

分離\(\phi\)可以得到以下結果:

\[p_h\left( \theta \right) =\left( \alpha +2 \right) \left( \cos \theta \right) ^{\alpha +1}\sin \theta
\]

這個比前兩個簡單多了,這是CDF:

\[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}
\]

以下是經典隨機數與\(\theta\)之間的關係

\[\theta =\mathrm{arc}\cos \left( \left( 1-\epsilon \right) ^{\frac{1}{\alpha +2}} \right)
\]

由於\(\epsilon\)是一個經典的隨機數,\(1-\epsilon\)也是一個。因此,我們可以用下面的方程式來簡化上述方程式。

\[\theta =\mathrm{arc}\cos \left( \epsilon^{\frac{1}{\alpha +2}} \right)
\]

關於這種抽樣方法,再多說一點。我對這個解決方案不太自信,儘管我看不出這個推導有什麼問題。PBRT(Physically Based Rendering: From Theory to Implemention 3rd)對Blinn給出了一個類似的解決方案,這就是:

\[\theta =\mathrm{arc}\cos \left( \epsilon^{\frac{1}{\alpha +1}} \right)
\]

而另一個開源的光線追蹤器Mitsuba也採用了這種取樣方式。我不太理解書中的推導,所以我就堅持用這個,也是這裡提到的那個。我試了一下pbrt的取樣方式,從圖片上可以看出只有微小的差別。

一個額外的步驟

還有一步沒有完成。我們感興趣的是入射方向的取樣,而不是法線。我們之所以直接對法線而不是入射方向進行取樣,是因為NDF通常是microfacet模型中的主導因素。在對法線取樣後生成入射方向是比入射方向本身取樣更有效的方法。

然而,我們計算給定入射方向的PDF的方式與上述尊重半向量的方式不同,無論是實體角還是球面座標。到目前為止,我們所擁有的是半向量的PDF,一個轉換是必要的。

\[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)}
\]

結論

下面是新的取樣方法之後和之前產生的影象。

64spp,GGX被選為NDF,三隻猴子的粗糙度值不同(0.0,0.5,1.0)。從圖中我們可以看到,最左邊的猴子得到的結果比預設的取樣方法好得多。對於其他兩隻猴子,我們用餘弦-pdf取樣方法得到了類似的結果。

已經有一些研究工作改進了這個部落格中提到的取樣方法。一旦我有一些空閒時間,我可能需要試試他們的方法。

本文後續

原文的翻譯到這裡就結束了,來看看用了重要性取樣後的作業7對比吧!

第一幅圖的粗糙度因為接近於0,可以看到略微的鏡面效果,但是不如第二張(去掉漫反射項)明顯

請忽略第二幅圖,球體中對映燈光為全黑,我仍在查詢這個問題的solution

擴充套件閱讀

引用