2016/10/09

無偏差( unbiased)算圖的真相

原文 / the truth about unbiased rendering
作者 / ChaosGroup lab
編譯 / Hammer Chen

多年來,大家都在爭執到底是偏差式算圖(biased)或是無偏差式算圖(unbiased)哪個比較好。『無偏差式的算圖』這個詞已被用了許多次了,幾乎等於精確算圖的代言人。事實上幾乎所有的算圖器其實多多少少都帶有偏差,即使是那些宣稱是無偏差的算圖器。 因為偏差式算圖真的比較快,更智慧,也不代表就不精確。為了要更了解這點,我們分成幾個方面來了解:



什麼是偏差的算圖
基本上『無偏差算圖』表示計算時完全沒有用到任何偷吃步,所有的射線(ray)都對等地看待。因此,沒有哪個射線比較重要或是比較不重要,因此,就必須要計算大量的射線才能產生乾淨的結果。無偏差算圖最好的描述可看Vlado在Chaos Group官方論壇的說法:
理論上,計算某積分(本例為渲染方程式)的無偏差方法如果你以相同的輸入資料(例如3D場景)跑了很多次,將會給你平均正確地結果(最終影像)。 即便是每個各別的結果本身具有很大錯誤(例如雜訊), 這表示當你執行夠多次演算法時,平均的結果,你可以得到正確的影像。你可以想像一下在VRay裡面就是漸進試採樣(progressive sampler)用這種方式讓影像雜訊變少 ,每個單獨的影像帶有很多雜訊, 但是夠多的次數平均下來,得到乾淨的結果。
因此,你應該會認為漸進式算圖是『無偏差的』。其實不正確,有很多偏差的偷吃步讓算圖器能夠加速算圖,可是還是保有漸進式路徑追蹤(progressive path tracer),這樣的最佳化可是用戶可控制的設定,或是根本藏起來讓你看不到。如果你用的算圖軟體的射線追蹤器(raytracer)很快,那麼很有可能是偏差的算圖器,而偏差的程度就根據射線追蹤器的軟體開發者,或是用戶可用的設定有關。如果射線追蹤器顯露出很多偏差的設定給用戶選擇或是讓您可以關閉,那麼用戶就要自覺這樣的設定可能產生的效用。

對無偏差算圖的常見迷思
如果你有讀過大家在吵什麼,你會發現裡面其實有很多關於無偏差算圖的迷思,以下是我發現常見的:
  • 無偏差算圖是物理精確的 - 無偏差算圖並不表示物理精確,反之也不表示偏差算圖是物理不精確的。兩者都是不精確的 。例如在Blinn使用BRDF或是GGX這樣的概念本身就只是真實世界材質的逼近方法而已。關鍵在於怎樣的方法可以達到物理上合理的方法,更快速地完成算圖。下面會詳細說明
  • 無偏差表示更少的設定- 僅僅因為算圖有比較少設定不代表算圖引擎就是無偏差的,很多算圖引擎的偏差設定是寫在程式碼裡面,沒有暴露出參數供用戶調整
  • 蠻力法的GI = 無偏差的算圖 很多人認為如果你用某些方法計算全局照明(Global Illumination)然後使用快取資料 這樣就是偏差算圖, 事實上快取的GI資料是偏差的, 而蠻力法GI也是偏差的
  • 路徑追蹤是無偏差的 很多偏差的偷吃步同樣可以用在路徑追蹤,所以這也不是正確的說法
