基於物理渲染的基礎理論(譯)

原文連接:http://www.marmoset.co/toolbag/learn/pbr-theoryhtml

近來,基於物理的渲染(PBR)是一項使人激動的實時渲染的趨勢。這個術語包含了不少內容,一般會讓人產生困惑,以致於不明白它究竟是什麼。所以我將使用試圖解釋下,什麼是基於物理的渲染,以及它和以往的渲染方式的區別。這篇文檔主要是給非技術工程師的,而且文中不會有任何數學和代碼。git

基於物理的渲染系統不一樣於以往的渲染系統,大部分更細節的緣由是關於光和表面的行爲。着色能力有了很大的進步,一些老舊的近似模擬的效果和製做方法能夠拋棄了。這就意味着技術工程師和藝術家都應該清楚的理解這些變化。github

在講解基於物理的渲染的新內容以前,咱們會從一些基礎的內容開始講起。若是你已經知道下面要講的內容了,你應該會認爲這是很是值得閱讀的。或許你能夠去看看 Joe Wilson 的名爲 creating PBR artwork 的文章。ide

散射(Diffusion)和反射(Reflection)

散射(Diffusion)和反射(Reflection),就是咱們平時所說的漫反射(diffuse)和鏡面反射(specular),這是描述光和表面交互的最基本的區別的兩個術語。大多數人在現實狀況中對這些概念很熟悉,可是也許並不知道其中的物理區別。wordpress

當光線到達表面邊界時,一部分會被反射(反彈)出去,方向是在法線的另外一邊的相反的方向。這個行爲很是相似於朝着地面或者牆扔出一個球,球會以一個相反的角度反射出去。在一個平滑的表面上,就會表現爲像一個鏡面同樣。鏡面反射(specular)這個詞一般用來描述這個效果。post

然而並非全部的光線都會被反射出去。一般一部分光線會穿到被照亮的表面的內部去。這部分光線可能被材質所吸取,或者在內部散射開。一部分散射開的光線會再次回到表面,射入眼睛或相機。這個過程有不少個名字:漫反射(Diffuse Light)、散射(Diffusion)、子表面散射(Subsurface Scattering),全部這些名詞說的是同一個事情。ui

吸取和散射光線對於不一樣波長的光線是有很大區別的,取決因而什麼讓物體着色(好比一個物體吸取了大部分顏色,可是散射藍色,那物體就表現爲藍色)。散射一般都是很均勻且雜亂的,能夠說是從全部方向上都是同樣的,這和鏡面有很大的不一樣。Shader 使用一個名爲 Albedo 的輸入來近似模擬,Albedo 是一個顏色值,它描述了光線的各類顏色散射出表面的百分比。有時候也用 Diffuse color 這個詞來表示,它和 Albedo 是一個意思。spa

半透明(Translucency)和透明(Transparency)

在一些狀況下,反射會變得更爲複雜,好比像皮膚、蠟這一類的材質,在材質內部光線有着很大散射距離。這時單一的顏色就沒法表現了,着色系統必須考慮到物體的形狀和厚度。若是物體足夠的薄,一般會看到光線從背面散射出來,這被稱爲半透明。若是幾乎沒有散射(好比玻璃),全部的光線徹底穿過了物體,這就是透明。這些行爲和普通的近表面反射有着很大的不一樣,須要特殊的着色器來模擬。excel

能量守恆(Energy Conservation)

經過以上這些描述,咱們有足夠的信息得出如下的結論,散射和反射是相互獨立的。由於,爲了讓光線被散射,光線必須先進入表面,這就意味着沒有了反射。這就是「能量守恆」這個說法的一個例子,也就是說離開表面的光線不會比落在表面的光線更亮。htm

這點很是容易在着色系統是實現:在漫反射着色以前,簡單的減去被反射的光線。這就意味着高反射率的物體看上去沒有了散射光,由於沒有光線進入物體表面,幾乎都被反射掉了。反過來也是正確的:一個有着更多散射的材質,就沒法有不少的反射。

