2012/10/07

Vray最佳設定 ─ Light Cache與Photon Map篇




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

V-Ray的最佳設定 Light Cache
大家好, 之前各位有仔細讀過兩篇關於GI算圖的教學:

Vray最佳設定---Irradiance Map篇
揭開V-Ray DMC採樣器的神秘面紗

現在進入到第三篇. 如果你還是不了解前面兩篇, 我們誠摯地建議你再複習一下, 特別是, 要知道GI的大致概念, 也就是要對Brute Force和Irradiance Map這兩種演算法有紮實的概念. 在這篇教學裡面, 我們將學習有關於GI反彈算圖, Photon mapping與 Light Cache, 我們也會學習Light cache每個細項功能, 以及最佳化的設定方式.

本教學將回答下列問題
photon map是什麼? 運作的方式?
使用photon map的缺點是什麼?
photon map的修改版---- Light cache演算法的運作方式是什麼?
Light cache的cell是什麼?
Light cache是如何儲存直接光照的? 以及計算不同的diffuse反射
Light cache filter的運作方式?
Pre-filtering與Filtering的差異?
Light cache的參數要怎樣設定才能得到最佳的效果?




傳統的Photon map
這是過時的算圖引擎, 基本概念是光源在發射光子在場景中反彈, 然後, 就會在場景中形成所謂的光子圖photon map. 這是一個三度空間的光子打到物件表面所形成的, 每個點都儲存了亮度與間接照明的顏色資訊. 基本上, 這樣的圖的產生方式跟Irradiance map產生的演算法差不多.

光子貼圖的原理很容易理解
在Irradiance map GI Map的取得是由攝影機開始, 取得場景中的一個點, 確認可能會對表面照明的光源. 這樣, 我們就可以假定射線從攝影機發出, 檢查其他的rays, 直接由光源或是間接到達該點. 用這種方法, 只會考慮到場景中攝影機會看到的區域. 從這樣的角度來看, Photon mapping的算法比較粗糙.

除了攝影機角度發出的向量以外, 它也會投射光源所有角度的向量, 稱為光子. 所有的表面, 以及場景中所有的點都會被計算, 因此浪費掉了許多運算資源. 這個演算法在場景中散布光子, 即便是在不會被攝影機看到的地方也一樣.

再者, 光子貼圖演算法不會提供足夠的自適應功能, 偵測場景的細節, 也因此得到的品質也不好. 光子貼圖在物件的邊縫處會產生錯誤, 這是該演算法的主要缺點. 然而, 實際上來說, 光子貼圖的最大區點是無法從間接的光源計算亮度, 光子只能由傳統的光源來產生.

例如, 他無法偵測到由VRayLightMtl產生的自發光照明, 或是GI Environment (skylight) 或 VRaySky的照明效果, 這樣光子貼圖在戶外或是室內場景變得無用武之地.

光子貼圖演算法的唯一生存優勢, 有些老派的3D用戶還在使用的原因是, 它相對來說物理比較精確, 因為光子演算法夠正確地計算diffuse反射, 例如焦散效果與次表面散射效果.

然而, 因為某些限制與不合理, 你不應該再使用過時的光子貼圖GI演算法. 在光快取(Light cache)這套更棒的演算法推出之前, 光子演算法很流行. 用來計算第二次反彈.

最新的光快取技術
光快取(Light cache) 原本是高科技的算圖引擎, 跟光子圖的全局照明很類似, 但是跟光子圖相反的是---射線(rays)計算的方式有所不同. 這個演算法的本質是光快取, 是由攝影機產生一組的射線, 在這些射線與場景物件交錯的點上面, 產生全局照明的圖,

這些射線 (rays)並不是GI的射線, 這些是從觀察者角度所產生的路徑. LC ray 投射到場景的物件, 在接觸的地方計算顏色, 取得材質的屬性, 以及打到他的光線, 不管是直接光照或是間接的. 跟光子貼圖相比, LC演算法把光子貼圖的所有缺點都拿掉了!

LC只會考慮到場景攝影機看得到的區域, 它會處理微小細節, 而且不會在物件的邊緣產生黑邊, 而且, 最重要的是 LC可以處理任何類型的光源, 包含了間接照明.


Light Cach的主要參數
這是V-Ray:: Light cache的間接照明選單, 包含了計算參數, 重建參數, 模式…等等 還包含了subdivs, sample size, scale, number of passes, store direct light, show calc. phase, adaptive tracing, pre-filter, use light cache for glossy rays, filter, interp. samples, mode, don't delete 與 autosave等參數


Subdivs這個參數決定了LC rays的數量, 從攝影機到場景, 決定採樣的顏色.
LC演算法一般會把場景切割成小的區域(稱為cell). 在切完之後, 就會決定每個小區域的顏色, 藉由投射LC射線, 從攝影機過來的, 也就是說, 每個小區域都是獨立的顏色採樣, 最後會用在GI map上.

範例場景的渲染, 這邊顯示了光快取採樣的馬賽克細胞(masaic cell)分割區域, 當然Subdivs的細分越多, 就會有越多的馬賽克細胞, 也會得到越精確的顏色. LC射線的實際數目等於Subdivs的平方 .

一般來說, Subdivs約有2000-3000對於大部分的寫實算圖很足夠了, 但是一開始只要設為1000就夠了, 而這個參數如有需要再調高就好了.

Sample size 控制了採樣的大小, 當你指定了cell的大小,  LC的演算法就根據這個數值對圖像細分. 在之後, 他會追蹤射線, 決定每個cell的顏色, 每個cell顏色的確認都至少需要一個射線, 讓我們假定由Subdives決定的射線總數會比cell的總數要少, 所以視覺上看起旯好像增加了某些細胞的大小, 換句話說 視覺上cell的大小也間接地跟Subdives的數值有關.

Sample size的數值必須要有足夠的LC射線才可以達成, 例如當LC射線大於cell總數的時候, 某些cell會被數個射線計算, 也就會產生比較精確的顏色, 也就能夠改善最終算突的品質. Cell的尺寸只會在當場景具有大量細節的時候才須改變 而LC map無法呈現足夠的細節, 在大部分的狀況, 把Sample Size設定為0.02, 對於大部分的場景已經很足夠了.

Scale參數在下拉式選單裡面, 讓你可以指定cell size的單位, 有兩種數值: 螢幕與世界單位 (Screen and the World).
螢幕模式讓你可以指定cell size的數值, 依據最終算圖大小的比例, 例如Sample size=0.02, 而Scale 設定為screen, 那表示cell大小為整個螢幕大小的2%.  你也必須知道, 這樣cell大小是相對於螢幕解析度的, 這表示在場景中靠近銀幕的cube的面, 與在牆壁上的兩個cell大小是一樣大的, 儘管在位置上面他們跟攝影機的距離並不相同.

而以World作為單位, 讓LC根據3ds max單位來決定cell size. 以這樣的模式,  cell size在空間上面是一樣大的, 但是在螢幕上面會根據他們在場景空間上面的位置來決定大小. 這樣, 在牆後面的cube的cell大小會比在cube前面的要小, 而且, 由於LC會對影像的每個位置用固定數量的射線, 在小的cell裡面會用比較少的LC射線. 跟大的cell相比較, 這樣會讓小的cell產生比較差的品質, 在最終算突的時候, 可能會產生比較多的雜訊或是錯誤.

對LC cell使用場景單位, 會產生很均勻的LC map, 這對於鏡頭飛躍的動畫(fly-through animations)很有用, 這個方法讓LC cell的大小都很均勻, 用在動畫上 不管攝影機的移動都可以得到一樣大小的LC cell. 對於靜態場景渲染與動畫. 當LC map的每個frame都是獨立計算的, 不能合併在一起時, 我們就必須要用Screen模式, 這會減少錯誤. 這就是為什麼在預設的狀況下LC cell是設定成screen 模式.

Number of passes是LC計算有幾個pass. 一般來說 LC的計算並不是用多執行緒的, 但是可以分割成好幾個passes, 讓整個電腦的多核心能夠完全載入使用. 例如: 如果LC計算是用四核心處理器計算的話, 我們就不能打斷LC的pass, 也就是說 Number of passes設定為1, 換句話說, 在計算LC的時候, 就只會單一的, 四核心處理器, 剩下的三核心就會閒置, 不會參與LC的計算. 因此, 為了要加速LC算圖, 必須要強迫把pass切割數量切割成系統的核心數量. 當今, 常見的處理器核心數目不會超過8個, 例如, 八核心的系統, 有兩個四核心的Xeon處理器. 在大部分的電腦, 把umber of passes設為8適合大部分的狀況.

Store direct light是LC演算法的功能, 讓你可以不只是儲存GI資訊, 而且可以儲存關於場景中直接光照的位置. 我們知道 LC會追蹤由攝影機到場景的物件, 當這些射線跟場景交錯的時候, 演算法會檢查物件的shader決定其顏色, 然後繼續追蹤從光原來的點, 照亮物件, 決定物件的亮度. 換句話說 LC演算法, 根據它運作的原理, 也會檢查直接光照落在場景的點.  因此, 一開始的時候它會收集關於場景中直接光照的資訊, 能夠儲存質將光照, 讓我們可以快取, 儲存場景中直接光照的資訊.

傳統上, 在GI render element算圖之後, Vray分開計算直接光照, 對場景中直接光照進行採樣當然會耗費計算資源, 光線的快取, 例如先前儲存在LC的資訊, 之後要用到就可以馬上使用, 如此可以增加算圖的效率, 節省了以運算的方式得到直接光照所需要的時間. 我們可以想像的到, 用這種方法得到的直接光照, 品質會比傳統的採樣要糟糕. 當然這要看依你LC的品質而定.

這種作法只在場景中有大量的光源的時候才有意義, 因為計算直接光源可能會耗費好幾個小時. 再者, 用這種方法產生的光照會有明顯的缺點, 會暴露出CG算圖的感覺, 會產生模糊的陰影. 如果目標是照片級寫實的算圖, 用這種做法不是很好, 就算考量到可以節省量的運算資源也一樣. 所以在預設的狀況下 Store direct light是關閉的.


Show calc. phase 顯示計算階段這個功能很棒, 讓我們能夠顯示預覽的效果, 在幾分鐘內就看到大概效果, 這排除了用低解析度算圖測試的需求. 在預覽的時候你不需要等待所有階段的算圖過程, 確保開啟這個功能. 當然啦, 這預設值是勾選的.

三張比較圖, 左邊這個是螢幕截取, 是比較粗糙, 只用基本的shader. 中間這張是在幾分鐘算圖過後, 非常接近右邊這張 ,右邊是最終算圖效果, 具有高品質.

Adaptive tracing這個功能能讓我們使用關於場景中照明的資訊, 對每個LC採樣, 然後在場景中光源比較多的地方添加更多的射線. 在某些狀況下, 能夠幫助我們移除掉LC產生的雜訊, 例如, 如果場景有焦散, 但是, 這個選項會消耗記憶體資源, 而只有在Adaptive tracing parameter勾選的時候, 才能勾選Use directions only的選項. 基本上, 在大部分的場景, 勾選這個功能不會有明顯的差異, 所以在預設的狀態下不應勾選.

重建Light Cache map
下個選單是Reconstruction parameters area, 裡面包含了幾項設定, 跟LC map的後處理有關, 對最終算圖有影響.


Pre-filter預先過濾 這個功能跟LC cell採樣的內差有關 Pre-filter的內插功能讓LC sample map變得更平滑. 只有在勾選的時候, 它會把map傳給最終算圖. 而內插的強度是由Pre-filter後面那個數值所決定, 越大的數值可以產生越少的雜訊, 但是結果會比較模糊, 也因此會造成某些小細節消失. 而小的數值會產生比較多的細節, 但也會變得比較多雜訊.


兩張算圖範例, 這邊顯是了有勾選Pre-filtering演算法與沒有勾選Pre-filtering演算法的結果, 第二張圖是有勾選Pre-filtering, 看起來比較平滑.


Filter提供下拉式選單, 讓我們可以選取更多的內插演算法, 如先前提到 V-Ray在計算LC之後 會把計算好的LC map,傳遞到最終的算圖演算法. 使用LC filter讓我們可以做出更多的LC內差效果, 一旦LC把map傳遞給最終算圖演算法, 也就會開始計算每個shading poin,t 這也就是算圖的基本單位. 如果我們選取了其中一個filter (請不要與Pre-filter搞混) 當他計算每個shading point的時候, 會內插LC sample map的資訊.

None是Filte下拉式選單的一個選項, 用這個選項就關閉使用LC filter. 在這種狀況, 最終算圖演算法會使用LC map, 不會進行過濾功能. Nearest是LC的filter 在某個數值條件下最接近的採樣做為內插的條件, 會涉及到過濾的最接近採樣的數目是由Interpolation samples所決定.

當開起了filtering Nearest, 會產生非常平滑但又維持細節的效果. Fixed類型的filter很類似於Nearest, 差別只在於涉及採樣的點是根據GI map點的方形區域.

Filter size的單位是由Scale來決定. 請注意, Fixed的濾鏡只會處理落在Filter size裡面的區域, 結果看起來很像一片一片的方塊, 而其他的區域變成黑色的背景.


這個算圖範例展示了用比samples尺寸還小的Fixed Filter算出來的結果. 看起來就像在黑色的背景貼滿了N次貼那樣的效果. 為了避免LC map產生如此明顯的錯誤, 我們必須要把filter的尺寸弄得比sample的尺寸要大, 至少要是兩倍大.

但是只有在算動畫的時候, 使用Fixed類型的濾鏡才有意義. 把尺寸設定為Screen模式, 在其他的狀況, 用Nearest filter還是比較好.

根據Pre-filter與Filter的運作原理, 這兩者最後個功能都是一樣的. 兩者會把LC map平滑化, 產生更平均的效果. 兩者只差別在技術的應用面, Pre-filter演算會對LC map的所有採樣進行內插, 但是缺點是這個計算只支援單線程處理運算, 不管你電腦有多少線程. 同時 Filter的演算法會計算的比較精確, 因為它是根據不同的算區域來進行處理的.

這個方法需要更多的電腦運算資源, 讓V-Ray在每個算圖區域計算內插, 儘管如此, Filter的運作, 以最終算圖, 都是支援多核心的, 也會使用電腦所有的可用線程, 對於單核心或是雙核心的電腦, 會建議你使用Pre-filter或是合併使用Pre-filter + Filter, 讓採樣分配的數目降低為一半.

大部分的高效能工作站, 甚至用在玩遊戲的電腦主機上, 都具有超過4線程的運算能力, 對於這種硬體, 就很適合使用Filter演算法, 對於分散式算圖尤其有意義, 在算單張圖的時候, 有多台電腦參與計算.

在大部分的VRay設定裡, 我建議只使用Filter: Nearest把Interpolation samples設為10, 這樣可以的到好的結果, 也不會把GI細節模糊掉, 不會有明顯的錯誤.
Use light cache for glossy rays是個選項, 讓我們以LC計算場景材質的diffuse reflections 與refractions 這讓我們減少了運算資源. 當然啦, 用這種方法算出來的材質跟直接計算相比較品質會較低, 最終算圖的品質跟你LC map的品質有關.  在Store direct light的選項的目的類似, 計算間接照明的資訊, 也包含用來計算diffuse reflection的資訊.

當然啦, 場景材質用這種方式計算出來會比較模糊, 無法滿足照片寫實算圖的要求. 這種狀況, 可以用LC的設定來改善, 取得好的高光模糊與折射模糊, 但是是否真能節省時間還是個問題, 對於分散式算圖尤為重要. 很不幸地, 現在的VRay 版本並不能用分散式算圖來計算LC Map, 就算你是用網路算圖算圖速度也跟單機算圖沒有差別.


算圖範例中的球, 套用藍色反射模糊材質, 你可以看出使用Use light cache for glossy rays 這個選項會導致非常多雜訊的反射模糊, 因此在預設值的時候不會開啟這個選項.

LC最後面的兩個選單是Mode與On render end, 這跟IM裡面的選項很類似, 專為動畫算圖所設定的.

結論
在這個教學裡面, 我們探討了兩種GI算圖演算法, 也就是Photon mapping與Light Cache, 然後對最重要的部分深入研究. 特別是, 我們學習了所有細節, 為調了LC的GI算圖, 能夠很清楚地知道所有的範例. 各位朋友, 我們很誠摯地希望您認真的閱讀這章節, 我們也希望你在閱讀之後夠駕輕就熟地使用LC裡面的各種參數.

理解這些重要資訊讓你可以輕鬆地設定, 取得適當的GI maps, 計算寫實的3D算圖效果. 在下次的教學裡面, 我們介紹各種GI引擎的最佳搭配, 除此之外, 我們也將揭開如何消除角落的黑點問題.

祝各位有美好3D算圖效果. 下次見~

[相關資訊]
Vray的全局照明(Global Illumination)演算法原理與比較

V-Ray for Maya功能完整介紹

VRay 2.0即將在今年12月份上市了!
Post a Comment