怎樣會讓算圖引擎變成偏差式的?
讀到這裡你可能會想,要怎樣會讓算圖由無偏差變成偏差的呢? 有哪些偷吃步會造成這樣? 有很多常見的技巧,有些技巧參數會暴露給用戶調整,例如V-Ray提供給使用者選擇哪些偷吃步使用 ,以及使用到什麼程度,怎樣可以簡化介面或是讓用戶以為這套算圖引擎是無偏差的(譯者註:這裡指的是VRay 2.4升級至3.0時出現的default, advance, expert切換選單,請見VRay 3.0 Beta Review實測報告
  • 定義光線反彈的次數 無偏差的表示光線會具有無限次數地反彈直到場景完全地吸收光線為止
  • 使用快取 這樣的快取可以用內差的方式解決複雜的光線追蹤問題,例如帶有100s反彈的全局照明(Global Illumination) 或者計算焦散。這些是偏差的方法能夠加速解算 或者顯著地允許更多的光線反彈次數
  • 自適應採樣 這個方法增加場景中重要區域射線的權重,例如場景中有光線的區域 GI快取的資料顯示為重要的GI貢獻區域,偏好這些地方的光線
  • 壓抑或是移除焦散射線 這是很多渲染器很常見的作法, 因為焦散需要耗費大量的計算資源
  • 切頭尾(Truncating,clamping)或是減少某些射線的強度 能夠減少螢火蟲效應(fireflies, 譯註:過亮的白點) 這是一個常見技巧, 例如反射模糊的射線,通常可以隨機地捕捉到非常亮的光源,藉由對二級射線(secondary rays)去頭尾(clamping) 你就可以減少強度過高的點(也就是所謂的螢火蟲)
  • 事實上 任何一種的去頭尾 或是容忍度值或是閥值來決定是否繼續追蹤某路徑 再次地 這樣的繼續能夠減少計算 也能加速您的算圖

怎樣才正確 偏差或是不偏差的?
要注意的是這些技巧, 並不表示偏差式的方法是不準確的。精確的,或是物理上準確的。以下是引用Vlado在Chaos Group論壇上說的話:
我最近很難過地發現有很多人以為無偏差的這個詞表示,物理精確的 偏差的就從某種角度是物理不精確。 而事實上,這兩個此之間的關係就跟精確性(precision)與準確性(accuracy)在科學上的用法很類似,無偏差的計算具有很高的精確性, 但是不代表任何準確性(準確性表示跟實際正確的結果接近的程度) 反之亦為真。 偏差的計算也可能相當正確(例如接近實際的結果)但通常是不精確
(譯者註:用以下圖表說明應該會比較清楚精確與準確的差異,中文用詞很容易讓人頭暈!取自www.shmula.com網站)

因此偏差式的算圖事實上可以是物理準確的, 在大部分情況, 能夠達到正確的結果。 如果目標是在越短時間內, 最終影像很接近物理正確的, 那麼你就需要偏差式的算法。 如果你必須要確認所有可能的射線, 即便是眼睛無法察覺差異的, 那麼你就需要無偏差的算法

哪個比較好 偏差的或是無偏差的?
正如我們已經確認了,大部分的算圖器使用偏差式的方案,即便其對外宣稱是無偏差的。 如果這些軟體沒有這樣做, 那麼算圖會變得超級慢。 偏差的引擎非常智慧, 會用最有效率的方式取得正確影像。 事實上, 你可以說大部分無偏差的算圖器非常沒效率

在學術論文裡面,無偏差這個詞聽起來比偏差式的高尚,因為無(-un) 表示無限制。但說來有趣,如果把無偏差換成「蠢」 偏差的換成「智慧」, 還是有道理

長話短說,如果你真的是在做科學物理計算,你有很強的電腦,很多時間,那麼無偏差式的算圖可能就適合你。如果你對物理上合理的影像感興趣, 偏差式的算圖可以讓你更快地達到目標 。很有可能你已經這樣做了不論你是用哪套算圖引擎(譯者註:暗示大部分的算圖引擎實際上都是偏差式的)

好吧! 所有其實都是偏差式的 但我想要更少設定參數
你可以暴露出設定來決定多偏差或是隱藏那些參數, 這也就是為什麼V-Ray會有這麼多參數 ,因為不同用戶會有不同需求 。最近的幾個版本 ,你會發現我們已經跨出一大步減少設定參數, 這也是為什麼只有當你切換到進階“advanced”或是專家“expert.”模式才會看到許多V-Ray的設定。 我們也在努力減少V-Ray需要手動調整的部份, 因此如果用戶希望載入場景 ,按下一兩個按鈕就算圖,也可以。

在最近幾版的V-Ray 會刻意忽略用戶的設定(例如燈光或材質的細分值),因為這事實上會讓算突變慢 。很多用戶以新版的V-Ray開啟舊場景, 發現算圖變得非常快, 這是因為V-Ray的核心已經大規模地加速算圖 ,忽略舊版的設定對於算圖速度上有很大的效應。好的是大部分狀況,現在的V-Ray你只需要控制三個參數,以下影片Vlado解釋了他的通用設定,幫助用戶加速場景,而且只動了幾個參數而已:

事實上,影片裡面Vlado指出的設定現在已經變成V-Ray的預設值了。所以大部分的用戶只需要開啟場景,用預設值 ,不需要調整參數就能得到很棒的算圖結果了

V-Ray其實可以變成真正的無偏差算圖
這樣做,你就可以真正地看到偏差與無偏差的差異 ,除此變得超級慢之外, 你會發現用戶不會得到兩者有任何明顯差異的結果。

結論: 偏差的算法可行 ,這也是為什麼大家都在用
再次 我們引用John Carmack的睿智說法, 他說了我想要說的話, 只要把以下的最佳化改成偏差
當今有很多工作正在進行 這也就是影像算圖尖端科技的所在 你要如何優化路徑追蹤 能不同的情況下更有效率地計算 但總是你想做的事做近似值計算 這種解決事情的方法 是相當有用的

No comments: