2008/09/23

[cgtalk文章翻譯]逼真的算圖演算法



譯者序:
CGTALK是高手雲集的專業論壇. 常常有些大師級的對話能夠釐清一些書本裡面也沒寫的重要觀念. 全局照明有很多專有名詞與演算法 例如光子映射 最終聚集 光緩存等. 有些觀念我是翻譯這個討論串後 才比較了解. 這個討論串是由joost_db提問, 主要回答者有CaptainObvious (Simon Lundberg), jeremybirn (Jeremy Birn), thev (Vlado). 

英國人Simon Lundberg提供了珍貴的觀念解釋. 一般在3ds max的MentalRay Final Gathering (FG)設定 其實指的是irradiance map. 如果你只把FG選項打勾 其實就只有計算irradiance map而已. 必須要把MentalRay的GI與FG同時打勾 他的計算才有Final Gathering的意義. 只有勾選FG根本不能稱做是Final Gathering計算 因為你沒有發射光子根本就沒有最終收集的意義. 精確的命名應該是要像Vray那樣把第一次反彈設為irradiance map 第二次反彈設為Photon Mapping, 這樣的命名才符合實際演算的意義. MentalRay的FG選項有誤導的嫌疑. 

以下文章翻譯自此cgtalk討論串:
Photorealistic Studio Methods (started by joost_db)

[joost_db問到]: 我是一位工業/產品設計師,最近想要改善我超爛的算圖效果 想要算出真實的效果。我希望能達到專業攝影棚的算圖效果---例如產品攝影,或是汽車等. 越真實越好。

我看到一些超讚vray效果圖, 看了一些線上教學,對Vray有非常深刻的印象。

我讀了3dword雜誌有一篇文章,講到利用“最終聚集(Final Gathering)產生真實影像” 。我覺得很多地方都會談到FG,但是我不知道FG到底是什麼。目前只知道,FG是一種能夠計算光線在場景中反彈的計算方式。

我在mental ray裡面看到FG的選項 ,但vray中沒看到 。FG是不是一種能建立光線反彈的簡單方式?或者特殊的算圖方法。是否有可能在vray裡面使用FG技術? 

[Vlado回答]: “Final gathering”是mental Ray的專有名詞;一般對這類的GI演算法都被稱做 “irradiance caching” 。許多新的算圖器都支援irradiance caching的技術。如果是V-Ray,它的“irradiance map”算圖引擎最接近mental ray 的“final gathering”演算法。

[Simon Lundberg回答]: 每當談到全局照明(global illumination) 常常會被各種名詞搞混。我來告訴你這些名詞的差異:

首先,談到全局照明。這是一個集合名詞,用來描述光在漫射表面彈跳的現象。基本上,這個彈跳是在整個場景中彈跳。全局照明並不局限於任何特定的技術。

這麼多方法中,能夠實現全局照明的其中之一技術是---光子映射(photon mapping)。光子映射是一個相當簡單的技術,這就是為什麼它這麼受歡迎。這是一個較快的技術,但你是幾乎不可能利用它來達到高品質的全局照明。用數目少的光子只需要幾秒中就可以算出來。獲得中等數目的光子地圖將花數分鐘算圖。獲得高品質的光子貼圖將花費你幾天。當你使用光子映射時,GI基本上是用數以萬計非常不準確的光點構成的。藉由將這些光點作平均化的動作,你可以達到無光斑的算圖結果。缺點是,算出來的效果會缺乏細節和準確性。

光子映射是這樣的
1 :光子映射是在最終計算前先預先演算(pre-pass)。同時光子映射也會被平滑化(smoothed out)。 
2 :當真正開始算圖時,會從攝影機發射光線(rays)到場景當中。 
3 :當一個光線射到物體表面,那個表面會依據光線與存在表面的光子貼圖(photon map)來計算他的亮度。

計算全局照明的最原始方法,是蠻力演算法(brute force method),有時被稱為蒙特卡羅法(monte carlo)或無誤差演算法(unbiased)。這表示,每一個像素都會射出超多的隨機(或半隨機)的光線。這種做法是很精確,但速度緩慢的。這類的演算法主要是由Maxwell 與 FPrime這類的軟體採用。然而,大多數算圖器也可以使用這種方法,雖然預設值不是用蠻力演算法. 蠻力演算法的計算流程:

1 :光線自攝影機發射到場景中。 (請注意,這個計算不需要預處理(pre-pass)!) 
2 : 其中的一個光線打到場景中的物體。 
3 :從步驟二的撞擊點中,再次發射大量的光線到場景中。 
4 :從步驟三中的撞擊點, 再次發射大量的光線到場景中。

所以,即使是簡單的場景,仍會耗費大量的光線。如果是本來不用GI只需要算幾分鐘就能算完,用光子映射大概要花10分鐘,而以蠻力演算法則需花數個小時計算。

因為蠻力演算法是如此緩慢,所以才發明了:輻照緩存(irradiance caching)這個技術. 輻照緩存採取非常準確的全局光照採樣數,但是並非計算每一個像素。如果計算一個平面,全局照明不會有劇烈改變,所以沒有必要計算每一個像素的資訊。如果你用輻照緩存,你可以計算場景中不同位置的光照,然後用內插法把其餘的位置給計算出來。這種技術的缺點是,它如同光子映射一樣, 需要預先計算(pre-pass),它也可能導致光斑問題與細節表現的損失。如果你是用蠻力演算法計算,結果是雜訊點(noise)很多。但是雜訊點通常比光斑(splotches)好看 。

這就是為什麼你需要final gathering, 因為這蠻力演算法計算與輻照緩存都是一種很慢的演算法,而光子映射則是品質很差,於是有人想出了一個相當棒的方法---Final gathering!這個方法首先你要計算出光子地圖,這將含有光斑和細節損失的問題。然後你使用比較慢,但更準確的計算方法去計算光線反彈。基本上,它是這樣的:

1 :計算光子地圖計算,同前。 
2 :開始算圖然後自攝影機發射光線。 
3 :光線打到場景中,一如往常光線產生陰影。但是這時光子地圖是完全被忽略的,因為它的低質量。 
4 :光線自第三步的撞擊點再次發射光線。但是這次打出的光線打到新的表面時 就會把光子貼圖考慮進去,而影子光線(shadow rays)在這次就不追蹤了(因為陰影已經計算在光子貼圖當中了) 

光子貼圖是用來創造一個基本的整體環境,然後您使用的final gathering將光斑平滑且將失去的細節救回來。這種算圖時間會比單單用光子映射算的久,但是質量會高出很多。此外,由於您沒有自final gathering的光線射出陰影光線(shadow rays),所以可以幫您節省大量的時間。光子映射+最終收集是非常受歡迎的技術。最終收集可以與蠻力演算法或輻照緩存混合運用。

不幸的是,就是這邊容易搞混。當mental ray使用者講到final gathering,實際他們指的是irradiance caching!在許多的算圖器中,irradiance caching被稱為final gathering,不管你到底是不是真的在使用final gathering技術。

如同Vlado所說,您實際上是想用“irradiance map”技術 。或者你可能是要用蠻力演算法,如果您想要速度慢,但效果更真實的算圖。

不是只有Mental Ray才能夠使用Final Gathering技術。其他渲染器如Turtle,這套算圖器能做兩件事,平滑化光子貼圖與根據撞擊點計算一次反彈的間接照明。

[jeremy回答]:Final Gathering只是眾多全局算圖演算法中的其中之一種技術。只要你有一套好的渲染器,其實你那麼不用擔心他不支援Final Gathering。

[joost_db說到]: 我讀了vray使用手冊,釐清了我的困惑。

我的結論(the bottom line)是,所有不同的GI算圖法(irradiance caching, irrandiance map, QMC, photon mapping, light cache等等),其實都是執行相同算式,只是用不同的解法而已。因此,它們之間的差異不是在根本上的不同,而是在得到結果的過程不同。所以這些算法可以得到產生非常相同結果,唯一的差異是算圖時間與品質會不一樣。

所以基本上,雜誌說他們使用“final gather” , 那只是他們的算圖設定的方法而已。我可以載入相同的場景,然後用vray, 並使用QMC, photon map, light cache等方法, 我能相同的結果----只是算圖時間會不同。

[Simon Lundberg回答]: 如果您在Vray的第一次反彈(primary light bounce)中設置成QMC, Vray將會以brute force演算法做運算。

如果是要計算寫實效果(studio lighting setups),我建議您盡可能使用irradiance caching。如果用irradiance caching算出來的品質不夠好,你可以考慮使用區域光(area lights)。

用自發光的平面(luminous planes)跟區域光(area lights)的優點比較起來,發光的平面算圖比較快(如果您使用的輻照緩存) ,而且他們的反射效果比較銳利。例如汽車反光效果(carpaint) !

[francescaluce回答]: 你講的完全不正確(exactly none)。如果你使用發光的平面作為反射來源,當照亮場景時,他回傳的資料會得到不吻合的照明感 而且這些資料難以被finalgather做平滑處理,尤其是在動畫上。

[joost_db說到]: 我詳細閱讀了您對final gathering, irradiance caching, photon mapping, unbaised methods等等方法的說明...我想我現在100 %了解了,但想要在更確定!

用vray能讓我選擇第一次反彈的計算法與第二次反彈的算法。當我選擇“Irradiance map”作為第一次反彈,這將在場景中散佈許多小點。對平坦表面的點會比較少,相對幾何體變化大的地方會有比較多的採樣點(聽起來就像您所說的Irradiance map) 。然後, 如果我使用qmc (我相信這是無偏差的演算法unbiased method)作為第二次反彈的計算法,然後設定成十次反彈, 根據先前的Irradiance map,QMC會發射大量的光線---但不是每個地方的光線密度都一樣,在Irradiance map分布較少的位置,會發射較少的光線,但是在Irradiance map分布較密的地方 ,會發射較多的光線...這樣說正確嗎?

如果上述是正確的....用這種方法就很道理了。純粹的無偏差算圖器Pure unbiased(例如Maxwell) ,其實浪費了很多時間在處理不需要有高品質GI的地方。上述方法(irr map + qmc)能夠得到百分之一百與maxwell一樣的效果,但是又沒有浪費時間在計算不需要高精度的區域。
因此,算圖品質幾乎相同,但計算較少

[Simon Lundberg回答]:完全正確,Maxwell “浪費”了很多計算時間。這就是為什麼他算圖很慢。但也不能說這種方法就是無偏差的。無偏差的定義是沒有任何的人為誤差計算(artifacts),但您還是會得到noise。Irradiance caching可導致細節損失與漏光(light leaks)。對於一個無偏差渲染器(unbiased renderer)這絕不會發生的。即使您使用irradiance caching作為第一次反彈, QMC作為第二次,你仍然會得到誤差。

第一次反彈(primary bounce )是由攝影機射到場景當中的。因此,如果您第一次反彈設定成irradiance caching,第二次反彈設成photon mapping,您會獲得一張標準的光子貼圖與最後收集,跟你用mental ray一樣。如果你用irradiance caching作為第一次反彈, QMC作為第二次反彈,在我看來,這樣做有點浪費,因為你在第二次反彈時還是用了QMC, 所以沒辦法幫你節省到多少時間阿。再者, 最後算圖效果還是會有irradiance caching產生的錯誤

我是建議使用光緩存(light caching)作為第二次反彈。Light caching就像是光子映射,不同的是光緩存是自攝影機發射光子而不是自燈光發射光子。它具有photon mapping大部分的優勢。用起來很棒。然後用irradiance caching或QMC作為第一次反彈(作為final gathering) ,以維持細節表現。

[Giorgio Luciano回答]:這真是有趣的討論。可能是因為拜vladoJeremy大師現身的關係。 Vlado是全世界最好的渲染器(譯者注: 指的是Vray) 開發者之一,Jeremy寫了一本關於Lightning and rendering的書!能在星期天下午學到這麼多東西真的很棒喔!

(翻譯完)


[相關文章]

3 comments:

Sai said...

真棒的資料~
不過個人覺得算圖差異最大的可能是在材質設定上,尤其是mr不吃其他材質,很麻煩。

aomay said...

學到很多觀念~~
謝謝了!

hammerbchen said...

謝謝 想不到還是有人在乎算圖理論的...那翻這篇文章就有意義了

不過 常常懂了一些東西 又會發現更多疑問 XD