教程名稱:反射的奧秘--Philipp Zaufel關於3D中反射的理論概述
使用軟件:適用所有3D軟件
教程介紹:介紹了3D中反射的基本理論
原教程地址:http://www.the123d.com/tutorial/general4/reflections2-1.shtml
01.反射的奧秘-第二部分
在第二部分中Philipp Zaufel用通俗的語言描述了BRDF(雙向反射分布函數)--一個CG中最常用的用來描述材質反射行為的數學模型。
02.總論
BRDF-雙向反射分布函數,是用來描述材質反射行為的函數,是一個數學模型。這篇小教程是為藝術工作者寫的,而不程序員。有關BRDF的技術資料有很多,但我的目的是想讓你們了解如何讓它正確的工作,而不是大篇幅的羅列。BRDF在CG中無處不在。當你使用Phong,Blinn或者其它Shader的時候你就在使用BRDF模型。要是你用光線跟蹤製作反射,陰影或者產生GI效果的時候,你也在無形中使用著BRDF模型。
一個BRDF模型描述了一種表麵上入射和反射光線的關係。因此說簡單點就是光線射到表麵上,表麵對光線產生作用。光線可以被反射(鏡麵的或漫射的),吸收,或兩者都有。我們可以通過測量一種真實物體表麵上的反射和入射光線來描述這種材質和它形成的BRDF,測量的結果可以用在CG程序中來產生有相同表麵屬性的材質。但大多數情況下會使用簡化的,帶可調節參數的模型來產生CG表麵。這些反射模型可以是精確的,也可以是經驗化的。這裏我們關心的是精確的分析反射模型。因為它裏麵的參數或者說方程是基於真實世界的,並且為了能使材質疊加產生複雜的SHADERS,它們也使用在CGI中。像Robertson-Sandford和Beard-maxwell這些經驗模型,它們用的是虛構的參數來構建簡化的BRDF。下麵我會提到一些高級的反射模型。像BTDF,BSDF,BDF和BSSDF,這是為了澄清一個事實:一個BRDF隻是依據表麵屬性,入射光角度(同它的參數)和視角來描述光線的反射。
BTDF-雙向傳輸分布函數,描述了透明的表麵屬性,過程是通過矢量計算表麵的兩個方向(不是同一個計算過程)。BRDF和BTDF合起來就是BSDF,簡稱BDF--雙向散射分布函數,描述表麵上同一點處兩個方向的半球的函數。這些就是高級(鏡麵)光線跟蹤渲染的基礎函數。BSSDF--雙向表麵散射反射分布函數,它的發明者就是發明光子貼圖的那個人,Henrik Jensen。它描述了物體內部的光線散射。好萊塢,概論就這麼多,下麵我們一一介紹吧。
03.完美的漫射材質——Lambert
這是個非常簡單的模型,而且距今已有200年的曆史了。在CG場景中它無處不在。這個模型描述了一個完美的漫射表麵。入射光在表麵上向四周等量的散開,如果從不同的角度觀察表麵的話會看到同樣的顏色(各向同性)。唯一不同的是入射的角度。入射擊角為90度時表麵亮,反之則暗。這種模型在生活中是很常見的,但生活中這種的完美的漫射表麵非常少,這就是CG表麵看不去是電腦產生的表麵的原因。就因為它的速度相當快,而且非常普及,因此它成為實時渲染表麵SHADER中最常見常用的一個。
Gourad Sading是實時渲染技術中的一員,因為它不是基於每像素計算的,而是基於頂點的計算方法,計算頂點色值後在各頂點間運用插值算法來形成多邊形。(新一代的顯卡都支持實時像素陰影渲染,並且這些成熟的模型都成為了今天的標準,但這不是今天我們討論的話韙。)
這個模型大多數情況下在物理上是正確的,這意味著一些重要的物理規則被保留了。其中有一個就是反射光線的能量總和一定小於入射光線的能量。另一條是對不同顏色的吸收原則,比如說過渡色為黑色的物體吸收掉所有的入射光線,並不產生反射(過渡色——一個Lambert模型引申出的重要參數)。
04.Lambert的例子
上圖中的個球體都被賦予了Lambert材質。第1,2個是同一個球休的不同視角。圖中紅圈表示球上的同一個點。可以看到Lambert材質在不同的視角產生相同的顏色。第3,4個球體是同一個模型。它們反射的光線較前兩個少,第三個是BRDF的典型模型——環境色(ambient)。它隻是在整個圖像中增加了另一種顏色來模擬環境的光照,但這種方法沒什麼大用,因為它隻會讓你的圖像變的不真實。要模擬環境光的話試著多打幾個燈或者幹脆用GI。
05.簡易的鏡麵反射模型————Phong,Blinn-Phong.
上麵的圖顯示的是物理上真實的境麵反射--高光。左邊一個是Lambert,完美的漫射。紅色的入射光線反射後被等量的向四周反射。第二個是完美的鏡麵反射,渲染器用這個原理來產生完美的鏡麵,像鏡子等。第三個是反射模糊,反射光線由於表麵的微小凹突在鏡麵反射的路線上產生了偏移。現在我們已經了解了許多描述表麵上不同部分的模型,上麵介紹的隻是最簡單的幾個。還有一些描述不同類型鏡麵反射的模型(因為許多表麵都有不規則的地方)。最簡單的幾個:
1975年Phong Bui Tong發明的Phong模型,由於它的速度相當快,成為了CG表麵鏡麵反射應用最多最廣泛的模型。它不是物理上精確的模型,你可以設置高光的強度使發送的光線大於接收的光線,而這在現實中是不可能的。但因為CGI是一種藝術創作,那麼這也是可行的。
下圖中最左側的球體是Phong模型,這種模型的一大優點是你可以跟其它的模型混合使用來達到不同的效果。最常見的就是把phong跟Lambert混合產生第二個球體的效果。注意我用了相同的燈光照亮球體(位置,強度)。混合後的結果是高光變亮了。這樣做的優點是你可以調整模型中的不同參數(顏色,高光強度....)來達到真實的效果。右麵的兩張圖顯示了Phong的高光在入射角上和視角上都是獨立的。這個三維圖中的白色線框代表了藍色垂直入射光線在紅色板處反射的反射光線的方向和強度大小。入射點周圍的半球是完美的Lambert漫射,而由於Phong高光的存在在頂部有一小部分的突起。實質上Phong高光就是在入射光方向上產生了較強的反射,加上入射點周圍的高光區,再加上Lambert的漫射區形成了整個球體。當光線從另一個角度入射時隻是反射角度依據入射角=反射角定理變化。
Blinn-Phong模型,也叫Blinn,是Phong模型最常見的變化類型。做為CG領域的先驅,Blinn改進了Phong模型的一些高光上的問題。Blinn模型混合了Lambert的漫射部分和標準的高光,在速度上相當快,因此成為許多CG軟件中的默認材質。此外它也集成在了大多數圖形芯片中,用以產生實時快速的渲染。如下圖:這兩個球體使用相同的光照和相同的參數(Blinn和Phong高光的基本參數是相同的)。看上去上圖中的Phong球和下圖中的Blinn球沒什麼區別,除了Blinn球看上去更加柔和。但我們來看看不同角度下的反射值(圖3,4),就能看到非常明顯的區別。在入射角為90度的情況下反射就像是非常柔和的的Phong高光,但角度很小時高光的反射處明顯被撕裂。這是因為這兩個的BRDF模型的算法有微小的區別,但這有什麼用呢?
下圖說明了Phong和Blinn視覺上的不同。在入射角很小的情況下有個主要的區別。因此我為球體打了兩個燈,一個從頂部,一個從底部,都與攝像機成90度角。第一個是Phong球,第二個是相同條件下的Blinn球。結果是由於球體上三角麵的角度不同Phong的高光被扭曲了,但Blinn球保證了高光的完整性。好了,你可以根據你自己的需要選擇Phong還是Blinn,我個人認為Phong高光更正確一些,但Blinn高光的可控性更好。因為它可預測,特別是在複雜的表麵上,因此它被用做CG軟件中最基本,也最快的BRDF模型。圖中第3,4個球使用了光線跟蹤的鏡麵反射,反射出了一個環境,同樣是第一個用Phong,第二個用Blinn的BRDF模型。注意,許多渲染程序並不支持鏡麵反射渲染的BRDF模型,而是使用自己的聚焦算法。
你們可以看到Phong上相同的扭曲效果和Blinn球上清晰柔和的反射(渲染條件完全相同,唯一不同的是不同的渲染結果)。
06.背部反射:Minnaert,Hapkel/Lommel-Seelinger
到此我們已經了解了最基本的均勻漫射和高光反射部分的反射模型,但是Phong和Blinn隻適用於遵守入射角=反射角原理的鏡麵反射。現實中的表麵都會有各種各樣的缺陷,因此光線會以不同的方式散射----SSS特效或稱背部散射。
明顯,背部散射就是表麵在其背麵反射光線。為達到這種效果出現了許多不同的模型,同時還與其它的模型混合來達到更加複雜的效果。最常見的一個是Minnaert模型。它使用與Lambert相同的算法,隻是增加了一個使表麵變暗的參數來降低正常反射方向上的亮度。下圖中的第一個球就是Minnaert模型。它最初是用來描述月亮的BRDF的(基本Lambert反射加一點背部反射,世間少有)。Minnaert模型不允許有過大的背部散射值和邊緣光照效果。但由於它是基於Lambert漫射的因此它的速度相當快。而Hapkel/Lommel-seelinger模型就有一點複雜了,但是你也可以改變背部和前部的散射量來產生更多的光線散射效果。這些模型很廣泛的應用在表麵上有微小毛發的材質和天鵝絨材質,這些材質會在其毛發的頂部產生邊緣背部散射光線。第三個球體是Hapke/Lommel-Seelinger的一個變種,主要用來模擬帶有絨毛的纖維。我在其背部打了一個藍色的燈,以區別白色的過渡色。注意這些模型都加上了一些其它的參數,因為很少有渲染器能支持沒有更改過的純模型。
07.基於Lambert三角麵的高級粗糙表麵:Torrance,Sparrow,Cook,Blinn,Oren-Nayar
建立一個描述粗糙表麵的數學模型的想法很早就有了。Torrance和Sparrow1967年設計出了一個以表麵作為基準麵的BRDF(早於Phong)。基麵上分布有許多微小的三角麵,用它們之間形成的角度來描述表麵的粗糙程度。由於相鄰三角麵間形成的槽之間的角度正好相反,因此也叫它為V形槽。這個模型在物理上是正確的,因為它使用的是真實世界的參數來描述反射的分布,而且它具有波長獨立性,意思就是說表麵上的某一點因視角的不同而有不同的顏色。以後的幾種模型都是基於這個基本模型而建立的。
之後Cook和Torrance在1982年邁出了重要的一步(有時稱為Cook-Torrance模型,有時也稱為Blinn-Cook-Torrance模型,因為它也把Blinn模型考慮進去了)。它是一種由Blinn和Torrance-Sparrow混合而成的模型,也是物理上精確的並而渲染速度上有所改進,其中之一是集成了更多的三角麵分布函數。Torrance-Sparrow,基於著名的高斯分布;內建基於Phong式分布的Cook-Torrance;Trowbridge-Reitz和Beckmann分布。不過這隻是一小部分,重要的是集成了關於光線的計算信息,光線照射在三角麵上,依據兩個參數來反射。一個是著名的菲涅耳效應(簡單的說就是反射量依據反射角和表麵折射率--參見第一部分)。第二是基於自身的陰影投射和三角麵遮罩的幾何衰減因子,如下圖。
Cook-Torrance這種常見模型主要是建立高光和模擬金屬質感。有時也會混合Lambert的漫射部分,但由於它在物理上的正確性它不適用於藝術表現,而且它的速度也不是最快的一個。下圖的第一個球體是Cook-Torrance高光,在表麵粗糙度很小的情況下它跟Blinn高光的形態很相似。另一個常見的三角麵模型是Oren-Nayar模型(實際上我們常用三角麵模型是出於它的快速,而且它是Lambert漫射之外一個很好的選擇)。它是Cook-Torrance模型的一個簡易版,能建立漫射表和Blinn高光。我見過很多Oren-Nayar模型不同的應用方法,所以我很難解釋它。這中間很多不使用遮罩和自身陰影投射,也不把波長計算算在其中。大多數情況下這個模型看起來像Lambert漫射加上視線正對處的暗淡,再加上一些背部散射。下圖中的2,3號球是oren-Nayar模型的簡單渲染,畫圈的部位是同一點的不同視角,說明了反射值依據視角的不同而不同。我很喜歡這個模型,因為它比Lambert更具真實性。
下圖中的1號球是另一種Oren-Nayar模型的應用。它看上去更像沒有暗淡的lambert和背部散射的混合。不要問我它的算法是什麼,它隻是千萬種經典模型中的一個變種。2號球體是複雜表麵上的Oren Nayar漫射,帶有尖銳的Blinn高光。3號球體使用相同的設置,隻是漫射部分是Lambert,高光是Phong。
08.各向異性和序亂的模型:Ward, He, Schlick, Lewis, Lafortune等...
在上世紀90年代出現了大量的模型,而且有很多模型發展到了現在。這之中最流行的是He-Torrance-Sillion-Greenberg模型(1991--非常複雜,引入SSS特效,有著新型漫射部分叫直接漫射,基於物理真實和三角麵),Schilick模型(1994--類似遮罩的三角麵,漫射 和高光部分一起計算,支持各向異性的新算法),Ward模型(1992--帶有高斯分布的快速各向異性模型,物理上正確),Lewis模型(1993--也叫著名的經典cosine-lobe模型,物理上正確的Phong分布的擴展)和lafortune模型(1997--由於它是Lewis模型的普及,也叫普通版的cosine-lobe模型)。在一些3D軟件中你可以看到它們的應用,但軟件中不是用的它們的真名,因為軟件的程序員隻是用這些模型來達到他們特定的需求。這也是許多不同的模型存在的原因。舉例來說,如果你安裝了3ds max的第三方渲染插件和材質包,以及一些帶有BRDF模型的插件(像HairFX,MooDee shaders,Facialstudio),你會看到有20-30種不同的模型供你選擇。再讓我們來看看名向異性吧。到現在為止我們隻介紹了各向同性模型,就是說反射值不隨模型的旋轉而發生變化。同樣基本的三角麵模型也是各向同性的,因為三角麵的尺寸一樣,且在表麵上均勻分布。如果反射值隨攝像機的角度旋轉而不同也不能說明是各向異性的模型,就像我在第一部分裏講到的那樣,各向異性是你在某一方向觀察時表麵上的凹凸和刮痕表現出同一性。來看看圖片吧。
球1的高光是Ward模型。很像Blinn是嗎,但我認為這個看上去要好點,因為高斯分布使得高光處有更多的細節,不像Blinn那麼柔和。這個球隻是有高光,但是當你使用物理上正確的鏡麵反射光線跟蹤時你就明白我在說什麼了。球2就是Ward模型的光線跟蹤反射,球3是同樣條件下的Blinn模型。球2我使用了各向異性的參數,還做了一段動畫來看這個效果。有趣的是我也可以把Blinn模型弄成各向異性,這就是我所說的序亂的模型。你可以看到,Blinn模型上的各向異性有點問題,Blinn反射像平常那樣柔和,但左下的那道細長高光表現的非常尖銳,這不像我想像中的那樣。第三個球體是另個一種有趣的各向異性模型,它是finalshaders的distant fur,是3ds max的渲染插件finalrender stage-1的材質插件。它可以做為高級BRDF模型的很好的例子,它含有許多不同的基本BRDF模型和一些擴展的功能,能方便的使用戶創建他們想要的效果。
下圖中的1號球是在絨絨的粗糙球體上使用了柔和的不均等色和Lambert漫射。在做成動畫的時候不均等色也會使球體看上去模糊,像長絨毛一樣。2號球使用非常尖銳的各向異性高光來模擬油油的表麵。第3個球使用了自定義曲線來控製一個強大模型的光線反射分布。很遺憾這個類型的模型沒有在大多數渲染器裏得到支持,這種類型的著名模型有FALLOFF貼圖和Zauner模型。我希望在渲染程序裏能夠很好的整合鏡麵反射衰減和各向異性分布的自定義曲線。4號球使用Zauner模型來產生模擬的SSS效果。看來我們已經接觸到了SSS,好吧我們開始下一個話題吧。
09.高級渲染技巧和SSS模型:Kubelka-Munk,Hanrahan-Krueger,Jensen
首先,Kubelka-Munk和Hanrahan-Krueger模型跟高級渲染沒什麼關係。它們跟上麵講的模型一樣,跟表麵和攝像機有關,這兩個又跟SSS特效有關。實際上它們是跟SSS特效最有關的模型,除了He模型之外。但它們隻是處理表麵的漫射部分,就是說它們不能真的計算表麵下麵的光線來達到實現真實物理屬性的目的。這種技術需要新的渲染技術,像高級光線跟蹤算法(MONTE CARLO)和光子貼圖技術的支持。Kubelka-Munk模型是一個非常簡單的用來描述表麵上色素層的BRDF。它先考慮一層色素,下一步通過一個擁有眾多參數的函數來模擬多層表麵下的光線散射。就是說你可以指定表麵的層數,漫射和散射行為,吸收光線的顏色和厚度。
下圖的的1號球是Hanrahan-Krueger模型的動畫。紅色的過渡色是基本層,然會我在之上加了一層皮膚色的層,做成動畫。第二個球是複雜表麵上的Hanrahan-Krueger,打了背部散射的燈光來模擬毛發的細微模糊效果。這個模型模擬皮膚效果很好,特別是結合紋理貼圖的時候。但注意它隻是一個BRDF(R表示反射),畢竟有它的局限性。三號球是使用了正確物理屬性MONTE CARLO算法的SSS效果。這種效果很慢,你可以把它當做是加強的光線跟蹤算法,因為要從表麵上某一點發射出多條光線到場景中來收集必要的信息,這比隻發射一條光線要慢很多。這也可以是一種序亂的Lambert光線跟蹤算法,因為從這一點處的半球體射出的光線是隨機的。我不肯定MONTE CARLO算法的光線跟蹤渲染器是否考慮了BRDF模型,來達到多種效果的目的。典型的基於Lambert的電腦圖像看上去是死板的,這時典型的GI來到了,但這種算法渲染動畫的速度太慢了。因此,Henrik Jensen,光子貼圖的發明者(幾乎所有的渲染器都集成了這種特效)結合了這兩種方法各自的優點,它使用了普及化的Hanrahan-Kruger作為散射部分(直接散射和漫射)和一種優化的漫射逼進算法作為多重散射的漫射部分(加上菲涅耳效應),他稱他的這種快速SSS為BSSRDF寶貝。他成功了,看看Gollum,哈裏波特,或其它一些大預算的電腦動畫你就知道我的意思了。最後一個球體使用了Hanrahan-Kruger和低品質的MONTE CARLO的混合來加速SSS特效。
最後希望這篇講解BRDF模型的文章講到了你不知道的一些東西。如果你發現其中有不對的地方發EMAIL給我。
全文完