光與介質 ios
基於物理的渲染和着色理論 程序員
此文對於程序員和美術製做人員都有很大的幫助做用,但願你看完後對基於物理的渲染有個總體的理解,此篇翻譯的文章(The Comprehensive PBR Guide by Allegorithmic - vol. 1)基本上是從美術的角度來解釋基於物理的渲染,有時間我會把程序部分的知識再細緻講一下,包括理論和實現,我本身目前也在學習階段,主要在研究UE4的基於物理的渲染,但願在接下來的時間裏出一個比較詳細的文章來從程序員的角度詳細闡述實現原理。 算法
By 風戀殘雪 api
博客:http://www.cnblogs.com/ghl_carmack/ ide
光是一種複雜的現象,由於它同時具備波和粒子的屬性。所以,建立了不一樣的模型來描述光的行爲。做爲製做貼圖的美工,咱們關心光-射線模型,由於它描述了光和介質是如何交互的。對於咱們來講,理解光線如何跟介質表面交互很重要,由於咱們的工做就是要製做描述那個表面的貼圖。咱們製做的貼圖和材質用來在虛擬世界中跟光線交互,咱們對光如何表面瞭解得越多,咱們製做的貼圖看起來就越好。wordpress
在這個指南里面,咱們會討論物理背後的理論,它是基於物理渲染的模型的理論基礎。讓咱們從光線提及而後逐步擴展到基於物理渲染的關鍵因素。函數
光線模型代表光線在好比空氣等的均勻透明介質中沿直線傳播,它也代表射線在遇到不透明物體的表面或者穿過不一樣介質(好比空氣到水中)時會有一個能夠預測的行爲。這樣,顯示光線從一個起點開始到最後轉換成另外一種形式的能量 好比熱能的路徑便成爲可能。學習
到達表面的光線叫作入射光線,到達表面跟法線造成的夾角叫入射角,如圖01所示。ui
光線在兩種介質交界入是入射的。當光線到達表面時,二者之中或者二者所有會發生:編碼
此時,咱們能夠說光線分爲兩個方向:反射和折射。在表面,光線被反射或者折射,也能夠最終被介質吸取。然而,吸取並不發生在表面。
圖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值的狀況下相互交換。
Substance使用的基於物理渲染的着色器(shaders)是基於迪斯尼的理論反射模型的(虛幻引擎的也是基於這個理論修改簡化而來),它是基於GGX微表面分佈。GGX在高光分佈上要比其它方案好,它有一個較短的高光峯值和在衰減的部分有一個較長的尾部,這樣它看上去就比較真實。如圖08所示。
圖08
能量守恆在基於物理渲染的解決方案中扮演着關鍵的角色。它代表被表面從新發射的光的總能量(反射和散射回來的)是小於它接收到的能量的總數的。換句話說就是,通過反射離開表面的光不會比到達表面的光的強度更強。做爲美術,咱們沒有必要擔憂如何控制能量 守恆。這是基於物理渲染的最好的一個方面,能量守恆經過 着色器(shader)來強制保證。它是基於物理模型的一部分,這樣咱們就能夠花更多的時間在如何製做出好的效果上而不是關注於物理實現上。
菲涅爾反射因子做爲BRDF的一個係數在基於物理渲染中也是一個很是重要的角色。由法國物理學家Augustin-Jean Fresnel發現的菲涅爾效果聲明你從一個表面看到的反射光線的數量取決於你接收它時的觀察角度。
好比,假設有一池水,若是你垂直於水的表面直接向下看,你能夠很清楚的看到底部(假設水比較清澈)。以這種方式來觀察水的表面基本上爲0度或者說是沿法線入射,法線是指表面的法線。如今,若是你以一個切線入射方向來觀察水的表面,儘可能平行於水面,那麼你會看到水面上的高光反射變得更強,而且你可能徹底看不到水底的樣子。
基於物理渲染的菲涅爾效果並不像咱們在傳統着色模型中使用的那樣。再次重申一次,它是基於物理渲染的着色器處理的另一個物理特性。當在一個切線入射角觀察表面時,全部光滑的表面在入射角爲90度時會成爲一個百分百的反射器。
對於粗糙表面來講,反射中高光部分會更多,可是不會達到百分百的高光反射。這個時候起決定做用的是微表面的法線和光線的夾角而不是宏觀表面的法線和光線的夾角。所以光線被分散到不一樣的方向,反射會變得更柔和、更暗。在一個宏觀層次上,你看到的效果可能 是微表面全部 菲涅爾效果的一個平均效果。
當光源垂直(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空間,而其它的是在線性空間的。
如今咱們已經瀏覽了基本物理渲染背後的基礎理論,咱們能夠獲得基礎物理渲染的一些關鍵點。
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