GGX重要性采样
在之前的文章里面,我們介紹了Cook-Torrance BRDF,這是一種常見的用于表現PBR的光照模型。今天我們想要解決的問題是,在該BRDF下,給定物體材質的粗糙度(roughness),該如何生成符合該粗糙度的采樣方向呢(這對于路徑追蹤采樣生成入射光、IBL算法中采樣計算radiance都很重要)?
法向分布函數(NDF)
對GGX的采樣主要是針對它的法向分布函數NDF來進行的。在之前的文章中,我們曾經簡單地介紹過法向分布函數的概念,它是一個用來描述微面元模型中各個微面的法向分布密度的函數。該函數實際的意義是當前點的微表面(microfacet)的面積除以宏表面(macrofacet)的面積,然后再除以立體角,所以NDF的單位是立體角分之一。
但是如果直接對NDF針對立體角dw積分的話,得到的結果其實并不是1,也就是說NDF實際上并不是法線的概率密度函數。
真正的歸一化公式如下:
(LARGE int D(m)cos( heta_m)domega=1)
其中D是法向分布函數,m是某個微面元的法向,( heta_m)則是微面元的法向和宏觀表面法向的夾角,(omega)是該微面元所屬的立體角。這個公式其實就是將微面元的面積映射到了宏表面上,如下圖所示:
也就是說,如果上面的積分中沒有這個(cos heta),那么得到的其實是微表面面積之和和宏表面之比。
更詳細的理論推導可以參考這篇文章:How Is The NDF Really Defined?
通過上面的公式可知,(D(m)cos( heta_m))才是真正關于微表面法線的概率密度函數。
關于GGX的重要性采樣
知道了概率密度函數p,我們就可以根據它進行采樣。在這里我們以GGX的NDF為例。
GGX的NDF形式如下:
(large{NDF-GGX(n,h,alpha)=frac{{alpha}^2}{pi {( {cos heta}^2 ({alpha}^2 - 1) + 1)}^2}})
將它轉換為球坐標系的概率密度函數為:
(large{p( heta,phi)=frac{{alpha}^2 cos heta sin heta}{pi {( {cos heta}^2 ({alpha}^2 - 1) + 1)}^2}})
求( heta)和(phi)的邊緣概率密度函數,得:
進一步求得( heta)和(phi)的CDF:
(LARGE P_h(phi)=frac{phi}{2pi})
設兩個[0,1]之間的隨機數(xi)和(epsilon)分別對應(P_h(phi))和(P_h( heta)),可以解得(其實用得就是逆方法):
(LARGE phi = 2pixi)
(LARGE heta = arccossqrt{frac{1-epsilon}{epsilon(alpha^2 - 1) + 1}})
可以看到UE4中的GGX采樣也是用該思路來計算的:
總結
- 上一篇: [转载]clover引导黑苹果iclou
- 下一篇: cstdlib库