2012/10/07

Vray最佳設定---Irradiance Map篇



Via:http://renderstuff.com/
作者:Anton, Max
翻譯:Hammer Chen

哈囉!大家好~我們繼續討論在V-ray裡面如何設置GI, 在上個教學裡面, 我們討論到間接照明的原理, 我們也學到什麼是全局照明以及為什麼需要全局照明. 本教學, 我們將討論原理, 參數與用Brute Force 和 Irradiance Map做為第二級的GI反彈演算法.



這篇即將回答以下問題:
Brute force GI引擎運作的方式?
Quasi-Monte Carlo GI引擎跑去哪裡了?
Irradiance Map演算法運作的方式
irradiance map在3D空間中看起來是如何的?
IM怎樣偵測場景中的細節?
甚麼是IM的prepass?
為什麼我們不能把Min Max Rate設為同一個數值?
Detail enhancement option細節增強的選項是怎樣運作的?
什麼是Multipass?
怎樣的參數可以達到平滑的, 但卻有很多細節的Irradiance Map?
為什麼算圖結果裡面有亮亮的點, 要怎樣消除掉?

不會針對細節來調整採樣(Indifferent)的Brute force
Brute force GI 是一種基本的演算法, 使用固定數量的光線(Rays) ,由原始的光源 打到場景中的某點, 在該點使用固定數量的光線(Rays)反射. 如果你還記得的話 ,我們認為當光線自光源發射出來, 打到場景中的物件表面, 會再分裂成很多光線, 打到場景中其它物件. 當然了, 越多從間接光源產生的反彈光線 (diffusely reflected rays) 那最終的算圖結果雜訊就會越少.


在間接照明選單裡面的Brute force GI參數, 這裡有兩個參數可調: Sebdivs與Secondary bounces.

Subdivs這個參數意思很簡單就是反射射線的數目. Subdivs的數值不等於實際的二級射線的數目, 而是該數值的平方, 也就是說Subdivs=2,  就表示原始的光會在反射後分裂為4, 如果這個數值是4, 那二級光線就會是16…依此類推.

Secondary bounces這個參數會指定光線會反彈幾次, 只有在Brute force演算法最為第二級反彈的演算法的時候才會出現.

如果 Brute force設定在第一級GI反彈, 那bounces parameter這個參數就會變的沒有作用. Brute force演算法並非自適應的, 它只會計算每個像素的GI,  並不會依照複雜度, 顏色, 與物件的細節來改變採樣的細緻程度. 因此, 很耗費電腦運算資源, 不管是場景中重要的畫面, 還是不重要的地方都以相同的運算來處理.也難外它會被稱為Brute force 蠻力法. 我們也可以知道Brute force的計算是以Quasi-Monte Carlo (QMC)的方法來計算的, 這也是Vray早期版本的名稱, 有時候會讓舊用戶搞混, 他們還在找Quasi-Monte Carlo (QMC)在哪裡.

這種蠻力的演算法是很不合理的, 它會用很漫長的時間算圖, 即使是很簡單的場景也一樣. 因此, 不值的用這種引擎在第一級或是第二級GI引擎. brute force這樣的演算法只會在特殊狀況會用到, 當其它算圖演算法, 因其自適應性導致無法計算微小的細節, 這時候就會需要用到brute force演算法.

Adaptive Irradiance map
Irradiance map是一種自適應(adaptive)的演算法, 用來渲染全局照明的反彈效果.它的主要功能是找到場景中重要的區域, 計算GI與對GI採樣比較稀疏的地區以內插的方式補充起來. 為了要了解Irradiance map演算法運作的方式, 讓我們來看看它產生的圖----稱為irradiance map.


這個測試算圖顯示Irradiance map的採樣, 這張圖顯示大量的白點, 呈現GI採樣的位置. 在場景細節比較多的地方, 會有比較多白點, 在平坦的區域白點比較少.

這張測試圖, 之前的GI教學有用過, 為了清楚說明, 我們把紋理貼圖先拿掉, 讓我們不會受到干擾. 請仔細看最密的白點區域, 這是房子的內部, 圓角的ChamferBox, 每個靠近的位置或是球面對方塊的那的地方, 還有方塊跟牆的接觸面, 這些地方有很多GI細節表現.

這些是irradiance map的點, 這些點包含了該點的GI的顏色與亮度, 其他區域則填滿了灰色, 灰色區域是不含有GI資訊的部分. 但是, 會由irradiance map以內插的方式填充起來. 換句話說, Irradiance map只會計算最重要的區域而那些不重要被忽略的區域, 沒有計算, 只以內插的方式算出來, 拿那些有計算的點來推算出亮度與顏色.

很顯然, Irradiance map的自適應性就是在這裡了. 相對於Brute force (以下簡稱BF), Irradiance map (以下簡稱IM)不會計算場景中所有的像素, 它只會計算重要的區域, 因為這樣能夠節省電腦運算資源


irradiance map的3D呈現出採樣的分布, 在攝影機機看不到的區域就完全不會有採樣 .我們可以用Irradiance map viewer檢視器來查看, 我們可以很清楚地看到不只是irradiance map的3D結構, 我們還知道跟攝影機的觀看角度有關, 特別是 在攝影機無法看到的那面, 完全沒有GI採樣點.


在算圖的時候會跳出算圖視窗, 這裡顯示是IM計算的狀態, 是4段prepass的第一段. IM的計算, 會用很優雅的方式找尋場景中需要放置GI採樣的位置, 它會用到之前我們提到的低採樣(undersampling)的技巧. 一開始的時候, 整個場景的GI會低解析度的方式計算, 通常會比算圖的解析度要低, 這個計算不只是自適應的, 像在用BF演算法算圖那樣,  之後, 利用第一輪計算取得的資料, 決定出最重要的區域, 對該區域進行精確的算圖.

於是就用更高解析度的方式算圖, 但只針對需要的區域, 這樣個步驟會重覆幾次 每一次都增加解析度, 直到達到你在IM裡面所指定的最高解析度. IM算圖的最基與最高解析度, 每次計算的差別都是以2的倍數增加解析度, 也就是原本低解析度的四倍的像素, 例如: 算圖解析度設定為800X450, 下一步的低採樣就會是 400X225, 在下一步就是用200X113…等等.  請注意, IM可以進行低採樣與過度採樣 也就是說IM可以計算比實際算圖解析度少或是多的解析度 (解析度的差異都是2的倍數).

每一次GI算圖的階段稱為pass, 那個用來決定重要區域的pass稱為Prepass. 這個pass計算的過程, 是當下是在哪個階段,可以從算圖視窗觀察到, 會在開始算圖的時候跳出來訊息.


四張顯示採樣的算圖效果.  在Irradiance map裡面有四個, 逐步的prepass. 第一步不會對場景中比較細節多的地方添加高密度的採樣, 其他三個步驟就會. 最後一次的prepass顯示最終採樣的分布狀況, 每個算圖都顯示了IM解析度. 在本例裡面 IM的最大解析度是800X450, 跟算圖最終解析度一樣. 為了完全找到重要區域, 首先會用三個低採樣的prepasses, 以低的解析度來計算: 100X56, 200X113, 400X225, 跟最後一個的prepas一起, 總共有四個IM的prepass.

請看第一個prepass, 你可能會發現, 它沒有找到任何區域, 整個影像跟BF演算法的精度一樣. 但是在第三與第四張影像就完全不同, IM演算法會找場景中細節較多的區域, 然後在那些區域灑下GI採樣. 而在平坦沒有細節的區域減少GI採樣, 不重要的區域例如牆, 平坦的表面…等等. 這些地方只給予少量的GI採樣, 然後之後用內插的方式計算出來. 而且, 我們也可以很快地看到, 在不同的prepass採樣的大小有不同. 因為高解析度的IM算圖, 會有比較小的單一採樣數值, 也會有比較精細, 更精確的IM. 我們可以很容易猜出GI map 由IM算出來的, 即便是最終解析度的來算圖, 不使用prepass, 就像BF演算法那樣, 最終的算圖時間會跟BF一樣冗長.

算圖的時候勾選顯示IM採樣, 這裡看起來好像沒有採樣點. 事實上有很多很密的採樣點, 很平均地放置在場景中, 即便是在那平坦, 不重要的區域.


這張圖顯示irradiance map, 在最終算圖之前算了一次prepass. 仔細看看, 好像沒有採樣, 事實上正好相反, 在這張圖裡面, 全部都是採樣. 這些採樣緊緊地靠在一起. 因此,  IM 並沒有在某些區域增加密度, 它只是從攝影機的角度把場景布滿採樣而已, 為了取得如此密的採樣, 耗費了許多計算資源. 特別是, 之前所有四次的prepass, 才消耗了五分鐘, 而這次才一個pass就花費了50分鐘.

