practical path guiding

對于反射方程, L_i是一個“空間-方向”相關的入射輻射度,ppg算法在于學習入射光輻射的近似\hat{L}_i,并根據(jù)此對方向\omega_i進行采樣。然后因為沒有對bsdf進行采樣,后面可以對bsdf進行MIS。

ppg核心是一個迭代的學習機制:

  • 渲染過程劃分成M個pass,稱作“iteration”,
  • 每次都生成一個全新的,更強大的入射輻射近似\hat{L}^k_i.
  • \hat{L}^k_i的生成基于\hat{L}^{k-1}_i的引導。
    這種機制不僅在渲染早期有效,也避免了耗時的預計算

Spatial-Directional Tree SD樹

  • 上部是一個劃分空間域的二叉樹,
  • 下部是一個四叉樹,劃分方向域。

記錄radiance:
當路徑計算完成的時候,記錄路徑上的每一個點v上的radiance,在sd tree的葉子上t向。在分到樹上的時候,需要用最近鄰的filter。

每次迭代產(chǎn)生一張圖像I^k以及SD-tree \hat{L}^k_i。早期的圖片噪點很大,如果將每次迭代的平均起來噪聲更大,因此,不如丟棄早期的圖片。因此ppg的迭代機制:后一次迭代的sample數(shù)是前一次的兩倍。1+2+4+...+ 2^{M-1} = 2^M -1, 這是基本最后一次采樣數(shù)的兩倍。僅僅保留最后一次迭代的圖像。

第三節(jié)

ppg使用強化學習去構建一個入射光場的\hat{L}的近似表達。\hat{L}_i由一個SD-tree來描述,然后用幾何級增長的計算代價逐漸迭代提高;每次迭代均使用兩倍sample。

總是維護兩個SD-tree,一個用來引導light path的構建,一個用來收集入射輻射的MC估計:
在第k次迭代中,基于上一次的\hat{L}^{k-1}進行重要性采樣,然后將L(x, \omega)分發(fā)到\hat{L}^{k}。當?shù)趉次迭代結束時,丟棄\hat{L}^{k-1},使用\hat{L}^{k}的信息去準備一棵新的sd-tree \hat{L}^{k+1}去收集下次迭代中的MC估計。

3.1 收集L的估計

當一個完成的路徑組成之后,遍歷路徑的所有頂點,分發(fā)所有頂點的MC入射光輻射估計至\hat{L}^{k}.

對于頂點v,及其入射估計L(x_v,\omega_v), 首先進行一次空間位置查找,即在二叉樹中向下查找,找到包含x_v的葉子節(jié)點。這個葉子節(jié)點存儲了一個quad-tree的引用。quad-tree有兩個維度的參數(shù),刻畫了整個球面的方向;使用世界空間的柱坐標去保存面積比例(area ratios),當從primary到directional域進行轉換時。在quad-tree中按照方向域去遍歷,只進入包含了\omega_v的節(jié)點,并在下降遍歷的過程中,在所有經(jīng)過的節(jié)點中,保存L(x_v,\omega_v)。

當當前迭代中,所有的輻射估計都已經(jīng)被保存時,quad-tree的節(jié)點估計了所有節(jié)點quad對應的通過球面區(qū)域總入射輻射。在二叉樹葉子節(jié)點及其對應的quad-tree中采樣的所有空間位置中,他們的方向分布被averaged了。更多的,為了引導下一次迭代的路徑構建,這個信息也用于適配SD-tree的結構,以用于后面的估計的收集(在后面章節(jié)中介紹)

3.2 適應性的空間二叉樹

二叉樹的深度和結構,決定了輻射場空間近似的完善程度和適應性。

