標籤:
光與介質
基於物理的渲染和著色理論
此文對於程式員和美術製作人員都有很大的協助作用,希望你看完後對基於物理的渲染有個整體的理解,此篇翻譯的文章(The Comprehensive PBR Guide by Allegorithmic - vol. 1)基本上是從美術的角度來解釋基於物理的渲染,有時間我會把程式部分的知識再細緻講一下,包括理論和實現,我自己目前也在學習階段,主要在研究UE4的基於物理的渲染,希望在接下來的時間裡出一個比較詳細的文章來從程式員的角度詳細闡述實現原理。
By 風戀殘雪
部落格:http://www.cnblogs.com/ghl_carmack/
光是一種複雜的現象,因為它同時具有波和粒子的屬性。因此,建立了不同的模型來描述光的行為。作為製作貼圖的美工,我們關心光-射線模型,因為它描述了光和介質是如何互動的。對於我們來說,理解光線如何跟介質表面互動很重要,因為我們的工作就是要製作描述那個表面的貼圖。我們製作的貼圖和材質用來在虛擬世界中跟光線互動,我們對光如何表面瞭解得越多,我們製作的貼圖看起來就越好。
在這個指南裡面,我們會討論物理背後的理論,它是基於物理渲染的模型的理論基礎。讓我們從光線說起然後逐步擴充到基於物理渲染的關鍵因素。
光線(Light Rays)
光線模型表明光線在比如空氣等的均勻透明介質中沿直線傳播,它也表明射線在遇到不透明物體的表面或者穿過不同介質(比如空氣到水中)時會有一個可以預測的行為。這樣,顯示光線從一個起點開始到最後轉換成另一種形式的能量 比如熱能的路徑便成為可能。
到達表面的光線叫做入射光線,到達表面跟法線形成的夾角叫入射角,01所示。
光線在兩種介質交界入是入射的。當光線到達表面時,兩者之中或者兩者全部會發生:
- 光線反射離開表面,並且以另外一個方向傳播。它遵循反射定律,反射角等於入射角(反射光線)。
- 光線從一種介質進入另外 一種介質直線傳播(折射光線)。
此時,我們可以說光線分為兩個方向:反射和折射。在表面,光線被反射或者折射,也可以最終被介質吸收。然而,吸收並不發生在表面。
圖01
吸收與散射(透明與半透明)
當光線在非均勻介質或半透明材質中傳播時,光線可以被吸收或者散射:
- 通過吸收,光的強度由於它轉換成另外一種形式的能量(通過是熱能)而變小,它的顏色也會因為對不同波長光的吸收不同而發生改變,但是光線的方向不發生改變。
- 通過散射,光線的方向隨機發生改變,偏差的大小 取決於材質。散射隨機改變光的方向但是並不會改變強度。耳朵是一個很好的例子,因為耳朵很薄(吸收少),所以你可以看到散射的光從耳朵背後射出。如果沒有散射而吸收又很少,那麼光線可以直接穿過諸如玻璃的表面。比如,你在一個池子裡面遊泳,希望它是乾淨的,那麼當你開啟雙眼時,你會在乾淨的水中看很遠的距離。然而,讓我們假設在同一個池子中,但是不很髒,水中的小顆粒會散射光,這樣水的能見度就會低很多。
光線在這樣的介質或者材質中傳播得越遠,它被吸收或散射的就越多。因此物體的厚度對光線吸收或散射的程度起一個絕對性的作用。那麼一個厚度貼圖可以用來描述Shader中物體的厚度,02所示
圖02
漫反射和高光反射
高光反射是在表面被反射的光,就如我們在光線部分討論的。光線經反射離開表面並且沿一個不同的方向傳播。它遵循反射定律,在一個完全光滑的表面,反射角等於入射角。然而,大多數表面是不規則的並且反射的方向會根據表面的粗糙度來隨機改變,知道這一點很重要。它改變了光的方向,但是光的強度並沒有改變。
粗糙的表面會有一個較大且較暗的高光。光滑的表面會保持高光聚集,這樣在特定的角度下它看上去會更亮或者說更強。然而兩種情況下都是同等數量的光能被反射,3所示。
圖03 越粗糙的表面有越大、越暗的高光
漫反射是經過折射的光。光線從一種介質傳輸到另外一種介質並且在物體內部散射了多次。然後它又被折射離開物體進入原來的介質裡面,並且位置跟第一次進入時的位置差不多是同一個點,如果圖04所示。
圖04
漫反射材質是很能吸收的,這意味著如果折射的光線在材質裡面傳輸過長的 話,它很有可能被完全吸收。這意味著光線不會從材質裡面出來,它可能並沒有傳輸多少的 距離。這就是為什麼進入和離開表面的點之間的距離可以忽略不計。在傳統著色系統中一直用於漫反射計算的Lambertian模型,不會計入表面粗糙度的影響,但是也有考慮粗糙度影響的Oren-Nayar模型。
同時擁有高散射率和低吸收率的材質有時候被稱為參與介質(participating media)或者半透明材質。比如煙、牛奶、皮膚、翡翠、大理石。使用額外的次表面散射模型來渲染後三種物體是可能的,該模型會把光線進入和出射的點的距離計算進去。精確渲染如煙和霧此類變化多端的低散射率和吸收率的介質需要諸如蒙特卡羅類比等更複雜的演算法。
微表面理論
理論上,漫反射和高光反射都依賴於光線相交表面的不規則程度,粗糙度對於漫反射的影響比較小因為散射發生在材質內部。因此出射方向基本上跟表面的粗糙度和入射方向無關。最深用的漫反射模型(Lambertian)完全忽略它。
在這個文檔裡,我們把表面的不規則程度叫做粗糙度。實際上,它也有幾個其它的名字,比如粗糙度、光滑程度、光澤度或者微表面,跟使用基於物理渲染工作流程有關,但是它們都是說的表面的同一個方面,它就是子紋素(sub-texel)幾何細節。
表面的不規則程式表現在粗糙度或者光澤度貼圖中,這取決於你使用的工作流程。一個基材物理的雙向反射分布函數(BRDF)是基於微表面理論的,它假設表面是由所謂的不同方向的微小細節表面組成。每一個微小的平面都會根據它的法線方向在一個方向上反射光線,05所示。
圖05
表面法線朝向光源方向和視線方向中間的微表面會反射可見光。然而,不是所有的表面法線和半形法線(half normal)相等的微表面都會反射光線,因為其中有些被遮擋(光源方向)或者掩蔽如05所示。
在微觀層面上不規則的表面會造成光的漫反射。例如,模糊的反射是由於光線的散射造成的。反射的光線並不平等,因此我們收到的高光反射是模糊的,06所示。
圖06在微觀層面上不規則的表面會造成光的漫反射
顏色
表面的顏色(我們人眼看到的顏色)是由於光源發射出的波長和它被 物體吸收以及反射的漫反射和高光所決定的。剩下的被反射的波長的光就是我們看到的顏色。
例如,一個蘋果的表面大部分反射紅色的光線。只有波長為紅色的光被散射回表面,其它的均被吸收了。07所示。
圖07
它也有跟光源顏色相同的高光,因為像蘋果這樣的絕緣體的表面的材質高光反射幾乎是獨立于波長的。因此,這種材質的高光反射是基本是都是沒有被修改過顏色的(跟光源的顏色相同)我們會在接下來的章節中討論不同材質(金屬和非金屬)。
雙向反射分布函數(BRDF)
雙向反射分布函數簡單來說就是一個描述表面反射屬性的一個函數。在電腦圖形學中,有很多的不同的BRDF的模型,其中一些並不是基於物理的。一個BRDF要滿足基於物理的特性,它必須是能量守恒的且相互的。對於相互的,我是指亥姆霍茲倒易律,它表明入射和出射光線可以在不影響BRDF值的情況下相互交換。
Substance使用的基於物理渲染的著色器(shaders)是基於迪斯尼的理論反射模型的(虛幻引擎的也是基於這個理論修改簡化而來),它是基於GGX微表面分布。GGX在高光分布上要比其它方案好,它有一個較短的高光峰值和在衰減的部分有一個較長的尾部,這樣它看上去就比較真實。08所示。
圖08
能量守恒
能量守恒在基於物理渲染的解決方案中扮演著關鍵的角色。它表明被表面重新發射的光的總能量(反射和散射回來的)是小於它接收到的能量的總數的。換句話說就是,經過反射離開表面的光不會比到達表面的光的強度更強。作為美術,我們沒有必要擔心如何控制能量 守恒。這是基於物理渲染的最好的一個方面,能量守恒通過 著色器(shader)來強制保證。它是基於物理模型的一部分,這樣我們就可以花更多的時間在如何製作出好的效果上而不是關注於物理實現上。
菲涅爾效果(Fresnel Effect)
菲涅爾反射因子作為BRDF的一個係數在基於物理渲染中也是一個非常重要的角色。由法國物理學家Augustin-Jean Fresnel發現的菲涅爾效果聲明你從一個表面看到的反射光線的數量取決於你接收它時的觀察角度。
比如,假設有一池水,如果你垂直於水的表面直接向下看,你可以很清楚的看到底部(假設水比較清澈)。以這種方式來觀察水的表面基本上為0度或者說是沿法線入射,法線是指表面的法線。現在,如果你以一個切線入射方向來觀察水的表面,盡量平行於水面,那麼你會看到水面上的高光反射變得更強,並且你可能完全看不到水底的樣子。
基於物理渲染的菲涅爾效果並不像我們在傳統著色模型中使用的那樣。再次重申一次,它是基於物理渲染的著色器處理的另外一個物理特性。當在一個切線入射角觀察表面時,所有光滑的表面在入射角為90度時會成為一個百分百的反射器。
對於粗糙表面來說,反射中高光部分會更多,但是不會達到百分百的高光反射。這個時候起決定作用的是微表面的法線和光線的夾角而不是宏觀表面的法線和光線的夾角。因此光線被分散到不同的方向,反射會變得更柔和、更暗。在一個宏觀層次上,你看到的效果可能 是微表面所有 菲涅爾效果的一個平均效果。
F0 (在0度角的時候菲涅爾反射值)
當光源垂直(0度角)到達表面時,其中一部分光作為高光反射回來。使用表面的折射率(IOR),你可以推匯出反射回來的數量,這個值就被稱為F0(Fresnel 0),09所示。被折射進入表面的光源的數量被稱為1-F0。
圖09對於粗糙表面來說,反射中高光部分會更多,但是不會達到百分百的高光反射
對於普通的絕緣體來說,F0的值一般在0.02到0.05之間,而對於導體來說F0的範圍一般在0.5到1.0之間。因此 ,表面的反射能力是由下面的折射率公式決定的,10所示,它來自於Sebasien Lagarde‘s "Feeding a Physically-based Shading Model"這篇博文。
圖10
F0的反射值是我們需要在製作貼圖的過程中需要關注的。非金屬(電介質/絕緣體)一般是一個灰階值,而金屬(導體)會有一個RGB值。關於基於物理的渲染且從一個美術的角度來解釋反射,我們可以說對於 普通的光滑絕緣體表面,F0會反射2%到5%的光線,而在切線角時會反射百分百的光線,09所示。
電介質的反射值 變化的並不劇烈,實際上,改變粗糙度時實際值的變化基本上看不出來。然而 ,值會有所不同。在圖11裡面,你可以看到一個展示金屬和非金屬材質F0範圍的一個圖表。
注意非金屬的F0的範圍並不會跟其它非金屬有很大的不同。寶石是一個例外,它們有較高的值 。我們接下來會討論F0,因為它跟導體和絕緣體有比較大的關係。
圖11
導體和絕緣體(金屬和非金屬)
當建立基於物理渲染的材質的時候,我發現以金屬和非金屬來思考如何製作是很有用的。我會問自己這個表面是金屬還是非金屬。如果 是,我會遵循一系列準則,如果不是我會遵循另外一些準則。這個方法可能過於簡單,因為有此材質並不會簡單的歸為金屬或者非金屬,比如准金屬,但是在建立材質的整個過程中,區分金屬和非金屬是一個好的方法,除了准金屬是個例外。為了給製作材質設定一些規則,我們首先必須要理解我們要建立什麼。通過基於物理渲染,我們可以查看金屬和非金屬的屬性來建立準則。
折射光線被吸收,金屬的顏色來自於反射的光線,因此在我們的貼圖中,金屬沒有漫反射顏色。
金屬
金屬(導體)是熱和電的良好導體。簡單來說,導體金屬的電子場為0並且當一個由電和磁組成的光波到達表面時,其中的一部分被反射而另外一部分則被吸收。拋光金屬的反射值一般在70-100%一個很高的範圍內,12所示。
圖12
一些金屬吸收不同波長的光線。比如,金子吸收在可見光譜高頻地區的藍色光,因此它看上去會偏黃。然而 ,因此折射的光被吸收了,金屬的顏色來自於反射的光線,因此在我們的貼圖中,金屬沒有漫反射顏色。比如,在高光/光澤度工作流程中,純金屬在漫反射貼圖中顏色為黑色,在高光貼圖中反射值是一個上色的顏色值。對於金屬,反射值 是一個RGB值並且是可以調節色彩的。由於我們使用的基於物理的模型,我們需要給我們的金屬反射值使用真實世界測量的值。
另外一個關於金屬製作貼圖的一個需要注意的方面是金屬可以腐蝕。這意味著風化在金屬的反射狀態中扮演著一個重要的角色。比如,如果金屬生鏽了,那麼它就改變了金屬的反射狀態並且腐蝕的地區需要當做絕緣體材質來自處理,13所示。
圖13
噴漆的金屬會當做非金屬而不是金屬來對待。噴漆視為純金屬上的一個層。只有從掉落的漆裸露出來的純金屬才當做金屬來對待。同樣也適用於金屬上的塵土或者任何擋住純金屬的介質。
如我上面所述,我經常問自己一個材質是金屬還是不是。然而,更加精確地說,問題應該是擷取金屬的狀態,比如它是不噴漆,生鏽或者被塵土或者油脂遮擋。如果不是純金屬那麼它就會被當做電介質來處理,也有可能因為風化造成純金屬和非金屬的融合。
風化在決定金屬的反射狀態扮演一個重要的角色。
非金屬
非金屬(絕緣體/電介質)是電子的不良導體。折射光線被散射和吸收(通常會從表面重新發射)因此比起金屬來它們反射很少一部分的光線,這樣就得到一個漫反射顏色。我們前面說過,普通絕緣體的通過折射率計算的F0值在2-5%之間。這些值線上性空間中的範圍為0.017-0.067之間(40-75 sRGB)14所示。寶石是個例外,大多數的非金屬不會大於4%。
圖14
就跟金屬一樣,它們也需要真實世界測量的值,但是不透明材質的折射率很難找到。然而,大多數 常見的電介質的F0值不會變化很大,因此我們可以遵循一些指南來找出反射的值,我們會在卷2中介紹。
常見電介質的F0反射值在2-5%之間,通過折射率計算而來(IOR)。
線性空間渲染
線性空間如果展開來講就可以寫一整篇文章。因此,我們不會深入細節。然而,我們需要知道光照計算必須線上性空間完成。
簡單來說,線性空間渲染為光照計算提供了正確的數學方式。它為光照表現得跟真實世界一樣創造了一種環境。線上性鶴立是內,gamma值 為1.0。然而,為了讓我們人眼看起來正確,這些貼圖需要使用sRGB編碼。在Substance中,如果 圖片標記了sRGB,那麼它會被轉換到線性空間為了以後的計算,最後會轉換成sRGB編碼來顯示到螢幕上。然而,當你在紋理裡面儲存僅代表粗糙度或者金屬度的數值時,這些圖片需要線上性空間。
Substance自動處理線性和sRGB空間轉換作為轉入,也會對渲染視口中計算的結果進行gamma校正。作為美術人員,你不需要關心Substance中的線性空間的計算和轉換。當通過Substance整合外掛程式來使用Substance材質的時候,線性空間的轉換會自動處理。
然而 ,理解過程很重要,因為當Substance貼圖用來作為匯出位元影像並且不是使用Substance材質時,你或許根據你使用的渲染器需要手動處理轉換。你需要知道基礎顏色/漫反射顏色是在sRGB空間,而其它的是線上性空間的。
關鍵點:
現在我們已經瀏覽了基本物理渲染背後的基礎理論,我們可以得到基礎物理渲染的一些關鍵點。
- 能量守恒。一個反射光線是不可能比它達到物體表面時更亮的。能量守恒是由著色器(shader)來保證的。
- 菲涅爾。雙向反射分布函數由著色器來處理。F0反射值對於常見的電介質都差不多,範圍在2-5%之間。金屬的F0值範圍比較大為70-100%之間。
- 高光強度通過雙向反射分布函數來(BRDF),粗糙度或者光澤度貼圖以及F0反射值控制。
- 光照計算是線上性空間進行的。所有gamma編碼過的貼圖,比如基礎色或者漫反射通常是通過著色器來轉換到線性空間的,但是你可能需要在你的遊戲引擎或者渲染器裡面通過選擇相應的選項來確保正常轉換。描述表面屬性的貼圖如粗糙度,光澤度,金屬度或者高度圖應該被設定為解釋成線性空間的。
參考:
1. Physically-Based Shading at Disney Brent Burley, Walt Disney Animation Studios.
https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf
2. Microfacet Models for Refraction through Rough Surfaces
http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf
3. Feeding a Physically-Based Shading Model by Sebastien Lagarde
http://seblagarde.wordpress.com/2011/08/17/feeding-a-physical-based-lighting-mode/
4. An Introduction to BRDF Models by Daniël Jimenez Kwast
http://hmi.ewi.utwente.nl/verslagen/capita-selecta/CS-Jimenez-Kwast-Daniel.pdf
整個檔案也可以下載pdf: http://files.cnblogs.com/files/ghl_carmack/%E5%9F%BA%E4%BA%8E%E7%89%A9%E7%90%86%E7%9A%84%E6%B8%B2%E6%9F%93%E7%90%86%E8%AE%BA.pdf
基於物理的渲染詳盡指南 卷1光與介質:基於物理的渲染和著色理論