差別很明顯, 不要誤會第二的例子, 它的品質還是比第一個例子要好很多. 因為很密的採樣, 而場景中不重要的區域, 通常就是那些平坦的面, 只具有單一顏色,  而該GI的顏色, 很均勻. 在兩個例子裡面, 都沒有細節.  然而, 場景中重要的區域, 有的會, 有的不會用自適應來計算有高度的細節. 這也是為什麼沒有必要花費10倍的電腦運算資源在計算那些平坦的區域, 因為做出來的結果是一樣的. 我們相信所花費的時間, 使用IM與使用BF來比較, 差異是很明顯的.

一旦計算場景中重要的採樣點 (含有GI顏色資訊)計算出來了, 那些缺乏GI採樣點的區域也開始進行內插計算出來. 而在以BF計算的那個例子裡面, 在算圖的時候, 進行計算固定數量的二級光線, 以半球的方向發射. 在前一篇的教學有提到.

IM的基本參數
對於那些IM演算法認為重要的區域, 每個IM採樣點的二級射線的數目, 對整個場景的細節程度決定的解析度. 這些參數都可在V-Ray:: Irradiance map選單中找到.

這是V-Ray:: Irradiance map選單, 顯示每個參數, 預設的數值可用下拉式選單找到. 基本的參數包含了Min rate, Max rate, HSph, Subdivs, Interp. samples, Clr thesh, Nrm thresh, Dist. thresh, Interp. Frames . 選項區域則提供了Show calc. phase, Show direct light, 與Show samples parameter. 進階選項則有zones as Detail enhancement, Advanced options, Mode,與On render end.

目前的預設值, 提供IM 主選單的快速設定參數, 下拉選單裡面可以找到每種預設值的類型, 這些預設值從名稱你就可以明白它的意思: Very low, Low, Medium, Medium animation, High, High animation, Very high. 然後, 最重要的是客製化的選項, 讓你可以調整IM的每項參數, IM是以High做為預設選項.

下一個, 是基本參數選項. Min rate 決定了GI的第一次prepass的解析度. Max rate 決定了最終GI算圖的解析度或是最後一次prepass的解析度.

我們已經知道了, IM演算法會搜尋到場景中細節最多的區域. 如果你看以上的範例, 你會看到rate的數值, 決定了當前的prepass解析度.

當rate等於0的時候, 表示GI解析度跟最終算圖的解析度是一樣的. 當Rate=-1的時候, 表示GI的計算會是最終解析度的一半. 當Rate=-2, 表示GI的計算會是最終解析度的1/4. 同理, 當rate=1的時候, GI計算的解析度會是最終影像的解析度的兩倍, 這跟採樣不足與過度採樣計算反鋸齒的觀念是完全一樣的. V-Ray Adaptive subdivision演算法也是

Irradiance Map的演算法很具有彈性也是高科技的工具, 儘管邏輯上面把最終的GI prepass以最終算圖的解析度來設定. 也就是Max rate=0, 其實沒這個必要, 因為在品質上僅有很小的差異, 卻會造成計算量的巨大負擔.


用不同的Min Max Rate來進行場景測試. 第一張圖效果很棒, 算圖也最久. 第二張算圖, 則是可接受的品質, 卻只花了1/5的算圖時間. 第一張影像 IM的計算效果, 在球的下面有清楚與較密集的陰影, 跟第二張圖片相比. 同時在cube底下有清楚且銳利的陰影, 特別在左方的角落地方, 這是因為在第一張IM有很大量的小細節, 而第二張比較小解析度的IM. 然而, 算圖時間第一張在max rate=0的時候花費的時間是 (max rate=-3)的那張的五倍時間.

5分鐘又3秒 跟57秒相比, 高解析度或更複雜的場景的話, IM的效果會更加明顯. 同時, 高解析度例如2500X3500像素, 兩者的算圖差異會更不容易看出來, 因為最終的解析度已經提高了. 除此之外, 這種小的模糊問題可以在幾分鐘內以2D軟體修掉. 實際上, Min rate -5 與 Max rate -3已經夠好了, 效果很接近照片寫實的效果, 這樣的參數應該做為Vray的起始參數.

HSph. Subdivs的參數是GI射線的數目, 從場景物件的表面反射出來的. 這個參數決定了有多少的diffuse light光線, 在每個IM二級點上面. 就像我們之前提到到, 方向是以半球的方向發射. 這個跟BF演算法裡面的Subdivs參數很類似, 大部分的情況, Subdivs=80對大部分的狀況都很夠用了. Samples是決定了IM內差計算的品質. Interp. Samples決定了在不重要的部位, 灰色部位的內插品質. 內插的採樣位高, 內插就越高, 會產生越模糊的GI; 相反的, 如果內插採樣越低, 影像就比較不會模糊, 但是容易會有雜訊產生. 預設的內插數值為20, 已經很足夠 不需要改變.

我們已經知道, IM會幫助prepass來辨識出場景中細節的區域. IM能做到這點全是因為prepass所得的資訊, 而且是根據三大細節屬性: 第一是顏色, 法線的差異以及物件的相對位置. 在IM裡面, 這些參數是分別以Clr thresh, Nrm thresh與 Dist thresh來控制的.

Clr thresh控制顏色的閥值, 這個數值越高, IM就越不容易察覺顏色差異, 把數值變小, 敏感度就會提高 ,會產生更細緻的算圖效果. 把這個數值設定為0.3 對大部分的場景都很適合.

Nrm thresh法線的閥值, 用來控制IM對場景幾何體, 特別是法線的變化的敏感部. 把這個數值降低, 越多場景的細節會被視為重要區域, 也就能算出更高品質的影像. 將數值設為0.1, 適合大部分的場景.

Dist thresh定義了場景中相鄰的幾何體表面距離的閥值. 場景中相鄰的表面距離越遠, 就會被認為是越重要的區域, 因此可以算出越細緻的圖片. 請看以上例子 你可以馬上看到, Dist thresh與Nrm thresh兩者的差異. 如果從Nrm thresh來看會決定場景中IM的密度, 而Dist thresh會決定物件與物件靠近的區域. 要注意的是, 當Dist thresh數值低的時候, 它只會考慮物件與物件之間比較小的距離, 因此就會減少IM 採樣. 請注意這個參數跟Clr 與Nrm thresh是相反的, 後兩者減少數值會增加算圖品質, 這個參數設定為0.1 適用於大部分狀況.

最後一個參數, 在Basic parameters那邊. 也就是inactive Interp. Frames .這個參數控制了有幾張irradiance maps, 從不同的frame 計算而來的Animation (prepass) 用來計算當前的動畫frame上面. Animation (rendering) mode, 我們在另闢專欄來討論關於這點的設定.

V-Ray:: Irradiance map的選項,  讓你可以清楚看到當前是在哪個IM prepass階段 顯示GI的直接光照與prepass算圖, 你可以查看到採樣的位置. Show samples顯示採樣, 這些都只是幫助你看到狀況, 並不會影響IM算圖的效果.

下一個參數是Detail enhancement.
我們都知道IM的強項就是用低解析度在prepass的時候找到場景的重要細節區域. Option Detail enhancement的選項讓你產生介於自適應的方法, 但是卻有點是模糊的IM演算法的採樣, 以及在細節區域採粗略的卻又精確的Brute Force方法.

當你啟動了Detail enhancement的選項, 還是會一如往常地在prepass的時候找尋場景中的細節區域, 但是在最後一個pass的計算, 當場景的細節資訊取得以後,  Detail enhancement演算法就會開始作用. Detail enhancement基本上就是在重要的區域採用全解析度地, 用Brute Force來計算, 而不是用採樣不足的方式計算(undersampling);其他區域 (不重要的區域) 還是以正常的IM計算, 計算內插.

Detail enhancement的演算法用來決定場景中哪些重要區域的採樣必須要計算, 是根據一種很類似AO的演算法, 但是跟AO不同是, Detail enhancement演算法會考量到光線的方向性(direction of light).

要注意的是, 當啟動Detail enhancement的時候, IM的功能只拿來用在決定場景中細節的區域, 而真正去計算細節區域的是用BF演算法, 既然知道這點, 如果你勾選了Detail enhancement, 我們就可以把所有的IM參數降到最低, 除了Interp. Samples的部分. 甚至可以把Interp. Samples設成比較高的數值, 當你勾選了這個選項, 其他像是Scale, Radius和Subdivs mult也可以讓您設定.
Scale定義了Radius這個參數的使用單位. Radius是半球的半徑 ,定義了BF從參考點的GI採樣的計算, BF參考點的位置. 如前面所述, 在prepass的時候由計算場景細節的那個階段所決定的.

Subdivs mult.事實上跟BF的Subdivs參數很像, 也是用來決定diffuse光線的數目 它是以目前的HSph. Subdivs的百分比來設定的.

為了要更了解半球半徑的意義(radius of the hemisphere), 我們必須要再複習一下AO的觀念, 但那已經不是本文的重點了, 我們會在VRayDirt map教學裡面提到 而這邊的Detail enhancement選項, 會減少IM的自適應性, 會對GI算圖有顯著的增加, 這也是為什麼只再需要的時候才勾選這個選項, 當然VRAY的預設值也沒有勾選.

Irradiance Map的其他選項
進階的選項: 下拉式選單讓你可以選取IM採樣的內插計算方式, 這裡提供了四種算法 Weighted average (好/強大), Least squares fit (好/平滑), Delone triangulation (好/真實) Least squares with Voronoi weights. 技術上來說, 這四種方法是以不同的數學原理計算的, 沒有必要去探索這些數學到底是怎樣計算的, 用戶只需要知道, 每個參數的意義, 最佳的內插方式為Least squares fit, 這也是Vray的預設值.

Sample lookup 提供了下拉式選單, 讓你選取用怎樣的方法決定, 當IM在計算內插的方式, 總共有四種方式, 分別為:Quad-balanced (good), Nearest (draft), Overlapping (very good / fast) and Density-based (best). 這些也都是演算法, 透過特殊的數學模式來計算, 沒必要去探究細節. 跟內插的內行一樣, 你可以從名稱就可以判斷每個類型的意義, 預設值Density-based (best)就是適用於大部分的狀況.

Calc. pass interpolation samples這個數值決定了在最後一個pass時候引導IM計算內插採樣的使用採樣數目, 預設值10個採樣已經夠用了.

Multipass
Irradiance map的運算會完全地利用電腦資源, 也就是以多線程的, 多核心的方式處理資料. 一開始的時候, IM會以多線程計算, 每一塊的IM都是不同的線程在計算, 都是相互獨立的. 這些資料只有在前一次的prepass才會被取用, 因此, 在不知道彼此資訊的狀況下, 就會產生不同區塊不一致的結果, 你就很容易看到很明顯一塊一塊的算圖區塊.

把Multipass關掉來算圖的話, 你會發現IM的採樣會一塊一塊的, 每塊之間有明顯縫. 勾選了Multipass function讓IM演算法能夠使用當前prepass採樣的資訊.

也就是說, 在渲染每一塊的時候, 他讓IM演算使用鄰近的區塊的資訊, 這樣每塊才能產生連續的採樣. 因此, 實用上, Multipass讓你的IM每個區塊之間能夠有很平順的採樣, 而不是像磁磚一塊一塊地. 這個選項預設是打勾的.

Randomize samples隨機化採樣, 這個功能讓你的IM採樣用隨機的方式排列, 這樣會讓IM的效果更加寫實, 就算是勾選了Multipass, 這個功能還是有作用的. 可以看以下圖片看效果:


關掉隨機化採樣點(Randomize samples)的測試場景, 預設的情況,  IM會以可預測的方式排列, 但是會產生比較不寫實的算圖效果.
為了要打破規則性, 採樣點會預設隨機化分布, 所以預設的狀況會勾選Randomize samples的選項.

Check sample visibility 讓我們可以使用IM的採樣的內插, 只考慮那些看得到的採樣. 經常, 因為 IM密度過低的原因, 在處理採樣的內差時, 會在該採樣點的周圍一定的範圍採樣, 即使在那個範圍裏面的採樣是在場景的可視之外的地方.例如: 書架後面放了一片木板.

光線可以直接照明書架. 而在書架後方, 光線無法穿透. 儘管如此, 在書架後方的木板卻顯示出明亮的光點. 雖然光線理論上根本不會這樣穿透過去, 會發生這種原因是因為IM會利用相鄰的採樣點進行內差計算, 而不會考慮到實際的幾何體狀況, 為了避免這種狀況, IM內插的演算法必須要知道採樣點之間, 是否能直接看到彼此. 當然, 如果你勾選了這個選項, 會耗費更多的電腦計算資源.


我建議你看看V-Ray Help的範例, 裡面很清楚地說明這個功能運作方式.
這是很好用的功能, 然而, 在大部分場景, 不會出現上述的錯誤缺陷(artifacts) .也沒有必要去檢查採樣的可視性, 也沒必要浪費電腦資源, 在大部分的狀況, 應該不需要勾選這個功能.

最後一點要注意的是, Irradiance map只能被用在第一次diffuse反彈. 也就是說 用在Primary bounces GI engine, 從IM的演算法我們可以很清楚地知道, 在第一次反彈後計算了大量的GI射線, 就會使用IM的prepass模式. 當你要選取第二次的diffuse bounce引擎的時候, 你沒辦法找到IM這種引擎.

結論
在這篇教學裡面, 我們很徹底地認識兩個GI算圖演算法的設定方式, 也就是Brute Force 與 Irradiance Map. 特別是, 我們很徹底地研究了各種細節, GI引擎的自適應參數, Irradiance Map, 用幾個範例裡面能夠清楚地理解.

[相關資訊]

No comments: