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


原文鏈接:http://www.marmoset.co/toolbag/learn/pbr-theory

近來,基於物理的渲染(PBR)是一項令人激動的實時渲染的趨勢。這個術語包含了很多內容,通常會讓人產生困惑,以至於不明白它到底是什么。因此我將使用試圖解釋下,什么是基於物理的渲染,以及它和以往的渲染方式的區別。這篇文檔主要是給非技術工程師的,並且文中不會有任何數學和代碼。

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

在講解基於物理的渲染的新內容之前,我們會從一些基礎的內容開始講起。如果你已經知道下面要講的內容了,你應該會認為這是非常值得閱讀的。或許你可以去看看 Joe Wilson 的名為 creating PBR artwork 的文章。

散射(Diffusion)和反射(Reflection)

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

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

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

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

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

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

能量守恆(Energy Conservation)

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

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

這種能量守恆是基於物理渲染的重要的部分。這可以讓藝術家在符合物理定律的基礎上調整散射和折射值。然而一個好的藝術效果並不是必須在代碼中強制加上這些限制,只是作為一個參考物理概念(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM