2020年4月30日 星期四

importance sampling (重點採樣)


  • 前言
在 淺談 physically based rendering (1) 所提到的 rendering equation 




從算式可以得知,實作間接光需要去處理 Surface integral over hemisphere (半球積分)。

因此在繼續實作間接光時,必須先理解積分的基本運算。

積分的基本方法大致上在 Monte Carlo method (蒙地卡羅積分法) 都有提到。

本章將深入討論 Monte Carlo method 在渲染領域的應用,

以方便理解在之後的實作部分所做的任何運算。


  • Monte Carlo method
複習一下在 Monte Carlo method (蒙地卡羅積分法)  提到的 Monte Carlo Estimator

函數 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 (重點採樣) 可以運用在許多領域上,

在渲染領域上主要是用來計算光線接觸到 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 軸的夾角,範圍在 0φπ

θ : 和 z 軸的夾角,範圍在 0 θ π。但反射光的方向在 hemisphere 內, 範圍在 0 θ π/2

Spherical Coordinates 對應的三維座標 (x,y,z) 為

x = γ * sinθ * cosφ
y = γ * sinθ * sinφ
z = γ * cosθ
0φπ






111111ρ0瞭解了 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