Cosine-Weighted是一種對球面進行采樣的算法,常用於路徑追蹤時對入射方向進行采樣等領域。在介紹該算法之前,我們先來復習一下概率論的知識。
隨機變量之間PDF的轉換
假設有兩個隨機變量X和Y,它們的PDF為\(p_x(x)\)和\(p_y(y)\),假設我們已知\(p_x(x)\)以及Y=f(X),我們該如何推出\(p_y\)呢?PBRT第13.5小節中給出了推導關系:
\(\LARGE p_y(y)=|\frac{df}{dx}^{-1}| p_x(x)\)
當然前提必須是X和Y是一一對應的轉換關系,且\(\frac{df}{dx}\)不能小於0。
舉個例子,假設Y=sinX,X采樣在[0,1],且\(p_x(x)=2x\),那么可得:
\(\LARGE p_y(y)=\frac{2x}{cosx}=\frac{2arcsin y}{\sqrt{1-y^2}}\)
那么如果X和Y是多維的又該如何處理呢?假設X是n維的向量,其中Y=T(X),且T是雙射,那么他們之間的PDF關系如下:
\(\LARGE p_y(y)=\frac{p_x(x)}{|J_T(x)|}\)
其中\(J_T(x)\)是T關於X的雅克比矩陣。
另外,我們在之前的文章中曾經得到:
\(\LARGE d{\omega}=sin{\theta}d{\theta}d{\phi}\)
那么,在圍繞球面采樣時,因為:
\(\LARGE \int p(\theta, \phi)d\theta d\phi = \int p(\omega)d\omega\)
所以:
\(\LARGE p(\theta, \phi) = sin\theta p(\omega)\)
對球面的采樣
當我們獲得了一個頂點和它的法向,想去采樣得到一個方向時,一般來說有兩種針對球面的采樣方式:均勻采樣方法和Cosine-Weighted采樣方法。
均勻采樣方法是對球坐標系中的\(\theta\)和\(\phi\)隨機采樣,理論上所有的方向被采樣到的概率都是一樣的,均勻采樣的PDF c 可以簡單計算出:
除此之外,我們還可以使用Cosine-Weighted算法來進行采樣。
Cosine-Weighted采樣指的是立體角方向與豎直方向夾角的余弦值越高,那么該立體角被采樣得到的概率就越大的一種采樣方式。
我們設\(p(\omega)=c⋅cos\theta\)其中c是常數。
那么我們可以推導出:
因此\(\large p(\omega)=\frac{cos\theta}{\pi}\),那么\(\large p(\theta, \phi)=\frac{sin\theta cos\theta}{\pi}\)。
得到了概率密度函數后,就可以據此進行采樣了。
具體的采樣方法其實也非常簡單:在頂點所屬半球面的截面圓處隨機采樣一個頂點,然后把它投影到球面上,得到的必然是符合Cosine-Weighted分布的采樣:
如何證明這一點呢?在二維圓面上采樣可以獲得:\(\large p(r,\phi)=\frac{r}{\pi}\)(這個概率密度函數的計算可以見這篇文章中的圓面采樣),不難發現 sinθ = r,那么我們可以嘗試推導從\(p(r, \phi)\)到\(p(\theta, \phi)\)之間的轉換關系。
也就是\(\large (r,\phi)=(sin\theta, \phi) → (\theta, \phi)\),由此可得雅克比矩陣:
因此:
\(\LARGE p(\theta, \phi)=|J_T|p(r, \phi)=cos\theta \frac{r}{\pi}=\frac{cos\theta sin\theta}{\pi}\)
可以看到和我們前面推導出的\(\large p(\theta, \phi)\)是一模一樣的。因此用這種方法采樣肯定可以得到符合Cosine-Weighted分布的方向!