目錄
- 序言
- 雙向路徑追蹤
- 原理
- 計算
- 實作細節
序言
Veach大佬的博士論文是渲染領域的一篇經典之作,雖然這篇文章發表于20多年前,但直到今天,仍有不少新文章在參考,Veach在文章中詳細推演了路徑追蹤,雙向路徑追蹤,多重重要性采樣等基于物理渲染領域的核心技術,并給出了簡潔的實作思路,
雙向路徑追蹤
原理
前置的路徑追蹤原理本文就不多說了,網上相關的博客一大堆,

雙向路徑追蹤分別從螢屏和光源各自追蹤一條子路徑,例如上圖中路徑\(x_0 x_1\)就是從光源追蹤的一條子路徑,我們稱之為“光源子路徑”(light-subpath),同理,路徑\(x_4 x_3 x_2\)是“視線子路徑”(eye-subpath),虛線表示“陰影路徑”(shadow-path),如果陰影路徑沒有被任何物體遮擋,那么我們稱\(x_1\)和\(x_2\)可見,即路徑\(x_0 x_1 ... x_4\)是從光源到螢屏的一條可行的路徑,

而對于一條可行的路徑,光源子路徑和視線子路徑是可以人為劃分的,如上圖,對于一條長為2的路徑,有4種不同的劃分方式,根據s、t的不同,我們將子路徑對記為\(\bar{x}_{s,t}\),
有意思的地方在于,對于一對比較長的子路徑對(例如之前的路徑\(x_0 x_1 ... x_4\),或者表示為\(\bar{x}_{2,3}\)),沒有必要一定選擇\(x_1 x_2\)作為陰影路徑,也可以選擇\(x_1 x_3\),這樣就生成了新的子路徑對\(\bar{x}_{2,2}\),同理,我們可以復用這些點產生多組不同的子路徑對,而這些子路徑對都會對像素的顯示產生貢獻,根據多重重要性采樣原則,對其進行加權平均,即可得到最終的像素值,
其中\(f_r(\bar{x}_{s,t})\)是路徑中每個點的BSDF的乘積,而\(p_{s,t}(\bar{x}_{s,t})\)則表示選擇出這條路徑的概率密度,由于在路徑上每個點選擇下一個方向是相互獨立的,所以這個值也可以用每個點處對應方向的概率密度之積表示(陰影路徑是特殊情況,之后會有分析),\(w_{s,t}(\bar{x}_{s,t})\)則是和路徑相關的權重值,權重值會有不同的選擇策略,
計算
我們記:
\[C_{s,t}^*=\frac{f_r(\bar{x}_{s,t})}{p_{s,t}(\bar{x}_{s,t})} \]那么有:
\[F=\sum_{s\ge0}\sum_{t\ge0}w_{s,t}C_{s,t}^* \]根據以上分析,不難看出\(C_{s,t}^*\)可以寫成如下形式
\[C_{s,t}^*=\alpha_s^Lc_{s,t}\alpha_t^E \]其中\(\alpha_s^L\)只與光源子路徑有關,\(\alpha_t^E\)只與視線子路徑有關,\(c_{s,t}\)只與陰影路徑有關,同時也可以遞進的算出\(\alpha_i^L\)和\(\alpha_j^E\),下面以路徑\(y_0y_1...y_{s-1}z_{t-1}...z_1z_0\)為例:
\[\begin{align*} \alpha_0^L&=1\\ \alpha_1^L&=\frac{L_e(y_0)}{P_A(y_0)}\\ \alpha_i^L&=\frac{f_s(y_{i-3}\to y_{i-2}\to y_{i-1})}{Pdf(y_{i-2}\to y_{i-1})}\alpha_{i-1}^L,\text{for }i\ge 2 \end{align*} \]同理有:
\[\begin{align*} \alpha_0^E&=1\\ \alpha_1^E&=\frac{W_e(z_0)}{P_A(z_0)}\\ \alpha_i^E&=\frac{f_s(z_{i-1}\to z_{i-2}\to z_{i-3})}{Pdf(z_{i-2}\to z_{i-1})}\alpha_{i-1}^E,\text{for }i\ge 2 \end{align*} \]其中\(L_e\)表示光源的自發光,\(W_e\)表示攝像機類似于光源發光的一種屬性(我暫且設定為1),\(P_A(y_0)\)表示在光源面上取到點\(y_0\)的概率,\(P_A(z_0)\)同理,
\[\begin{align*} c_{0,t}&=L_e(z_{t-1}\to z_{t-2})\\ c_{s,0}&=W_e(y_{s-2}\to y_{s-1})\\ c_{s,t}&=f_s(y_{s-2}\to y_{s-1}\to z_{t-1})G(y_{s-1}\to z_{t-1})f_s(y_{s-1}\to z_{t-1}\to z_{t-2}),\text{for }s,t>0 \end{align*} \]至此,我們已經完成了\(C_{s,t}^*\)的計算,接下來我們計算\(w_{s,t}\),無論使用哪一種權重策略,我們都要計算如下值:
\[p_i=p_{i,s+t-i}(\bar{x}_{s,t}) \]以\(\beta=2\)的指數啟發式平衡為例子:
\[w_{s,t}=\frac{p_s^2}{\sum_i p_i^2}=\frac{1}{\sum_i (\frac{p_i}{p_s})^2} \]所以事實上我們只用計算\(p_i\)相對于\(p_s\)的值就好了,然而\(p_i\)和\(p_{i+1}\)之間的關系我們很容易得到,這兩者之間唯一的區別就是\(x_i\)這個點是如何得到的,對于\(p_i\),它屬于視線子路徑;對于\(p_{i+1}\),它屬于光源子路徑,其他的點的生成方法沒有區別,所以可以得到以下關系:
\[\begin{align*} \frac{p_1}{p_0}&=\frac{P_A(x_0)}{Pdf(x_1\to x_0)G(x_1\to x_0)}\\ \frac{p_{i+1}}{p_i}&=\frac{Pdf(x_{i-1}\to x_i)G(x_{i-1}\to x_i)}{Pdf(x_{i+1}\to x_i)G(x_{i+1}\to x_i)}\\ \frac{p_{s+t}}{p_{s+t-1}}&=\frac{Pdf(x_{s+t-2}\to x_{s+t-1})G(x_{s+t-2}\to x_{s+t-1})}{P_A(x_{s+t-1})} \end{align*} \]這樣一來,我們就能計算出最終的像素值了,
實作細節
(等待更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/283152.html
標籤:其他
