在之前的文章里面,我們介紹了Cook-Torrance BRDF,這是一種常見的用於表現PBR的光照模型。今天我們想要解決的問題是,在該BRDF下,給定物體材質的粗糙度(roughness),該如何生成符合該粗糙度的采樣方向呢(這對於路徑追蹤采樣生成入射光、IBL算法中采樣計算radiance都很重要)?
法向分布函數(NDF)
對GGX的采樣主要是針對它的法向分布函數NDF來進行的。在之前的文章中,我們曾經簡單地介紹過法向分布函數的概念,它是一個用來描述微面元模型中各個微面的法向分布密度的函數。該函數實際的意義是當前點的微表面(microfacet)的面積除以宏表面(macrofacet)的面積,然后再除以立體角,所以NDF的單位是立體角分之一。
但是如果直接對NDF針對立體角dw積分的話,得到的結果其實並不是1,也就是說NDF實際上並不是法線的概率密度函數。
真正的歸一化公式如下:
\(\LARGE \int D(m)cos(\theta_m)d\omega=1\)
其中D是法向分布函數,m是某個微面元的法向,\(\theta_m\)則是微面元的法向和宏觀表面法向的夾角,\(\omega\)是該微面元所屬的立體角。這個公式其實就是將微面元的面積映射到了宏表面上,如下圖所示:

也就是說,如果上面的積分中沒有這個\(cos\theta\),那么得到的其實是微表面面積之和和宏表面之比。
更詳細的理論推導可以參考這篇文章:How Is The NDF Really Defined?
通過上面的公式可知,\(D(m)cos(\theta_m)\)才是真正關於微表面法線的概率密度函數。
關於GGX的重要性采樣
知道了概率密度函數p,我們就可以根據它進行采樣。在這里我們以GGX的NDF為例。
GGX的NDF形式如下:
\(\large{NDF-GGX(n,h,\alpha)=\frac{{\alpha}^2}{\pi {( {cos\theta}^2 ({\alpha}^2 - 1) + 1)}^2}}\)
將它轉換為球坐標系的概率密度函數為:
\(\large{p(\theta,\phi)=\frac{{\alpha}^2 cos\theta sin\theta}{\pi {( {cos\theta}^2 ({\alpha}^2 - 1) + 1)}^2}}\)
求\(\theta\)和\(\phi\)的邊緣概率密度函數,得:

進一步求得\(\theta\)和\(\phi\)的CDF:
\(\LARGE P_h(\phi)=\frac{\phi}{2\pi}\)

設兩個[0,1]之間的隨機數\(\xi\)和\(\epsilon\)分別對應\(P_h(\phi)\)和\(P_h(\theta)\),可以解得(其實用得就是逆方法):
\(\LARGE \phi = 2\pi\xi\)
\(\LARGE \theta = arccos\sqrt{\frac{1-\epsilon}{\epsilon(\alpha^2 - 1) + 1}}\)
可以看到UE4中的GGX采樣也是用該思路來計算的:

