各種 Shader 的比較

Posted: 25 五月, 2007 in 電腦動畫
又看到一篇好文章
是關於各種shader的比較
應該是大陸那邊寫的
對岸這方面的文章真的很多  台灣就少得可憐   連書都粉少
大陸在這方面的研究跟進展  真的比台灣多很多 ………..
 
以下為轉貼
 
關於Renderman, MentalRay, Lightscape, Brazil, FinalRender的演算法討論

衆所周知,Renderman,MentalRay,Brazil,FinalRender,Lightscape都是一流的渲染器,孰優孰劣,大家都在網上討論了很多了。這 次我想從它們的演算法入手進行分析,看它們在演算法上的優劣,希望能讓大家對它們有更深入的瞭解,從而改進對渲染器的使用。

首先,每一個渲染器都基於一套基本的求解演算法,這些演算法的名稱大家都已耳熟能詳了。基本渲染演算法有三種:Scanliner(掃描線 )、R aytrace(光線跟蹤)、Radiosity(輻射度)。Scanliner與Raytrace都爲大多數軟體所採用,而Radiosity就只有 BMRT與Lightscape採用。
Scanliner最早被開發,應用亦最廣泛。其中Renderman的REYES(Render Everything You’d Ever Seen)演算法是Scanliner的最極致的發揮,但也表示Scanliner已經走到了盡頭了。Raytrace的應用越來越廣泛,它最初用來求解非漫反射 面之間的光能傳遞,即反射與折射的類比。後來分散式光線跟蹤與雙向光線跟蹤得到長足發展,特別是先進的有限元採樣演算法得到發展後,光線跟蹤也被應用於漫反射面的光能傳遞求解。MentalRay的Global Illumination、Brazil、FinalRender就是很好的例子。其中,分散式光線跟蹤的演算法決定了軟體輸出的質量。 MentalRay假定每個元面都有一 張P hotonMap(在雙向光線跟蹤演算法的創始人Arvo(ARVO1986)的論文中叫Illumination Map),在PhotonMap上投射光線採樣,然後把PhotonMap像Texture一樣貼在元面上。所以MentalRay必須設定光線的大小 (Radius)以方便在 PhotonMap上採樣。這樣保證了速度,但要在有豐富經驗的人調較下才能渲染出高質量的圖片。Brazil直接用半球體採樣,用立體方位角投射到元面表面,類似於Radiosity演算法的立方體採樣,但Brazil通過控制輻射殘差來加快速度,也犧牲了質量,所以在採樣不足的情況下, Brazil渲染的質量是最差的。FinalRender用有限元採樣,同時保證了速度和質量。有限元是一種結合Radiosity的採樣方法。

Radiosity 是在80年代末發展起來的渲染演算法,它採用熱力學的輻射積分式:B(x)=E(x) + p(x)$B(x’)[cos(x)cos(x’)/pi*r^2]*HID(dS(x),dS(x’))dA(x’),其中x’爲源元面,x爲目標元面,B(x)是x的輻射度分量, E(x)是x的源能量,p (x)是x的漫反射係數,$是對元面x積分,HID是遮擋函數(x與x’之間有遮擋爲0,沒有則爲1),dA(x)是x的面積。可以看到,R adiosity是通過對整個場景的表面都求解輻射度來達到類比光能傳遞效果。Lightscape的求解過程就是Radiosity的Shooting 過程,它採用空間四叉 樹演算法來加速求解,所以速度比較快。Radiosity渲染基於物理學理論,其渲染效果真實,是R aytrace所不能比擬的,但從視覺效果上考慮,現在Raytrace和Radiosity不相上下,在速度上,Raytrace更占絕對優勢。而且, Refract( 折射)、caustic(焦散效果)是Radiosity無法類比的(所以Lightscape也帶了Raytrace渲染器)。

第二,每個渲染器都有貼圖的優化演算法,這也是成敗的關鍵,因爲高級的渲染往往極依賴貼圖,像一些優秀的CG都“無圖不歡”甚至“無圖不成”,所以貼圖的質量是十分重要的!Renderman的優化演算法堪稱第一!爲什麽?它用了先進的改良式B-spline(B樣條) 演算法,克服了許多貼圖變形的問題,尤其是在同等元面由於鏡頭焦距不一引起的走樣( 因爲軟體常常假設同一元面在畫面上的解析度是一樣的,就導致當鏡頭對準元面中心,而元面兩極z值直差超過了MipMap或Liner的極限, z 值小的部分和z值大的部分之間的區域過度産生嚴重走樣,MR2用z值細分元面解決了問題,但造成了運算量的不必要增加)。在渲染器多如牛毛的今天,很多標榜光能傳遞的軟體都忽略了貼圖演算法的重要性,片面的加強實際上專業用戶並不需要的功能,捨本逐末。也是因爲如此,使用最原始的Scanliner的Renderman在今天能穩穩地坐在電影製作的第一把交椅上。
  
貼圖是渲染裏一個複雜的大系,它包括原始圖像的處理、合成,與幾何物體座標的互換,過程化的貼圖以及過渡性的貼圖(PhotonMap 和ShadowMap等)。貼圖也參加幾何變換(Displacement),燈光的定義(VolumeShader)以及鏡頭特效。

Max 向渲染器提供了貼圖的原始處理,可以讓渲染器直接使用它的輸出而專心於畫面的質量,它包括了圖形學裏的4X3種貼圖投射方式:( 平面、圓柱體、立方體、球面)~(表面向量、景物中心、中介面法向量)。其實真正有用只有:平面~中介面法向量、圓柱體~中介面法向量、立方體~中介面法向量、球面~景物中心、立方體~景物中心。所以不要盲目選擇貼圖方式。詳細的貼圖方式指引請參考《電腦真實感 圖形的演算法基礎》。

Maya的貼圖分爲Normal和Project(Stencil不在貼圖方式的討論之列),也就是UV和以上的四種貼圖表面(平面、圓柱體、立方體、球 面),當然,它還包含了衍生出來的三角平面和攝像機平面。

Renderman提供了更詳細的貼圖方案,但對普通用戶有用的只有ST(就是UV)和MayaUV(還是UV)。因爲在Renderman裏面要精確控制貼 圖必須寫Expression。

所謂的UV,就是指曲面座標。在我們看來,空間是三維的(用三個分量表示一個向量),而在曲面上看來,空間是二維的,如地圖上的經度和緯度一樣。要指出曲面上的一點,就要用向量v (u,v)表示。而貼圖則是平面的,要影射到空間的元面上必須用一種貼圖影射(就是以上討論的幾種):
在曲面座標上P(u,v)可以轉換成貼圖座標T(s,t),就是若曲面S(u[0,1],v[0,1])那貼圖就是T(s[0,Tmax_x],t[0, Tmax_y]),然後求螢幕座 標E (p)=Sp(u,v)=S'(u,v)=T(s,t),得到螢幕的顔色爲F(T(s,t)),F爲加工的過程。在max中選擇的貼圖方式就是S’。這就是貼圖在渲染器內的工作方式。

貼圖的合成主要是Renderman的結點式思想,這點在Maya中的已經得到體現,相信我不用在討論。但結點式Shader並不是Maya第一個使用,早在1 984年,Cook(著名圖形學家,提出了著名的Cook-Torrance光譜光照模型)就提出了左右結點的Shanding language。最初,Renderman就是這一思想的實驗産物,可以說Shading language導致了Renderman的誕生。所以Renderman的貼圖處理能力可以說是Renderman的看家本領了。

貼圖的反走樣:主要的方法有Liner(一次)、Quadric(二次)、Gaussian(高斯)、MipMap等。其中MidMap應用最廣泛,從 OpenGL到Dire ctX到MayaRenderer到Renderman的Script都可以看到它的身影。所以我們主要討論MidMap(其他的請“望文生義”吧)。

MidMap 的工作方式是在記憶體中建立一張比原始檔案還要大的正方形查找表,也就是N X N的陣列。大多少?例如:一張TIFF(256 X 256 X 24bit NoAlpha)的貼圖,MidMap將打開一個(512X512)+1的陣列。其排列爲(用圖形比較清楚):
———————————————
| | |
| | |
| | |
| R | G |
| | |
| | |
———————————————
| | | |
| R | G | |
| | | |
|——————–| B |
| R | G | | |
|———| B | |
| X | B | | |
———————————————

使用的時候計算在匹配的解析度下應使用哪一張Map。如此可見MidMap是一種的速度和質量可以達到最平衡的演算法。所以Maya以MidMap& #29234;缺省方式。

在貼圖的討論中,我們主要討論的是Renderman的貼圖,因爲其他的幾個軟體並沒有太多的貼圖文獻(而Renderman則幾乎每年的SIG GRAPH都有)所以不作討論。  

第三,我們來集中討論一下光能傳遞。

關於光能傳遞,相信有必要詳細敍述,因爲網上和市面的許多教材都存在片面的說法,許多使用光能傳遞軟體的人甚至寫教材的人都沒有比較扎實的光能傳遞理論基礎,這導致我們很多時候都無法發揮渲染器的最大潛能。這也是許多人就算用L ightscape、MentalRay也只能做出很“假”的圖的原因了。瞭解光能傳遞,就算用Max的渲染器也可以做出很真實質量很高的圖形。

所謂光能傳遞,就是物體表面反射物體吸收波長以外的光能在封閉環境中的面到面之間的傳遞。所以光能傳遞必須滿足:1、場景封閉;2 、場景內有原始的未被吸收的光能;3、傳遞方式爲面到面。

我們之所以看到物體有不同的顔色,是因爲物體表面屬性決定了物體吸收一定波長的光能,而不吸收的一部分反射到我們的眼睛裏,産生了顔色。如果一束全波段光波射到一白色物體和紅色物體上(兩物體靠近,都是漫反射面),則白色物體並不吸收任何可見波波長的光能(理論上,實際上它還是要吸收一部分),把接收的光能都反射出去。那麽紅色物體就吸收了除紅色波長以外的所有可見光光能,把紅色波長的光能反射出去。這樣,白色物體從環境中獲得的光能發生了不平衡,紅色光波的能量戰多數,於是,在實際中的以上情況,我們將看到兩物體之間發生了光能傳遞。 

還有一個例子,就是鏡子。因爲漫反射面十分粗糙,幾乎每個點的法線都不同,所以光能發射的方向不一,就造成了輻射現象;而非 漫反射面表面法線一致,所以光能反射方向一致,所有光能向同一方向反射,造成鏡面現象。

要注意的是,生活中我們是在一個封閉的空間中觀察物體的,就算是戶外,因爲空氣有散射作用,所以也可以算是封閉。就是在一定範圍內光能必須趨向平衡。所以幾乎所有的光能傳遞演示場景都是在封閉的室內,而室外的場景則必須添加大氣輻射。L ightscape中的完成百分比實際是它估算的環境內輻射平衡殘差(以後會討論),但也可以看作是封閉環境中剩餘的未平衡能量。

光能傳遞分成四種類型:漫反射~漫反射、非漫反射~漫反射、非漫反射~非漫反射、漫反射~非漫反射。這四種傳遞性質各異,難以以 統一的演算法求解,也導致了兩種完全不同的演算法的産生。 

Raytrace 光線跟蹤是最早開發來解決反射、折射的涉及非漫反射面參與的光能傳遞的演算法,它基於假設光線是一根沒有大小、長度的射線,從螢幕平面投射到場景中,與可見面相交;它完全遵守反射折射定律。所以R aytrace極其成功地解決了兩種傳遞:非漫反射面~非漫反射面 和 漫反射面~非漫反射面。

Raytrace 是逆向求解演算法,屬於遞迴演算法,其核心爲每次求交後調用自身再次求交,直到反射/折射深度達到最大值。因 234;場景內包含了大量的元面,所以光線跟蹤的大部分運算量都集中在求交上,則軟體的求交演算法極爲重要。B SP是最成功的求交演算法之一,MentalRay剛推出之時許多人都驚歎於它的快速就是因爲當時只有它應用了BSP。

BSP 叫(Binary Space Partition)空間二叉樹演算法,即把場景分成許多子空間,每個父節點都有兩個子節點。場景爲最大父節點,場景下包含兩個節點(左右節點),若左節點包含的元面數目大於閥值,則把左節點分成上下兩個子節點,再看上下節點中的元面數目……如此剖分直到子節點深度大於閥值。當求交時只需把光線與左右節點求交,若左節點有交則只需把光線與上下節點求交,最後把光線與確定的空間節點中的有限元面求交。這樣就可以節省大量無用的求交。

雖然Raytrace完美地解決了兩種傳遞方式,但在日常生活當中我們最常見的漫反射面~漫反射面的傳遞(除非您住在鏡子世界當中)它則顯得束手無策。1 984年美國Cornell大學和日本廣島大學的學者分別把熱力學中的輻射度方法引入到了光能傳遞求解當中,成功地類比了漫反射面之間的光能傳遞。於是R adiosity演算法問世了。

光能與熱能的性質十分相似,可以說光與熱是能量的兩種表現方式,光在理想漫反射面上的傳遞方式與熱力學的輻射方式近似。因୫ 4;熱是向熱力不均勻的地方傳遞的,而光也是向光能不平衡的地方傳遞的;而熱力輻射的方式是擴散的,光能在漫反射面上的反射也可以 近似表示爲擴散。

Raytrace 假設光線是沒有大小的一根射線,但漫反射面的表面十分粗糙,幾乎每一點上的發線都有不同程度的偏離。因爲是從螢幕上 出發向場景採樣,所以R aytrace也在某程度上用一根光線的大小抹殺了很多不能用有限採樣表示的資訊(如用320X240表示一個十萬面的球,則很多極點的元面被忽略,因爲螢幕上的光線只能和一個元面有交)。R aytrace無法較精確地採樣漫反射面上的光照資訊,那就更無法表現漫反射面的光能傳遞了。(但後來有了分散式光線跟蹤就另當別論了,下面會討論到)

Radiosity把元面上的光能看作整體,採用全局求解的方法,先把整個場景的光能分佈求出,再在螢幕上顯現。它不在受一條條的光線所限制, 而把能量一分分地送出去。

Radiosity 的演算法有很多種,其中最常用的爲逐步求精和空間四叉樹演算法。Lightscape把兩者結合起來,繼承了逐步求精法的耗大記憶體和空間四叉樹求解奇慢的“優點”,留了一個“大好”的印象給大家。其實R adiosity的求解核心是輻射度方程(見討論(一))。它的積分號表明了它不能精確求出輻射度的解的性質,所以用殘差估算和有限元演算法可以快速解決問題。因爲用R adiosity演算法的軟體並不多(好象只有Lightscape、FinalRender和BMRT吧),所以在此不多說了,如果有興趣知道更多的輻射度資料, 請和我聯絡。

(其實大家有必要知道Radiosity更多,因爲有限元度方法的出現令Radiosity活力大增,相信不久大家就會見到大批基於有限元度演 算法的R adiosity軟體的出現)

上面的演算法解決了三種傳遞方式,還有一種呢?就是Caustic!著名的聚焦現象。

因爲光在經過非漫反射面的傳遞後會出現集中聚焦、二次光源等現象,而一般的Raytrace和Radiosity都不能解決,於是誕生了雙向 光線跟蹤。

其實在雙向光線跟蹤之前還有一種很重要的演算法,就是分散式光線跟蹤。在Radiosity誕生的那一年,著名的圖形學家Cook發表了分散式光線跟蹤的論文。分散式光線跟蹤其實是一種非均勻的採樣演算法,但它通過j itter抖動來達到分散式的效果。比如說:螢幕上的一點要求解,則軟體通過jitter得到一張查找表(通常是16×16的),按照上面的抖動值換算螢幕上 的光線發射方向。這樣就可以避免了R aytrace“抹殺元面資訊”的行爲。 

在分散式的基礎上,Heckbert和Hanrahan提出了雙向光線跟蹤的思想。因爲光線應該是從光源出發射向物體的,但Raytrace則從螢幕出發射向物體再回溯到光源,所以一般的R aytrace被稱爲逆向光線跟蹤。這樣的好處是避免不需要的光線求解,簡化演算法,減少運算量。但這樣根本不利於光能傳遞的求解。雙向光線跟蹤的思想是在逆向光線跟蹤的同時進行正向的光線跟蹤。實際上雙向光線跟蹤是通過一張PhotonMap來實現的。

PhotonMap 是一張抽象的貼圖,它包裹在物體的表面上,當進行正向光線跟蹤時從光源到物體表面進行有限的光線採樣,光線交在物體上,但採樣結果表現在PhotonMap上,也就是說光線是射在PhotonMap上的。PhotonMap上的資訊是光線資訊,所以通過整理後可以得到精細的C austic貼圖,在渲染時要得到物體表面資訊可以直接從PhotonMap上得到相應的元面上的貼圖資訊。 

同理,使用PhotonMap的全局光照也是通過這樣的採樣方法達到光能傳遞的效果。

PhotonMap用在Caustic上是一種十分精確的方法,但在全局光照裏就屬於基於視覺上的演算法,並不精確真實。

 

留言
  1. ChienYu 說道:

    太專業了  看不懂

發表留言