這種能量守恆是基於物理渲染的重要的部分。這可讓藝術家在符合物理定律的基礎上調整散射和折射值。然而一個好的藝術效果並非必須在代碼中強制加上這些限制,只是做爲一個參考物理概念(nanny physicist),以確保不會偏離規則太遠或者在不一樣的光照條件下變得不一致。

金屬(Metals)

導電的材質,尤爲是金屬,由於一些緣由值得特別的說起一下。

首先,導體一般比絕緣體有更多的反射。導體一般表現出高達 60% ~ 90% 的反射率,而絕緣體比較低,在 0% ~ 20% 之間。這種高反射率阻止了大多數光線進入物體內部進行散射,讓金屬看起來很是的亮。

第二,導體的反射在可見光的光譜上回呈現出很大的差別,也就是說反射會呈現出色彩。這種色彩反射在導體中也是很少見的,可是它就發生在咱們平常會接觸到的材質上,好比黃金,銅,黃銅。絕緣體一般不會有這個現象,它們的反射不會呈現出色彩。

最後,導體一般會吸取而不是散射進入內部的光線。也就是說在導體理論中不會有任何的散射光線。現實中,每每有一些氧化物或者殘留物在金屬的表面,這些東西會散射少許的光線。

正是這種介於金屬和其餘物質之間的材質致使一些渲染系統採用「金屬度」做爲一個直接的輸入參數。在這種系統下,藝術家能夠指定材質表現爲金屬的程度,而不是僅僅明確的指定反射率和散射率。有時會更傾向於使用更簡單含義來建立材質,但這並非基於物理渲染的必須的特徵。

菲涅爾(Fresnel)

Augustin-Jean Fresnel 彷佛是一個咱們沒法忘記的已經去世的白人,主要是用他的名字表述了一系列的現象,他是第一個對這類現象作到精確描述的人。在他以前,很難去討論光的反射。

在計算機圖形學中,Fresnel 是指出如今不一樣角度上的不一樣的反射率。明確的說,比起光線正中表面,當光線以一個擦着物體表面的角度(Grazing Angles)射到物體上時更像是一種反射。這就意味着呈現了合適的 Fresnel 效果的物體,在邊緣將有更明亮的反射。咱們大多數人其實已經對此很熟悉了,而且這在計算機圖形學中也不是新的概念了。然而基於物理的渲染着色器對 Fresnel 方程的評估進行了一些重要的修正。

首先,對於全部的材質,在 Grazing Agnels 有着徹底的反射率,觀察一個平滑物體的邊緣,應該是一個完美的鏡面,無論是什麼材質。也確實是這樣的,任何一種物質當以一個正確的角度去看時均可以做爲一個完美的鏡面!這也許有點違反直覺,可是物理上就是這樣的。

其次,不一樣材質的 Fresnel 屬性隨着角度變化的曲線並非有很大的差異。金屬之間是差異最大的,可是也能夠被解釋分析。

這對咱們意味着,加入想要增長真實感,藝術家一般應該減少 Fresnel 現象的差別,而不是擴大這種差別。至少,咱們知道了如何設置默認值。

這是一個好消息,由於能夠簡化內容的生成。着色系統能夠徹底本身來處理 Fresnel 效果。只須要使用一些已經存在的材質屬性,就像是光澤(Gloss)和反射率(Reflectivity)。

基於物理的渲染的工做流有一個藝術家指定的某種「基礎反射」值。這個值提供了光線反射的最小數量和顏色。Fresnel 效果,一旦渲染,將會在藝術家指定的反射率上再進行疊加,在斜觀察表面角度(Glancing Angles)時會達到100%。這個值是一個基礎值,Fresnel 等式會接管這個值,使得表面在許多角度時根據須要產生更多的反射。

對於 Fresnel 效果有一個提示,當表面變得平滑的時候,Fresnel 效果會迅速的變得難以觀察到。

微表面(Microsurface)

上面描述的反射和散射都依賴於表面的朝向。放大來看,這被用來渲染網格的形狀,也可使用法線貼圖來描述更小的細節。這樣任何渲染系統均可以處理更多的細節,把反射和散射表現得更好。

然而,任然有一點沒有考慮到。大多數真實世界的表面都存在很是小的缺口:凹槽、裂縫、凸塊,這些都由於過小了以致於眼睛沒法看到,而且使用正常解析度的法線貼圖都沒法表現出來。儘管沒法被肉眼看到,但這些微粒仍是影響着反射和折射。

爲表面細節最容易在反射中被觀察到(散射並不會被太多的影響到,這裏不會討論到)。上圖中,入射光的平行線當從粗糙的表面反射是發生了交叉,由於每一條射線遇到的表面方向都不同。就像將球拋向牆面同樣,若是牆面很是不平整,球任然會反彈,可是反彈方向是不可預測的。簡而言之,表面越粗糙,越多的反射光線會產生交叉,看上去越「模糊」。

不幸的是,爲了着色而評估每個微表面特徵對美術、內存、計算量來講都是很是昂貴的操做。咱們該怎麼作呢?事實證實,若是咱們放棄直接描述微表面,取而代之使用總體的粗糙度,就能夠寫出至關精確的着色器來產生相似的效果。這個值一般指的是光澤度(Gloss),平滑度(Smoothness)或者粗糙度(Roughness)。能夠從紋理或者一個常量值中獲取。

這種微表面細節對於任何材質來講都是很是重要的,由於真實世界處處都是各類各樣的微表面特徵。光澤貼圖並非一個新的蓋面,可是它在基於物理的渲染中起到了關鍵的做用,由於微表面細節對光反射有着很大的影響。就如咱們一下子會看到的,有幾個關於微表面屬性基於物理渲染改善的注意事項。

再談能量守恆(Energy Conservation)

就如咱們假想的着色系統,考慮到了微表面細、合適的反射光延展,咱們也必須考慮到反射正確數量的光線。遺憾的是,舊的渲染系統在這一點上都是錯誤的,根據微表面的粗糙度反射了太多或者太少的光線。

當方程達到一個正確的平衡時,渲染系統應該顯示粗糙的表面爲大範圍的昏暗的高亮。全部的材質都反射相同數量的光線,粗糙的表面將光散射到不一樣的方向上,而平滑的表面反射爲更集中的光線。

這是能量守恆必須作到的第二個特徵。這是任何基於物理的渲染系統必須作到的要點之一。

迎接微表面(All Hail Microsurface)

基於以上的知識,咱們認識到一個事實,微表面的光澤度直接影響到表面反射的亮度。這就意味着藝術家能夠直接在光澤度貼圖上繪製各類差別,劃痕、刮擦等, 基於物理的渲染不只會改變反射方向並且會影響相對強度。再也不須要相似於反射率遮罩圖了。

這是很重要的,由於真實世界的兩個在物理上相關度量值(微表面細節和反射率)第一次在藝術上和渲染處理上被正確的聯繫在了一塊兒。這與以前描述的反射和散射的平衡很像,咱們可讓兩個值相互獨立,可是因爲它們是有聯繫的,企圖分別對待它們只會變得更困難。

經過觀察真實世界材質,反射率值不會不會相差太大。好比說水和淤泥,它們的反射率是相似的,可是因爲淤泥表面至關的粗糙,而水錶面至關的平滑,因此它們在反射率上看上去會相差很大。藝術家建立下面的這個基於物理渲染的場景時主要會建立不一樣的粗糙或者平滑的控制紋理,而不是調整反射率參數。

此外微表面屬性在反射上還有其餘的細微效果。例如邊緣變量的 Fresnel 效果在粗糙的表面上會變得不明顯(這是由粗糙表面更多的散射形成的)。凹的微表面會「困住」光線,致使光線會在微表面之間屢次反射,屢次進入描邊內部,被更多的吸取,更多的散射,亮度變暗。不一樣的渲染系統在處理這些細節上會使用不一樣的方法,可是粗糙的表面會顯得更昏暗上是趨於一致的。

總結

固然還有不少關於基於物理的渲染可說的,這篇文章只是一些基礎的介紹。想要了解更多的相關技術,推薦幾篇閱讀:

goto blog

相關文章
相關標籤/搜索