fend631 2008-5-25 01:12
Vray的全局照明(Global Illumination)演算法原理與比較
[url=http://hammerbchen.blogspot.com/2008/05/vrays-global-illumination-gi-methods.html]Vray的全局照明(Global Illumination)演算法原理與比較[/url]
[b][font=新細明體]引言[/font][/b]
[font=新細明體]即使沒有經過實際統計[/font] [font=新細明體]但毫無疑問地[/font][url=http://www.blogger.com/www.chaosgroup.com][b][color=#6699cc]Vray[/color][/b][/url][font=新細明體]是國內最多人使用的渲染器。[/font] [font=新細明體]有些人會說那是因為[/font]Vray[font=新細明體]是最容易[/font][font=新細明體]學、[/font][font=新細明體]最簡單的渲[/font][font=新細明體]染。[/font][font=新細明體]其實根本不是,[/font]Vray[font=新細明體]是在[/font][url=http://www.blogger.com/www.mentalimages.com][color=#6699cc]MentalRay[/color][/url][font=新細明體]、[/font][url=http://www.blogger.com/www.finalrender.com][color=#6699cc]FinalRender[/color][/url][font=新細明體]、[/font][url=http://www.blogger.com/www.splutterfish.com][color=#6699cc]Brazil[/color][/url][font=新細明體]、[/font][url=http://www.blogger.com/www.maxwellrender.com][color=#6699cc]Maxwell[/color][/url]…[font=新細明體]等眾多渲染器中最複雜的渲染器,原因很簡[/font][font=新細明體]單,[/font][font=新細明體]因為它除了一般常見的渲染引擎[/font]Qusi Monte-Carlo[font=新細明體]、[/font]Photon Mapping[font=新細明體]、[/font]Irrandiance cache ([font=新細明體]或稱[/font]Final gathering)[font=新細明體]外,[/font]Vray[font=新細明體]又多了[/font][b]Choas Group[/b][font=新細明體]專利的[/font]Light Cache[font=新細明體]演算[/font][font=新細明體]法。[/font]Vray[font=新細明體]渲染器明確地把光線反彈分為第一次反彈([/font]Bounce[font=新細明體])與[/font][font=新細明體]第二次反[/font][font=新細明體]彈,[/font][font=新細明體]第一次反彈有[/font]4[font=新細明體]種渲染引擎可供選[/font][font=新細明體]擇,[/font][font=新細明體]第二次反彈有[/font]3[font=新細明體]中渲染引擎可供[/font][font=新細明體]選[/font][font=新細明體]擇,[/font][font=新細明體]在不考慮原理之[/font][font=新細明體]下,[/font][font=新細明體]就有[/font]4x3=12[font=新細明體]中排列組合可供選[/font][font=新細明體]擇。[/font] [font=新細明體]雖然[/font]Vray[font=新細明體]預設有第一次渲染是用輻照映射([/font]Irrandiance cache[font=新細明體]),第二次反彈是用準蒙特卡羅演算法([/font]Qusi Monte-Carlo[font=新細明體]),[/font] [font=新細明體]但當要調整渲染引擎[/font][font=新細明體]時,[/font][font=新細明體]若不是實際了解這些演算法背後的原[/font][font=新細明體]理,[/font][font=新細明體]真的要調整使還是會使人一頭霧水。怎樣針對你的場景特性去調配第一次反彈的引擎與第二次反彈的引擎種類[/font]? [font=新細明體]這還真是不容易回答的問題。[/font]
[font=新細明體]這篇文章一開始的時候只是翻譯[/font]Vray[font=新細明體]的相關文[/font][font=新細明體]件,[/font][font=新細明體]但後來添加如[/font]Wikipedia[font=新細明體]的解釋名詞以及個人的理[/font][font=新細明體]解,[/font][font=新細明體]並順便將[/font][font=新細明體]相關知識補[/font][font=新細明體]齊,[/font][font=新細明體]所以最後是翻譯的內容與原創文章混雜在一起。參考文獻放在文章最後。其實[/font]Vray[font=新細明體]用[/font]first bounce[font=新細明體],[/font] second bounce[font=新細明體]這個用字是很容易誤[/font][font=新細明體]導,[/font][font=新細明體]不準確的用字。因為[/font]Bounce[font=新細明體]本身就暗示了演算法是基於光子映射([/font]Photon Mapping[font=新細明體])的光子在[/font][font=新細明體]場景中反彈。一開始總會[/font][font=新細明體]納悶為何[/font]Vray[font=新細明體]要把渲染搞的這麼麻[/font][font=新細明體]煩,[/font][font=新細明體]要提供這麼多選項[/font]?[font=新細明體]其實[/font]Vray[font=新細明體]只是把混合計算法這樣的概念明確寫出來罷了[/font]! [font=新細明體]就好像是[/font]MentalRay[font=新細明體]可以把[/font]Photon mapping[font=新細明體]與[/font]Final Gathering[font=新細明體]這兩種[/font][font=新細明體]計算法混合一[/font][font=新細明體]起使用,[/font]Vray[font=新細明體]也可以在第一次反彈[/font][font=新細明體]使用[/font]Photon mapping [font=新細明體]第二次反彈使用[/font]irrandiance cache[font=新細明體],就本質是上是與[/font]MentalRay[font=新細明體]完全相同。[/font]Finalrender[font=新細明體]則是比較賊的不明確告訴你它是由哪兩種計算法混合的[/font] [font=新細明體]其實這三個渲染器都是採用混合演算法。為什麼要用混合演算法呢[/font]?[font=新細明體]因為各種算法有其缺點也有其優點。簡單的說,把算法混在一起使用可以截長補短。在後面的翻譯文章會詳細介紹。[/font]
[b][font=新細明體]一、渲染器的[/font][/b][b][font=新細明體]歷史:[/font][/b]
[url=http://bp1.blogger.com/_V4SYpI93l98/SBwnQV3CjxI/AAAAAAAABJE/0xKkN_uSNyY/s1600-h/James+Kajiya.jpg][img]http://bp1.blogger.com/_V4SYpI93l98/SBwnQV3CjxI/AAAAAAAABJE/0xKkN_uSNyY/s320/James+Kajiya.jpg[/img][/url][font=新細明體]幾[/font][font=新細明體]乎所有現代全局照明渲染器都是基於[/font][url=http://research.microsoft.com/~kajiya/][color=#6699cc][b]Jim T. Kajiya[/b] [/color][/url][font=新細明體]在[/font]1986[font=新細明體]年所發表的那篇[/font]---[b][font=新細明體]渲染方程[/font][/b][b][font=新細明體]式[/font]([url=http://en.wikipedia.org/wiki/Rendering_equation][color=#6699cc]The Rendering Equation[/color][/url])[/b][font=新細明體]論文之上。這個方程告訴您光是如何在場景中傳播。在那篇論文當中,[/font]kajiya[font=新細明體]還提出了以圖像為基礎,利用蒙特卡羅方法的渲染方程式稱為[b]路徑追蹤[/b][/font][b](path tracing[/b][b][font=新細明體])[/font][/b][b][font=新細明體]。[/font][/b][font=新細明體]其實,這個方程式已經廣為人知,並使用在計算輻射在環境中的傳播有一段時間[/font][font=新細明體]了。然而,[/font]Kajiya[font=新細明體]是第一個將這套方程式應用到計算機圖形學當中的人。[/font]
[font=新細明體][/font]
[url=http://bp0.blogger.com/_V4SYpI93l98/SBwobF3CjyI/AAAAAAAABJM/IlhcL-ecRDw/s1600-h/James+Clerk+Maxwell.jpg][img]http://bp0.blogger.com/_V4SYpI93l98/SBwobF3CjyI/AAAAAAAABJM/IlhcL-ecRDw/s320/James+Clerk+Maxwell.jpg[/img][/url][font=新細明體]這個渲染方[/font][font=新細明體]程式只是一個“[/font][font=新細明體][b]計算電磁學的麥斯威爾([/b][url=http://en.wikipedia.org/wiki/James_Clerk_Maxwell][color=#6699cc]James Clerk Maxwell[/color][/url][b] )方程式的逼近版本"[/b]。它並不能模擬所有的光學現象。它只是基於幾何光學,因此無法模擬折射[/font][font=新細明體],干涉或兩極分化。不過,這個方程式很容易修改,使其能夠計算與波長有關的效應---[/font][font=新細明體]例如散射。(譯者[/font][font=新細明體]注: 這就是為什麼著名的渲染器要命名為Maxwell?)
[/font]
[font=新細明體]更哲學一點來說,這個[/font][font=新細明體]渲染方程式[/font][font=新細明體]是是一個數學模型用來描述光的行為。雖然對計算機圖形學來說這是一個很好的模型,它並未說明究竟光如何在現實世界中當中運動。例如,渲染方程式假定光[/font][font=新細明體]線是無窮的薄且認為光的速度是無限的[/font]---[font=新細明體]這兩個假設都不符合真實世界的光線。[/font]
[font=新細明體][/font]
[font=新細明體]因為渲[/font][font=新細明體]染方程是基於幾何光學的,[b]光跡追蹤[/b][/font][b](raytracing)[/b][font=新細明體]是一個用來求解渲染方程非常方便的方法。事實上,大部分渲染器在計算渲染方程式的時候都[/font][font=新細明體]是用光跡追蹤這個方法。[/font]
[font=新細明體][/font]
[font=新細明體]雖然渲染[/font][font=新細明體]方程式可能會有不同寫法,但[/font]Kajiya[font=新細明體]提出的方程式看起來像這樣:[/font][url=http://bp1.blogger.com/_V4SYpI93l98/SBwlBV3CjtI/AAAAAAAABIk/vnkbE09-vb0/s1600-h/The+Rendering+Equation.png][img]http://bp1.blogger.com/_V4SYpI93l98/SBwlBV3CjtI/AAAAAAAABIk/vnkbE09-vb0/s400/The+Rendering+Equation.png[/img][/url]
[font=新細明體][/font]
[font=新細明體]這個方程式的意思是:場景中, 光線由x點移動到另外一個點x1等於光線自x2移動到x1並且反射到x點的所有光線總合[/font]
[url=http://bp0.blogger.com/_V4SYpI93l98/SBwloF3CjuI/AAAAAAAABIs/v4mhwkA9lzQ/s1600-h/The+Rendering+Equation-02.png][img]http://bp0.blogger.com/_V4SYpI93l98/SBwloF3CjuI/AAAAAAAABIs/v4mhwkA9lzQ/s400/The+Rendering+Equation-02.png[/img][/url]
[font=新細明體][/font]
[font=新細明體][/font]
[font=新細明體]除了一些簡單的狀況之下,要無限長的計算時間電腦才有可能把這個方程式解出來。不過,我們可以盡量得到接近的結果---在可接受的計算時間裡面。科學家找尋能在合理的時間內完成計算的全局光照演算法。[/font]
[font=新細明體][/font]
渲染方程式只有一個。不同的渲染器只是用不同的解法去計算結果而已。如果任何兩個渲染器的計算結果精確度夠的話,那麼就應該渲染出完全一樣的結果才對。理論上是這樣啦,但實際上渲染器往往會截斷或是修改原始渲染方程式,因此可能計算出不同的結果。
[b]二、渲染引擎特性分類:[/b]
[b]A. 完全計算法(Exact)與估計值計算法(approximate)[/b]
[font=新細明體]如上所述,我們計算不完每條算式---始終會存在著一些計算誤差,雖然這些物非常小。某些渲染法,可以由使用者自行決定計算的精度(例如 GI的密度,或GI的射線數目,或是光子的數目等。然而這種做法有一個缺點,那就是使用者必須等待整個計算過程完成後才能知道最終的渲染品質是如何。另一個缺點是,使用者必須要經過很多嘗試才能知道如何在最少的時間內達到要求的品質。不過,這種方法有個大優勢,就是可以有效率地控制精度範圍,因為這種演算法能夠專注於困難的計算區塊(將渲染範圍分割成區塊,成為獨立區域,最後在將結果組合起來。[/font]
[font=新細明體][/font]
其他方法,是用漸進式(progressively)的方式進行渲染,這種方法在剛開始計算時誤差很大,但在每次新的演算後會把誤差縮小。在任何時間點,我們能獲得完整的渲染結果。因此,我們可以在計算途中終止渲染器的計算。
[font=新細明體][/font]
[b][font=新細明體]表一、完全計算法與估計值計算法比較表[/font][/b]
[url=http://bp3.blogger.com/_V4SYpI93l98/SB3KZl3Cj8I/AAAAAAAABKk/VdD-N-7myho/s1600-h/exact_approximate_GI_methods.jpg][img]http://bp3.blogger.com/_V4SYpI93l98/SB3KZl3Cj8I/AAAAAAAABKk/VdD-N-7myho/s400/exact_approximate_GI_methods.jpg[/img][/url] [font=新細明體][/font]
[b][font=新細明體]B. [/font][/b][b][font=新細明體]收集法([/font][/b]Gathering[b][font=新細明體])與發射法([/font][/b]shooting[b][font=新細明體])[/font][/b]
[b]
[/b][b][font=新細明體]發射法:[/font][/b]
[font=新細明體]自燈光開始發射光子到場景中。請注意,這種方法繼可以是完全計算法也可以是近似值計算法。 [/font]
[font=新細明體][/font]
[b][font=新細明體]收集法:[/font][/b]
[font=新細明體]由攝影機方向或是場景中的幾何體開始。請注意,收集法,既可以是完全計算法或是近似值計算法。[/font]
[b][font=新細明體]混合計算法:[/font][/b][b][font=Symbol][/font][/b]
[font=新細明體]將發射光子法與收集法兩個方法結合在一起使用[/font];[font=新細明體]混合計算法可以是完全計算或是近似值計算。[/font]
[font=新細明體][/font]
[b][font=新細明體]表二、收集法與發射法比較表[/font][/b]
[url=http://bp0.blogger.com/_V4SYpI93l98/SB3KZ13Cj9I/AAAAAAAABKs/88eeQH22xhA/s1600-h/shooting_gathering_GI_methods.jpg][img]http://bp0.blogger.com/_V4SYpI93l98/SB3KZ13Cj9I/AAAAAAAABKs/88eeQH22xhA/s400/shooting_gathering_GI_methods.jpg[/img][/url] [font=新細明體][/font]
[b][font=新細明體]C. [/font][/b][b][font=新細明體]收集法:[/font][/b]
[font=新細明體]收集方法和某些混合法可以是[/font][font=新細明體]與視角有關([/font]view-dependent[font=新細明體])或是與視角無關([/font]view-independent[font=新細明體])的計算法[/font][font=新細明體]。[/font]
[font=新細明體][/font]
[font=新細明體][b]表三、視角有關或是與視角無關的計算法比較表[/b][/font]
[url=http://bp1.blogger.com/_V4SYpI93l98/SB3KaF3Cj-I/AAAAAAAABK0/91d3z4yBVm0/s1600-h/view-dependent_independent_GI_methods.jpg][img]http://bp1.blogger.com/_V4SYpI93l98/SB3KaF3Cj-I/AAAAAAAABK0/91d3z4yBVm0/s400/view-dependent_independent_GI_methods.jpg[/img][/url]
[b][font=新細明體]三、[/font]Vray[/b][b][font=新細明體]當中所支援的[/font]GI[/b][b][font=新細明體]法[/font][/b]
Vray[font=新細明體]提供您不同的[/font]GI[font=新細明體]計算方法[/font]---[font=新細明體]完全計算法,近似值計算法,光子發射法及收集法。不同場景適合不同方法。[/font]
[b][font=新細明體]完全[/font]([/b]exact)[b][font=新細明體]計算法[/font][/b]
Vray[font=新細明體]支持兩種完全計算法:蠻力[/font]GI[font=新細明體]及漸進路徑追蹤法。兩者之間的差異,就是蠻力[/font]GI[font=新細明體]法能與傳統的影像組合演算法(區塊渲染)相互使用,而且是自適應的,而漸進路徑追蹤法,必須一次就把整個影像計算完畢並沒有任何自適應的功能。[/font]
[b][font=新細明體]近似值[/font]([/b]Approximate)[b][font=新細明體]計算方法[/font][/b]
Vray[font=新細明體]所有其他的方法(輻照映射,光快取,光子映射)都是近似值方法。[/font]
[b][font=新細明體]發射[/font]([/b]shooting)[b][font=新細明體]光子法[/font][/b]
[font=新細明體]光子映射法是[/font]Vray[font=新細明體]當中唯一的發射光子法。焦散效果也可以由光子映射法被計算出來,且能夠與收集計算法搭配使用。[/font]
[b][font=新細明體]收集[/font]([/b]gathering)[b][font=新細明體]計算法[/font][/b]
Vray[font=新細明體]所有其他的方法(蠻力[/font]GI[font=新細明體],輻照映射,光快取法)都屬於收集計算法。[/font]
[b][font=新細明體]混合法[/font][/b]
[font=新細明體]你可以在[/font]V-Ray[font=新細明體]當中的第一次反彈與第二次反彈中使用不同的計算法,你可以使用完全計算法或近似值計算法,光子發射法及收集計算法,完全依據您的需求。可能的組合列在[/font]GI[font=新細明體]範例中。[/font]
[b]V-Ray[/b][b][font=新細明體]提供您不同的計算法計算間接照明。讓你在[/font][/b][b][font=新細明體]品質和速度之間做取捨:[/font][/b]
[b][font=新細明體]A. [/font][/b][b][font=新細明體]蠻力法([/font]Brute force)[/b][b][font=新細明體][/font][/b]
[font=新細明體]蠻力法---或是翻譯成暴力法,這是最簡單的解算法;這個方法是經由獨立計算物體表面每一個陰影點([/font]shaded surface point)[font=新細明體]追蹤每個點上的半球面不同方向的射線所計算出來的間接照明。[/font]
[font=新細明體][/font]
[url=http://bp2.blogger.com/_V4SYpI93l98/SBwpSl3CjzI/AAAAAAAABJU/JFVAIba0ZsI/s1600-h/the+traveling+salesman+problem.gif][img]http://bp2.blogger.com/_V4SYpI93l98/SBwpSl3CjzI/AAAAAAAABJU/JFVAIba0ZsI/s200/the+traveling+salesman+problem.gif[/img][/url][font=新細明體]蠻力法是一種程式設計的撰寫風格,這種程式並不帶有任何投機取巧[/font][font=新細明體]的方法來改善計算效能,純[/font][font=新細明體]粹只是依賴的電腦努力的運算,嘗試所有的可能性,直至最終答案被計算出來。典型的例子是[b]旅行的推銷員難題[/b][/font]
[font=新細明體][size=100%][b]([/b][/size][/font][url=http://www.google.com.tw/url?sa=t&ct=res&cd=1&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FTraveling_salesman_problem&ei=8DMcSIP4GZiq6gO4mN3gCQ&usg=AFQjCNEfA00n4P_3ZzeyXfbVDphcPWrqxg&sig2=90ClrI4imeu5v7qLAZV4xQ][font=Verdana][size=100%][b]the [i]traveling salesman problem[/i][/b][/size][/font][/url][font=新細明體][size=100%][b])[/b][/size][/font] [font=新細明體]。假設推銷員需要到十個城市訪問。請問推銷員要怎樣的走法才能用最短的距離訪問所有的城市呢[/font]?[font=新細明體]蠻力法用的是最簡單的做法來求解[/font]---[font=新細明體]就是實際計算每一條可能的路徑,然後選擇其中最短的一個。這種方法不是很有效率,因為它並不是用有智慧的方法先過濾掉一些不可能的路徑。[/font]
雖然蠻力法用起來很愚笨,但它在軟體開發卻有它有用的地方。由於蠻力法最後可以保證得到正確的計算結果---儘管計算速度緩慢---但蠻力法可以用來測試其他快速演算法的精確度。
[font=新細明體]在計算機科學中,蠻力法或詳盡無遺的搜索也被稱作GT法(生成和測試)是一個看起來沒什麼,但可以廣泛應用的解算法,這種方法經由比對問題的陳述來找尋所有可能的答案。[/font]
[url=http://bp1.blogger.com/_V4SYpI93l98/SBwqHV3Cj0I/AAAAAAAABJc/eMf_bW4YCao/s1600-h/eight+queens+problem.png][img]http://bp1.blogger.com/_V4SYpI93l98/SBwqHV3Cj0I/AAAAAAAABJc/eMf_bW4YCao/s200/eight+queens+problem.png[/img][/url]例如,在考慮[b]八后[/b][b]([url=http://en.wikipedia.org/wiki/Eight_queens_puzzle][color=#6699cc]eight queens problem[/color][/url])[/b]問題時,要求把八個皇后放在一個標準西洋棋棋盤上,而且沒有皇后能夠攻擊其他皇后。蠻力法會研究所有的可能性---64! /56! = 178,462,987,637,760---也就是在64平方的位置上擺8個棋子,在每一個排列組合中,檢查是否沒有皇后能夠攻擊其他皇后。
[font=新細明體]蠻力法很容易設定,並會一定會找到解答,只要是這個問題是有解的。不過,問題越複雜往往會計算越久,在許多實際問題中,這種狀況往往隨著問題的複雜程度呈現倍數成長。因此,蠻力法通常應用於候選解答較少時,或是問題能有某些提示,可以用來減少候選的答案的數目。這種方法也可以用於速度比答案更重要的問題上。例如當問題的答案錯誤會導致產生非常嚴重的後果的時候。[/font]
[font=新細明體][/font]
[font=新細明體]蠻力法([/font]Brute Forc)[font=新細明體]在大部分的情況就等於[url=http://en.wikipedia.org/wiki/Quasi-Monte_Carlo_method][b][color=#6699cc]準蒙特卡羅演算法[/color][/b][/url][/font][url=http://en.wikipedia.org/wiki/Quasi-Monte_Carlo_method][b][color=#6699cc](Quasi Monte-Carlo)[/color][/b][/url][font=新細明體]也等於直接計算[/font](Direct Computing)[font=新細明體],雖然它們的本質還是有點不同。準蒙特卡羅演算法指的是一種取巧的隨機採樣的方[/font][font=新細明體]式,[/font][font=新細明體]主要是為了不計算所有算式[/font]([font=新細明體]母群體[/font][font=新細明體])[/font][font=新細明體],[/font][font=新細明體]而只考慮較少的採樣本。[/font][font=新細明體]蠻力法[/font][font=新細明體]要跟像是[/font]Photon Mapping[font=新細明體]、[/font] irrandiance cache[font=新細明體]這種算法相比[/font][font=新細明體]較,[/font][font=新細明體]後者多少有點取巧不計算所有的採樣[/font][font=新細明體]點,[/font][font=新細明體]後者是指計算部分採樣點其餘採插值計算。[/font][font=新細明體]蠻力法[/font][font=新細明體]則是乖乖地計算所有準蒙特卡羅產生的採樣點。換句話說是直接計算[/font]---Direct Computing[font=新細明體]。[/font]
[font=新細明體][/font]
[url=http://bp3.blogger.com/_V4SYpI93l98/SBwrM13Cj1I/AAAAAAAABJk/yTP9J3MCuWs/s1600-h/Quasi+Monte-Carlo.gif][img]http://bp3.blogger.com/_V4SYpI93l98/SBwrM13Cj1I/AAAAAAAABJk/yTP9J3MCuWs/s200/Quasi+Monte-Carlo.gif[/img][/url]準蒙特卡羅演算法(Quasi-Monte Carlo simulation)跟[url=http://en.wikipedia.org/wiki/Monte_Carlo_method][color=#6699cc][b]傳統蒙特卡羅演算法[/b][b](Monte Carlo)[/b][/color][/url]類似,只是與傳統蒙特卡羅演算法不同的是,準蒙特卡羅演算法使用準隨機序列(quasi-random sequences),而不是用隨機序列(random numbers)。這些序列是用來產生與我們要解決的問題有關的機率分布的代表性的採樣。準隨機序列,也被稱為[url=http://en.wikipedia.org/wiki/Low-discrepancy_sequences][color=#6699cc][b]低差異序列[/b][b](low-discrepancy sequences)[/b][/color][/url],在某些情況下可以改善傳統蒙特卡羅演算法計算時間過長的問題,準蒙特卡羅演算法能提供較短的計算時間/或更高的精度。
其實,低差異序列是完全確定性的,因此,準隨機會誤導人以為它是隨機的,其實並不是。低差異序列被用來取代均勻分佈的隨機序列。用“準”這個形容詞,其實是要強調這樣的序列既不是隨機也不是假隨機,但準隨機序列與隨機序列有某些共通性質,這種特性被應用在如準蒙特卡羅方法裡面,這樣的特性是準蒙特卡羅方法一個重要的優勢。
[font=新細明體]蒙特卡羅法[/font][font=新細明體],其實是一種通稱。蒙特卡羅法是一種隨機的技術---這種方法利用隨機率列和機率統計來解決複雜問題。[/font][font=新細明體]蒙特卡羅法被應用到各行各業中[/font][font=新細明體],從經濟學到核子物理,到交通車流調節。當然,不同研究領域的應用方法會不一樣,單就化學研究來說就有數十種不同的[/font][font=新細明體]蒙特卡羅演算法[/font][font=新細明體]。[/font]
[font=新細明體][/font]
[url=http://bp3.blogger.com/_V4SYpI93l98/SBwr913Cj2I/AAAAAAAABJs/zMlTa3hIJ9w/s1600-h/John+von+Neumann.jpg][img]http://bp3.blogger.com/_V4SYpI93l98/SBwr913Cj2I/AAAAAAAABJs/zMlTa3hIJ9w/s200/John+von+Neumann.jpg[/img][/url][font=新細明體]蒙特卡羅法源於美國在第一次世界大戰時研發原子彈的[/font]---[url=http://en.wikipedia.org/wiki/Manhattan_Project][color=#6699cc][font=新細明體][b]曼哈頓計畫([/b][/font][b]Manhattan Project)[/b][/color][/url][font=新細明體]。該計畫的主持人之一[url=http://en.wikipedia.org/wiki/John_von_Neumann][b][color=#6699cc]馮·諾伊曼[/color][/b][/url][/font][url=http://en.wikipedia.org/wiki/John_von_Neumann][b][color=#6699cc](John von Neumann)[/color][/b][/url][font=新細明體]用世界馳名的賭城[/font]---[font=新細明體]摩洛哥的蒙地卡羅[/font](Monte Carlo)[font=新細明體]來替這種方法命名[/font] [font=新細明體]為它蒙上了一層神秘色彩[/font]
[font=新細明體][/font]
[font=新細明體]使用蒙特卡羅法能讓我們研究相當複雜的物理模型難題,不用這種演算法我們幾呼無法解決的。要求解兩個原子之間的交互作用是相當簡單的[/font];[font=新細明體]一樣的方程式要解決數百或數千個原子交互作用是不可能算的出來的。使用蒙特卡羅法,我們可以對大系統做隨機採樣,而這些採樣足以描述整個複雜系統的行為。[/font]
[font=新細明體]計算全局光照的蠻力法,由於這種方法會計算每以個採樣點的GI數值,每一個點的計算是獨立的。雖然非常耗時,但這種方法非常準確,特別場景中的小細節都能表現出來。
為了加快蠻力法的計算,您可以與其他方法混合使用(光子映射或光快取)作為第二次GI反彈的計算法,而使用蠻力法作為第一次反彈的計算法。[/font]
[font=新細明體][/font]
[b]B. [/b][b][font=新細明體]輻照映射([/font]Irradiance map[/b][b][font=新細明體])[/font][/b]
[url=http://bp1.blogger.com/_V4SYpI93l98/SBwtdV3Cj3I/AAAAAAAABJ0/FomDVeVTAi0/s1600-h/final+gathering.jpg][img]http://bp1.blogger.com/_V4SYpI93l98/SBwtdV3Cj3I/AAAAAAAABJ0/FomDVeVTAi0/s200/final+gathering.jpg[/img][/url][font=新細明體]輻照映射[/font]---[font=新細明體]或翻譯成[b]發光貼圖[/b],相當於[b]MentalRay[/b]的[url=http://de.wikipedia.org/wiki/Final_Gather][b][color=#6699cc]Final Gathering最終收集[/color][/b][/url][/font][font=新細明體]。[/font][font=新細明體]這個方法是基於輻照快取([/font]irradiance caching[font=新細明體])[/font];[font=新細明體]基本上就是指計算場景中特定的採樣點,而場景中其餘的點做插值計算。[/font]
[font=新細明體]輻照指的是在[/font]3D[font=新細明體]空間某一點的光線,這個光線是自這個點四面八方反彈過來的。一般來說,場景中不同的點都有不同的輻照。不過,有兩個有用的限制條件,。第一種是表面輻照[/font]-[font=新細明體]這指的是位於物體表面的輻照。這是一個很自然的限制條件,因為我們通常對物體表面的照明有興趣。第二個限制是漫射表面的輻照值[/font]---[font=新細明體]等於光線到達這個點的光總量,不論這些光線是從哪裡來的。[/font][font=新細明體]簡單來說,其實物體表面的顏色其實就是他的表面輻照數值,如果這個材質是純白且完全的漫射[/font]
V-Ray[font=新細明體]的[/font][font=新細明體]輻照映射能夠有效地計算場景物體的表面輻照。因為場景中不是所有物體都有相同的間接照明細節,理所當然在有許多細節地方應該要有更精確的計算(例如兩個靠近的物體,或是有銳利陰影的地方,而在沒有細節的地方減低精確度(例如大型均勻的光照區域。因此輻照映射法是自適應的。這是經由多次pass才能實現的,每一次pass(每渲染所謂的及格率)解析度就增加一倍。這種做法就是一開始使用低解析度(例如1/4的最終影像解析度)然後慢慢增加到使用最高解析度。[/font]
[font=新細明體]其實輻照映射就是在3D空間(點雲)中點的集合,這些點包含了間接照明的資訊。在GI那個pass裡面,當一個物體光線擊中,[/font]V-Ray[font=新細明體]會判斷[/font][font=新細明體]輻照映射裡面是否有其他類似的點具有類似的方向與位置。從那些已經計算點,[/font]V-Ray[font=新細明體]可以提取點裡面的各種資訊(例如: 是否有物體靠近這裡,或是間接照明改變的有很明顯嗎…等)。根據這些訊息,[/font]V-Ray[font=新細明體]可以[/font][font=新細明體]決定,這個點的間接照明究竟是要其他已經建立好的輻照映射來做內插計算就好呢?還是不要做內插計算。如果不要,那就必須真的去計算這個點的間接照明並將資訊儲存在輻照映射當中。當進行實際渲染時,[/font]V-Ray[font=新細明體]採用非常複雜先進的插值方法得出場景中輻照映射的逼近值。[/font]
[b][font=新細明體]C. [/font][/b][b][font=新細明體]光子映射([/font]Photon map)[/b]
[url=http://bp2.blogger.com/_V4SYpI93l98/SBwuol3Cj4I/AAAAAAAABJ8/7nhvHJw5V-E/s1600-h/Photon+mapping.JPG][img]http://bp2.blogger.com/_V4SYpI93l98/SBwuol3Cj4I/AAAAAAAABJ8/7nhvHJw5V-E/s320/Photon+mapping.JPG[/img][/url][font=新細明體]光子映射---或翻譯成[url=http://en.wikipedia.org/wiki/Photon_mapping][color=#6699cc]光子貼圖(Photon Mapping)[/color][/url],這種做法讓光子自光源開始發射出去,在場景中彈跳。這對計算是內或半開放的是內場景很有用。單獨使用光子映射計算法通常不會產生好的結果;但如果與蠻力法或[/font][font=新細明體]輻照映射其中一方法搭配使用[/font][font=新細明體],光子映射可以粗略估計光線在場景中的位置。[/font]
[font=新細明體]光子映射有點類輻照映射。它也是用來成現場景照明的一種方式,它也是[/font]3D[font=新細明體]空間中點的集合(點雲)。但是,光子映射是以不同的方式建立的。它是藉由追蹤場景光源發散出的粒子(光子)。這些光子在場景中反彈,並撞向各種表面。光子擊中點會儲存在光子映射當中。[/font]
[font=新細明體]由光子映射重建出場景的照明是與[/font][font=新細明體]輻照映射的重建方式有所不同。輻照地圖只需要把每個樣本點之間作簡單的混合與內插計算就可以。使用[/font][font=新細明體]光子映射則必須要估計任一點的光子密度[/font][font=新細明體]。光子密度估計是[/font][font=新細明體]光子映射這項技術的重點[/font][font=新細明體]。[/font]V-Ray[font=新細明體]可用使用多種方法進行光子密度估計,每個方法都有它優缺點。這些方法基本上就市找尋最接近採樣點的光子。[/font]
請注意,一般來說,光子映射算出來的光照效果比輻照映射算出來的較不精確, 特別是在細節較多的場景時。輻照映射是自適應的,而光子映射不是。還有另一個重大的缺點就是光子映射對於場景的邊界常常出現計算錯誤。通常會出現在邊緣或角落,而算出來的會比它們原本應該的亮度來的深。輻照映射也有邊界計算錯誤的問題,只是因為其有自適應計算的性質,使得這個錯誤被大大地減低了大。光子映射的另一個缺點是它不能模擬天光照明。這是因為光子需要一個實際發射光子的表面。至少在V-Ray裡面,實際上天光並不只是場景中的一個表面物體而已。
[font=新細明體]然而,光子映射是不受視角所影響的且可以計算較快。因此把它作為場景照明的估計,然後與其他更精確的方法例如直接計算或是輻照映射搭配使用會更好。[/font]
[b][font=新細明體]D. [/font][/b][b][font=新細明體]光快取([/font]Light cache[/b][b][font=新細明體])[/font][/b]
[font=新細明體]光快取---或被翻譯成[b]燈光緩存[/b],是計算場景中全局照明的逼近計算法。這種方法非常類似的光子映射,但它沒有光子映射的許多限制。[/font][font=新細明體]這種方法是發由[/font][font=新細明體][b]Chaos Group[/b][/font][font=新細明體]所研發[/font][font=新細明體],專門[/font][font=新細明體]設計給V-Ray渲染器的。光快取的建立是經由自視角產生許多追蹤線。每個路徑的反彈儲存照明訊息在幾何體之上,這種方法非常類似的光子映射。光快取能夠被應用於是內場景或是室外場景,不論是單獨使用或是與蠻力法或[/font][font=新細明體]輻照映射其中一種方法搭配使用[/font][font=新細明體],都能計算的不錯。[/font]
光快取方法主要是自視角追蹤光線。每個路徑會儲存由其他點過來的光照資料,非常類似的光子映射。在某種意義上,它與完光子映射完全相反,因為光子映射是追蹤光線的路徑,並將能量儲存在光子映射當中。
[b][font=新細明體]表四、[/font]Vray[font=新細明體]的四種渲染引擎優缺點比較表[/font][/b]
[url=http://bp2.blogger.com/_V4SYpI93l98/SB3KaV3Cj_I/AAAAAAAABK8/TdRrj0EDPBw/s1600-h/Global_illumination_Vray.jpg][img]http://bp2.blogger.com/_V4SYpI93l98/SB3KaV3Cj_I/AAAAAAAABK8/TdRrj0EDPBw/s400/Global_illumination_Vray.jpg[/img][/url]
[b][size=100%]表五、各種全局照明演算法特性簡表[/size][/b]
[url=http://bp2.blogger.com/_V4SYpI93l98/SB3K1V3CkAI/AAAAAAAABLE/YyPn9UQAQG4/s1600-h/Vray_GI_Methods_properties.jpg][img]http://bp2.blogger.com/_V4SYpI93l98/SB3K1V3CkAI/AAAAAAAABLE/YyPn9UQAQG4/s400/Vray_GI_Methods_properties.jpg[/img][/url] [size=100%][/size]
[b][size=100%]表六、推薦的[/size][size=100%]GI[/size][size=100%]配對方法[/size][/b]
[url=http://bp3.blogger.com/_V4SYpI93l98/SB3K1l3CkBI/AAAAAAAABLM/U0iw_m7KZYk/s1600-h/Vray_GI_Methods_combination.jpg][img]http://bp3.blogger.com/_V4SYpI93l98/SB3K1l3CkBI/AAAAAAAABLM/U0iw_m7KZYk/s400/Vray_GI_Methods_combination.jpg[/img][/url] [size=100%][/size]
[size=100%][/size]
[size=100%][b][font=新細明體]總結[/font][/b][/size]
Vray[font=新細明體][size=100%]的[/size][/font]irrandiance cache[font=新細明體][size=100%]其實就等於[/size][/font]MentalRay[font=新細明體][size=100%]的[/size][/font]Final Gathering[font=新細明體][size=100%]。這兩個名詞不同但是本質相同[/size][/font]
[font=新細明體][size=100%]即使它們內插方式稍有不同。就全局照明的計算方式而言,[/size][/font]Photon Mapping[font=新細明體][size=100%]其實是最容易理解[/size][/font][font=新細明體][size=100%]的;[/size][/font][font=新細明體][size=100%]想像在一個純白的房間[/size][/font][font=新細明體][size=100%]內,[/size][/font][font=新細明體][size=100%]有一台自動網球發球[/size][/font][font=新細明體][size=100%]機,[/size][/font][font=新細明體][size=100%]每個網球上塗上了紅色的油漆。發球機發射網球在房間內反彈[/size][/font]
[font=新細明體][size=100%]把房間染的紅紅一點一點。用這樣比[/size][/font][font=新細明體][size=100%]喻,[/size][/font][font=新細明體][size=100%]越多的網球發[/size][/font][font=新細明體][size=100%]射,[/size][/font][font=新細明體][size=100%]房間的紅色球斑就越不明[/size][/font][font=新細明體][size=100%]顯,[/size][/font][font=新細明體][size=100%]越少就會有明顯的球斑。[/size][/font]Photon Mapping[font=新細明體][size=100%]的原理就是燈源發射光子到場景中彈[/size][/font][font=新細明體][size=100%]跳,[/size][/font][font=新細明體][size=100%]根據設定條件光子會停止彈跳停留光照資訊在場景表面。[/size][/font]irrandiance cache ([font=新細明體][size=100%]或[/size][/font]Final Gathering)[font=新細明體][size=100%]的概念就完全不[/size][/font][font=新細明體][size=100%]同,[/size][/font][font=新細明體][size=100%]自攝影機中決定場景細節多的地方放置收集點[/size][/font](Gathering Point)[font=新細明體][size=100%]這些點自其半球方向收集四面八方的間接照明資訊[/size][/font]
[font=新細明體][size=100%]這種演算法的重點就是收集資訊[/size][/font] Final Gathering[font=新細明體][size=100%]應該翻譯成最終收[/size][/font][font=新細明體][size=100%]集,[/size][/font][font=新細明體][size=100%]而不是最終聚集。[/size][/font]Light Cache[font=新細明體][size=100%]則是和[/size][/font]Photon Mapping[font=新細明體][size=100%]很[/size][/font][font=新細明體][size=100%]像,[/size][/font][font=新細明體][size=100%]只是[/size][/font]Light Cache[font=新細明體][size=100%]追蹤光線的方向不是自光源開[/size][/font][font=新細明體][size=100%]始,[/size][/font][font=新細明體][size=100%]而是源自攝影機視角。[/size]
轉自:[url]http://hammerbchen.blogspot.com/[/url][/font]
edison777 2008-6-6 23:05
好深澳的理論...........看的出來大大的用心
:y012: 加油!