為了讓refinement更加直觀,我們交替使用x,y,z軸,永遠劃分在中間的節(jié)點。是否劃分節(jié)點由如下策略驅動:上一次迭代中,節(jié)點volume中記錄的,路徑頂點的個數(shù)。對于每個葉子節(jié)點,在path tracing的過程中,都有一個計數(shù)器。特別的,當一個節(jié)點至少有c\sqrt{2^k}個路徑頂點的時候,去劃分一個節(jié)點,其中2^k與第k次迭代追蹤的路徑數(shù)量成正比(section 3.4),c來自于quad-tree的分辨率,section 5.3中有詳細細節(jié)。細分之后,每一個葉子節(jié)點大致包含了c\sqrt{2^k}個路徑頂點。因此,所有葉子節(jié)點的總數(shù),正比與\frac{2^k}{c\sqrt{2^k}} = \frac{\sqrt{2^k}}{c}。這個閾值保證了葉子的總數(shù),以及,在迭代過程中,每個葉子節(jié)點的采樣數(shù)以\sqrt{2^k}增長。常數(shù)c用空間二叉樹分辨率換取了方向quad-tree的收斂。

如果僅根據(jù)采樣數(shù)的方法,來優(yōu)化tree,似乎很原始,他的性能還是不錯的,因為迭代式學習的分布,引導路徑至對圖像有高貢獻的區(qū)域;相對于低貢獻的區(qū)域,這些區(qū)域會進一步的得到優(yōu)化。用一個更粗糙的輻射函數(shù)近似區(qū)域,這些區(qū)中有更少的路徑是可以的,因為相對噪聲的增加通常被這些路徑更小的貢獻所抵消了。

3.3 適應性的directional quad-tree

除了劃分空間二叉樹,在每一次迭代結束的時候,也重構quad-tree,用以更好的反映學習到的空間輻射分布;這些新的quad-tree將用于在下次的地帶中收集估計。

每一個新的quad-tree的結構,由上次迭代中,收集的空間分布的flux驅動。為了達到這個目的,我們首先拷貝葉子節(jié)點舊的quad-tree,或者quad-tree的父節(jié)點(如果這個葉子節(jié)點是新的 )。

劃分拷貝的quad-tree的目的是讓每個葉子節(jié)點包含不超過原quad-tree1%的flux。具體的,向下遍歷舊quad-tree的節(jié)點,如果節(jié)點的flux大于quad-tree的flux的\rho=0.01
,就劃分節(jié)點。劃分節(jié)點是,我們分配一個四分之一的flux到新創(chuàng)建的孩子節(jié)點,然后遞歸的應用這個細分策略。同時,在每一個存在的內(nèi)部節(jié)點中估計細分策略 - 裁剪他的孩子節(jié)點如果策略不滿足。這樣,那些具有高入射flux的球面區(qū)域就可以有更高的分辨率。這種細分策略生成一個大致上等能量劃分的方向域。

在每次迭代之后重構quad-tree保證數(shù)據(jù)結構適應新收集到的數(shù)據(jù),其次內(nèi)存的使用也比較有效。閾值\rho控制使用了多少內(nèi)存,quad-tree節(jié)點的個數(shù)正比與1/\rho. 5.2節(jié)有詳細分析。

3.4 無偏的迭代式學習和渲染

為了加速學習,使用了類似Vorba的迭代機制:訓練一個序列\hat{L}^1, \hat{L}^2,\hat{L}^3 .... \hat{L}^M, 其中\hat{L}^1僅僅使用BSDF采樣去估計,對于所有k>1, \hat{L}^k則聯(lián)合\hat{L}^{k-1}以及BSDF,通過MIS去估計。從\hat{L}^{k-1}中采樣去估計\hat{L}^{k}通常擊打的加速了收斂。

對于給定路徑頂點v,使用\hat{L}^{k-1}采樣的方法如下。首先,在二叉樹中向下尋找,去找到包含頂點位置x_v的葉子節(jié)點。接著,從空間葉子節(jié)點的quad-tree中采樣一個\omega_v,采樣方法是啟發(fā)式采樣warping。

指數(shù)級采樣計數(shù)

如果在每次迭代中,使用相同的路徑采樣個數(shù),那么僅有一小部分樣本能夠對圖像直接產(chǎn)生貢獻,因為前面大部分的樣本僅僅用于學習入射輻射場。如果學習到的分布與公式2中分子成比例,那么這不會是個問題,在這種情況,一個單個樣本理論上就可以找到分子與pdf的scale因子。然而,我們的分布,只對入射輻射進行了近似,仍然需要在半球空間進行乘積計算(Lfcos)。因此,提出在每次迭代中以幾何級數(shù)的增加路徑采樣樣本個數(shù),即:對于第k次迭代,我們使用兩倍于k-1次迭代的樣本數(shù)。因此,學習\hat{L}^{k}比學習\hat{L}^{k-1}大概需要兩倍的時間,但是只有一半的方差。在實際應用中,由于迭代式的重要性采樣機制的積極效果,方差的減少通常更高。然而,在最壞的情形(迭代式學習無法加快收斂),僅有一半的樣本被浪費。

在每次迭代中,增倍樣本個數(shù)的另一個重要的特性是當考慮我們的空間細分機制。因為二叉樹葉子節(jié)點的空間細分將其空間一分為二,加倍樣本數(shù)保證了幾乎一樣的樣本數(shù)給到新的葉子節(jié)點中。因此,即使在局部,\hat{L}^{k}\hat{L}^{k-1}噪聲更少。

在線渲染預覽

為了給用戶快速的視覺反饋,我們使用當前迭代中的路徑樣本給出的漸進式顯示渲染的圖片。只要我們不在迭代之間混淆路徑樣本,圖像就是無偏的,因為在一次迭代過程中,所有的路徑樣本都是相互獨立的。

因為在每次迭代過程中,都是從頭開始渲染,即下一次循環(huán)開始的時候,圖像會突然有質量的下降。為了避免這種現(xiàn)象,當且僅當他聚集了比上次循環(huán)還多的樣本之后,再切換到當前迭代的圖像。

3.5 平衡學習和渲染

這里討論給定計算預算B,如何劃分學習和渲染,使得最終圖像方差最小。預算B可以定義為時間,或者樣本數(shù)。

對于第k次迭代,我們定義“單位房差預算(budget to unit variance)\tau_k = V_kB_k”,換句話說,第k次迭代路徑追蹤的圖像I_k的方差V_k和用于構建這些路徑的預算 B_k.方差V_k根據(jù)I_k像素平均方差計算得來,假定使用\hat{L}^{k}來引導路徑,直到達到預算B,那么最終圖像的方差V_k\hat{V}_k = \frac{\tau_k}{\hat{B}_k}。其中{\hat{B}_k}是從第k次迭代開始時,剩下的預算,即\hat{B}_k = B - \sum_{i=1}^{k-1}B_i.

這里的目標是找到最優(yōu)的迭代\hat{k},是的最終圖像方差最小,即\hat{k} = arg min_k \hat{V}_k。為了達到這個目的,假設訓練是單調(diào)遞減的回饋;更準確的,序列\tau_k是單調(diào)遞減以及凸,然后\hat{V}_k也是凸的。然后可以找到一個最小的k,使得\hat{V}_{k+1}>\hat{V}_k成立。如果我們需要估計\hat{V}_{k+1},我們需要多進行一次迭代,但是這浪費掉的計算大大超過我們自動預算機制帶來的方差的減少。

當給定一個目標方差的時候,我們可以使用一個類似的方法去最優(yōu)地平衡訓練和渲染。在這種情況,我們可以估計需要的渲染預算\bar{B} _k,通過\bar{B}_k = \tau_k/\bar{V},以達到目標方差的\bar{V}。當總預算,\tilde{B}_k>\tilde{B}_{k+1}時,訓練停止,其中\tilde{B}_k = \tilde{B}_k + \sum_{i=1}^{k-1}B_i。這樣,可能成功的找到\hat{k} = arg min_k \hat{B}_k,因為當\tilde{B}_k增加的時候,是凸函數(shù)。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容