- 前言
在 淺談 physically based rendering (1) 所提到的 rendering equation
從算式可以得知,實作間接光需要去處理 Surface integral over hemisphere (半球積分)。
因此在繼續實作間接光時,必須先理解積分的基本運算。
積分的基本方法大致上在 Monte Carlo method (蒙地卡羅積分法) 都有提到。
本章將深入討論 Monte Carlo method 在渲染領域的應用,
以方便理解在之後的實作部分所做的任何運算。
- Monte Carlo method
函數 f(x) 在區間 [a,b] 的 Monte Carlo Estimator
這裡我將積分範圍改成 [0, Ω] (Surface integral over hemisphere),
則函數 f(x) 的 Monte Carlo Estimator 為
若區間內的發生機率不同,則 Monte Carlo Estimator 可改寫成

p(xi) 是取樣點 xi 的 probability density function (簡稱 pdf)
根據 Law of Large Numbers (大數法則) 得知,當採樣數越多,越接近真實結果。
但實際上, 採樣數越多,計算的負擔也就越大。
回頭觀察 Monte Carlo Estimator ,積分值是由每個採樣點的 f(xi) / p(xi) 相加逼近。
這裡面勢必會存在某些採樣點 f(xi) / p(xi) 值對於最後的結果影響很小,
同樣地,也勢必會存在某些採樣點的 f(xi) / p(xi) 值對於最後的結果影響很大,
如果忽略那些影響小的參考點只計算影響較大的參考點部分,
這樣求出來的積分近似值應該不會和真實結果差距太大,且可以減少計算量。
因為只採樣影響大的點,所以又叫做 importance sampling (重點採樣)。
知道了 importance sampling,就下來就是要知道如何找出影響大的採樣點。
這其實可以從使用的 pdf 的分佈形狀來判斷。

圖片來源 : Wojciech Jarosz's Dissertation Appendix A
若 pdf 和 f 的分布形狀越接近,表示可以使用越少的採樣點來逼近積分結果。
反之,兩者形狀差異越大,就需要更多的採樣點來計算積分結果。
因此如何找到一個合適的 pdf 會是實現 importance sampling 的重要課題。
知道了 importance sampling,就下來就是要知道如何找出影響大的採樣點。
這其實可以從使用的 pdf 的分佈形狀來判斷。

圖片來源 : Wojciech Jarosz's Dissertation Appendix A
若 pdf 和 f 的分布形狀越接近,表示可以使用越少的採樣點來逼近積分結果。
反之,兩者形狀差異越大,就需要更多的採樣點來計算積分結果。
因此如何找到一個合適的 pdf 會是實現 importance sampling 的重要課題。
- 渲染關聯運用
importance sampling (重點採樣) 可以運用在許多領域上,
在渲染領域上主要是用來計算光線接觸到 Microsurface (微平面) 後的反射方向。
如果接觸的 Microsurface 是完全平滑的話,
光線的反射位置會集中在一個方向(i.e. 鏡面反射)。
反之,反射的方向發散,且每個發散的方向強度不同。
在渲染領域上主要是用來計算光線接觸到 Microsurface (微平面) 後的反射方向。
如果接觸的 Microsurface 是完全平滑的話,
光線的反射位置會集中在一個方向(i.e. 鏡面反射)。
反之,反射的方向發散,且每個發散的方向強度不同。
因此在採樣反射光時,為了減少計算負擔,
同樣是選擇影響最大(強度最高)的來計算,來逼近真實效果。
同樣是選擇影響最大(強度最高)的來計算,來逼近真實效果。
- Importance sample GGX
在 淺談 physically based rendering (4) ,我使用了 GGX BRDF 作為單一方向光源的 PBR 模型,
為了保持一致性,在處理間接光時,也是使用 GGX BRDF,
因此,針對 GGX BRDF 的反射光採樣法就叫做 Importance sample GGX。
在繼續談論之前,先來了解一下 Spherical Coordinates (球面座標系)
圖片來源 : wikipedia
在 Spherical Coordinates 裡,會使用 3 個參數來代表其座標,寫作 (γ,θ,φ)
其中:
γ : 代表座標到圓心的距離,範圍在 γ ≥ 0,因為反射光的方向使用單位向量,所以可以省略
φ : x-y 平面和 x 軸的夾角,範圍在
θ : 和 z 軸的夾角,範圍在 0 ≤ θ ≤ π。但反射光的方向在 hemisphere 內, 範圍在 0 ≤ θ ≤ π/2
則 Spherical Coordinates 對應的三維座標 (x,y,z) 為
x = γ * sinθ * cosφ
y = γ * sinθ * sinφ
z = γ * cosθ
瞭解了 Spherical Coordinates 之後,回來看 GGX BRDF
因為可以從 D 項(normal distribution function)算出來的法線分布和入射光算出反射光的方向,
所以將焦點集中在 D 項上

為了之後採樣方便,我希望能將採樣的參數限制在 0 ~ 1,
並回傳 Spherical Coordinates 使用的 θ 和 φ 來表示法線的方向。
因此需要使用 Inverse transform sampling (逆變換採樣)來達到目的。
Inverse transform sampling 是透過函數的 pdf 來求得採樣函數。
根據 [4] 可以得知,D 項的 pdf 可以寫成

接著對 φ 積分來求得 θ 的 marginal density function (邊緣密度函數,簡稱 mdf)

再來算出 φ 的 conditional density function (條件密度函數)

最後,計算出 ph(θ) 和 ph(φ|θ) 的 cumulative distribution function (累積分布函數,簡稱 CDF)

到這裡,已經可以知道 θ 和 φ 的關係式為

由於 ξ1 和 ξ2 的範圍都在 0 ~ 1 之間,
因此我可以用一個 2 維的參數 (ξ1 , ξ2) 來取得一個 GGX 分布的法線向量。
這就是 Importance sample GGX
shader 實作的代碼如下
float3 importance_sampling_ggx(float2 xi, float roughness, float3 n) { float a = roughness * roughness; float phi = 2 * PI * xi.x; float costheta = sqrt((1.0 - xi.y) / (1.0 + (a * a - 1.0) * xi.y)); float sintheta = sqrt(1.0 - costheta * costheta); float3 h = 0; h.x = sintheta * cos(phi); h.y = sintheta * sin(phi); h.z = costheta; // 從 tangent space 轉換到 world space float3 up = abs(n.z) < 0.999 ? float3(0.0, 0.0, 1.0) : float3(1.0, 0.0, 0.0); float3 tx = normalize(cross(up, n)); float3 ty = cross(n, tx); return tx * h.x + ty * h.y + n * h.z; }由於 Spherical Coordinates 是屬 tangent space,
因此在實際使用上需要轉換成正常使用的 world space 才行。
- References
沒有留言:
張貼留言