標籤:

##譯## The Comprehensive PBR Guide by Allegorithmic — Vol.2

這是關於Substanced的PBR指南翻譯的第二篇。按慣例,先給出PBR-Guide的地址:

PBR-Guide


前言

在Vol.1中我們了解了一些關於PBR的基本概念,在Vol.2中會落實到具體的PBR工作流程中,指出在PBR工作流程中關於紋理的繪製以及作用。

PBR中的兩種流派

PBR是一套特定的流程,但是在流程背後可以有不同的實現方式。在PBR-Guide中將工作流程分成了兩個流派:Metal/RoughnessSpecular/Glossiness。在Substance系列的軟體中均支持這兩種流派。

在這兩個流派中都有它實現上的優點和缺點,沒有哪個優於哪個的說法(一切都是習慣問題)。總的來說就是:使用不同的流程達到同一個效果。

可以看到,在這兩個流派中關於ambient occlusion、normal、height紋理是公用的。區別就是在於另外的紋理上。

啥是PBR?

在了解PBR流程之前,先簡要的介紹一下什麼是PBR?

PBR的全稱是Physically Based Rendering。是一個著色和渲染的方式。PBR提供了關於光和表面如何交互的更精確描述。通常叫做Physically Based Rendering(PBR)或者Physically Based Shading(PBS)

PBS的叫法通常用於著色的有關概念中。PBR的叫法通常用在渲染和光照中。只要知道它們是同一個東西,只是叫法不同

使用PBR的好處!

對於藝術家/設計師而言PBR的好處如下:

  1. 由於演算法和方法是基於物理的精確公式,易於創建真實的物體(不用去猜測一些表面屬性)。
  2. 在光照模式下物體看上去更精確
  3. 提供相對一致的製作流程

對藝術家們意味著什麼?

作為藝術家們,需要考慮到用不同的紋理如何描繪物體表面的屬性。在PBR工作流程下是有規律去遵守的。這意味著藝術家們可以丟棄一些傳統流程的概念了!!

在PBR中,Shader幫助處理了能量守恆和BRDF,所以藝術家們只需要遵循物理來專註繪製紋理。在PBR-Guide中也提到,縱然遵循物理是很重要的,但是偉大的藝術家們都是有「脾氣」的,可以憑著自己的直覺繪製一些紋理。像迪士尼的PBR一樣,它不是嚴格意義上的物理模型,它在遵循物理的基礎上,更多的是帶來藝術美感。

所以,我們需要理解的是PBR背後的原理,利用它的規則。而不是被PBR所束縛


開始介紹PBR的兩個流派

Metal/Roughness工作流程

Metal/Roughness工作流程(因為我懶,後面就簡寫為M/R吧)定義了一系列的紋理提供給PBR Shader採樣使用。

從上圖中可以看出來,在M/R流程下定義了三張紋理:Base ColorMetallicRoughness

Base Color Map — (RGB - sRGB)

在Base Color Map是一張RGB紋理,其中定義了兩種類型的數據:電介質的漫反射顏色和金屬的反射率。如下圖:

顏色 — 代表了電介質的漫反射顏色

反射率 — 代表了反射率(這需要結合Metallic map使用)

先來說說電介質的漫反射顏色:

在我們的潛意識中的物體往往會比實際更亮一些。比如:煤。雖然煤很暗,但是它不是完全黑的(值為0)。所以通常顏色值是在一定的亮度範圍內的。在PBR-Guide中指出,暗色的值最低應該在30~50之間。亮色的值不應該超過240。 如下圖:

除此之外,光照的信息是不能繪製在這裡面的。有一種情況除外:微表面的遮擋(micro-occlusion),這種情況由於Shader中不能處理所以這個光的遮擋信息是可以繪製的。但是這也要遵循顏色值的亮度範圍。如下圖:

對於電介質,它的反射率(F0)是硬編碼寫死在Shader中的,通常是4%。 如果我們要手動設置這個F0,在Sustance Designer中可以使用"specularlevel"輸出節點。

再來看金屬的反射率:

在Base Color Map中,金屬區域的值表示的是反射率。這個反射率應該是遵循真實世界的。即先前文章中提到的70%~100%的反射率,對應的顏色值就是180~255之間。

這裡有一篇Dontnod的關於各種材質的顏色值的參考文章,大家可以看看:

Physically based rendering chart for Unreal Engine 4

Base Color Map的總結:

  1. 顏色值代表了電介質的漫反射以及金屬的反射率
  2. 在Base Color Map中應該避免存在光照信息,除了micro-occlusion
  3. 顏色最低的值應該在30~50之間,最高的值應該不大於240
  4. 純金屬物質的反射率應該在70%~100%,對應的顏色值為180~255

Metallic Map — (Grayscale)

在說Metallic Map之前,我們要先做個鏈接。就是上面的Base Color Map中包含了金屬的反射率和電介質的漫反射,這些應該與Metallic Map結合使用的。另外有一種比較特殊的情況:金屬物質可能被腐蝕/弄髒。那麼這個時候我們應該把這些區域的反射率降低,甚至當做非金屬來處理。

Metallic Map的使用和Mask相似,它告訴Shader如何解釋Base Color Map中的數據。比如:如果這時候Metallic的值為0,就是告訴Shader:「嘿,我是一個電介質,請用將Base Color Map中相應區域的顏色值作為漫反射」。

Metallic Map是一張灰度圖。它用來定義什麼區域是金屬,什麼區域是電解質。正如我們上面說到的,他告訴Shader什麼區域要當做漫反射顏色(電介質)什麼區域要當做反射率(金屬)。在Metallic Map中,0代表電介質/非金屬,1代表金屬。如下圖:

對於純金屬

Metallic Map對於純金屬,他的灰度值通常在235~255之間。對應Base Color Map中70%~100%的反射率(顏色值範圍在180~255之間)。

對於電介質或腐蝕金屬

因為天氣原因,可能金屬會被腐蝕。或者金屬可能被噴上一層漆。這個時候金屬應該被當做非金屬處理。相反的,如果被噴漆的金屬,在噴漆處有劃痕,那麼裸露出的部分應該也還是金屬。

Metallic Map可以看成是金屬和非金屬物質之間的混合。比如:金屬上的臟區域,它在Metallic Map中的值應該是低於235的,這意味著在Base Colo Map中的反射率應該是低於70%的。這會產生一個關於純金屬與完全非金屬之間的一個過渡。如下圖:

Metallic Map的總結:

  1. 在Metallic Map中,0代表非金屬,1代表金屬
  2. 如果Metellic Map中的值低於235,Base Color Map中的反射率應該也要相應降低

Roughness Map — (Grayscale)

Roughness Map描述了物體表面的不規則性,從而影響光的反射。

在Vol.1中我們有提到,粗糙的表面會導致反射光的隨機性,但是不影響光的強度。

在Roughness Map中,0代表平滑的表面,1代表粗糙的表面。

對於Roughness Map,沒有對錯可言,這取決於我們要使用的環境、元素等等。所以這完全是受到藝術家們的控制的。

Metal/Roughness流程的副作用

對於M/R工作流程,有一個副作用就是會產生白邊的人工痕迹。如下圖:

不僅僅是在M/R工作流程中,即使是在S/G工作流程中也有。只不過S/G中的人工痕迹是黑邊,相比於M/R更不容易發現。

種種情況往往是出現在從金屬到電介質物體的過渡之間。如下圖:

產生白邊的原因在於:對於金屬物質Base Color Map存在較亮的值,與非金屬的漫反射值在過渡區域插值之後產生了白邊。

解析度和紋素(texel)的密度直接影響了白邊的可見性。

所以我們要確保解析度,並且要確保UV提供了足夠的密度來匹配這個解析度。這樣可以讓白邊的效果降到最低。

Metal/Roughness工作流程的優缺點

優點:

  1. 易於創作,由於F0是寫死的,也不易產生錯誤
  2. 紋理佔用較少的內存,因為Metallic Map和Roughness Map都是灰度圖
  3. 有較廣的實用性

缺點:

  1. 不能控制電介質的F0
  2. 如果解析度以及紋素密度處理不當,會產生白邊

Specular/Glossiness工作流程

Specular/Glossiness工作流程(還是因為我懶,簡寫為S/G吧)和M/R流程一樣,同樣也提供了三張紋理給Shader採樣使用。

可以看到,S/G流程也定義了三張紋理:DiffuseSpecularGlossiness

首先,看到這裡有的人可能會懷疑一件事情:Diffuse?Specular?這兩個詞看上去和傳統流程中有點相似啊!關於這個疑惑,請參考我之前一篇文章:

Base Color Map/Albedo Map/Diffuse Map!!你們打一架好不好!!

然後,要說一點的是,縱然S/G流程和M/R流程的紋理繪製方式不同,但是它們最終的目的和實現效果是一樣的,僅僅只是數據的表現方式不同罷了。

Diffuse Map — (RGB - sRGB)

Diffuse Map是一張RGB紋理。

Diffuse Map僅僅包含了Albedo顏色(這裡我實在不知道怎麼翻譯好,Albedo區別於Diffuse的是不帶任何光照信息,就說他是沒有光照信息的漫反射吧),並不包含任何反射率。

由於Diffuse Map僅包含了Albedo,這意味著金屬區域的顏色值為0(因為金屬幾乎沒什麼漫反射,被吸收了)。非金屬區域有它的Albedo顏色。如下圖所示:

Specular Map — (RGB - sRGB)

Specular Map是RGB紋理。

Specular Map定義了金屬區域的的反射率以及電解質區域的F0。如下圖所示:

Specular Map允許給電解質定義不同的F0,這就和M/R流程不同了,M/R流程電解質的F0是寫死的4%。F0應該取自真實世界。電介質的F0將是一個灰度值,而金屬的反射率是一個顏色值(因為不同的金屬會吸收不同的波長,反射出不同的顏色)。

對於純金屬:

對於純金屬他的反射率應該取自於真實世界。與Metallic Map類似,如果純金屬受到了腐蝕,那麼Specular Map中的反射率應該降低,對應的Diffuse Map中的Albedo應該升高。如下圖:

對於電介質:

對於電介質,他的F0應該也是取自真實世界的。因為電介質有很弱的導電性,折射進入電介質內部的光會被散射(scattered)和/或吸收(通常會再次射出表面),因此電介質只會反射較少的光。

通常電介質的F0是在2%~5%之間,對應顏色值40~75 — 通過折射率Index of Refraction(IOR)計算出的。如果對於一些特殊的材質,如果找不到IOR的話,那麼就使用4%。

對於電介質有一個特例:寶石。寶石的F0通常是在5%~17%。

對於Specular Map的總結:

  1. Specular Map包含了電介質的F0和金屬的反射率 — 其實應該都是F0啦
  2. 因為電介質相比於金屬反射較少的光,所以電介質的F0通常在2%~5%之間,對應顏色值40~75
  3. 電介質中寶石是一個例外,它的F0在5%~17%
  4. 通常流體的F0在2%~4%之間
  5. 對於金屬物體,反射率通常在70%~100%,對應顏色值180~255
  6. 如果對於一些材質找不到他的IOR,那麼F0使用4%
  7. 4%到底意味著什麼? — 4%對應的是塑料的F0

Glossiness Map — (Grayscale)

Glossiness Map是一張灰度圖。它和Roughness Map類似,描述的是物體表面的不規則性。只是表示的方式和Roughness Map相反,Glossiness Map里0表示粗糙的表面,1表示光滑的表面。

Specular/Glossiness工作流程的副作用

還記得M/R流程的副作用是會產生白邊吧!那麼對於S/G流程也有副作用,就是產生黑邊。這是因為在S/G流程中,Diffuse Map表示的是沒有光照信息的漫反射顏色,所以它是從有顏色(電介質)到黑色(金屬)的過渡。所以在插值的時候會產生黑邊。

相比於M/R流程中的白邊,S/G流程中的黑邊更不容易被人發現。

讓黑邊減少到最低的解決方式和M/R流程相同,要有合適的解析度以及匹配的紋素密度。

Specular/Glossiness工作流程的優缺點

優點:

  1. 副作用不易被看出來
  2. 電介質的F0是完全可控的,不像M/R流程將F0寫死

缺點:

  1. 因為F0是可控的,所以在繪製過程中可能會出現不易發現的錯誤,導致打破了能量守恆定律。
  2. S/G流程中有兩張RGB紋理,相比於M/R流程中的一張會佔用更多的內存
  3. S/G流程中的術語和傳統流程中的術語相似,其實它們雖然叫法相同,但是表示的是不同的數據,會讓人產生疑惑。

總結

在PBR-Guide中,最後總結了M/R流程和S/G流程的兩張流程圖。大致的思路是:無論是哪種工作流程,先問問自己需要繪製的物體是否是金屬,如果是金屬走金屬的一套規則,如果是電介質那麼走另外一套電介質的規則。

M/R流程:

S/G流程:

在最後,有一些材質的F0值和反射率可供參考:

最後的說明:

  1. 在M/R和S/G流程中,有幾個公用的紋理我並沒有說到:Normal,AO,Height。打會兒有興趣的可以自行查找資料。
  2. 在文中有用到F0啊,反射率啊,IOR啊這些術語,就我個人而言是這麼理解的F0是通過IOR得到的,而F0和反射率表示的是同一個東西。如果我理解的不對,請廣大朋友們指正!!

補充:

1、關於M/R和S/G流程中白邊和黑邊的缺陷

在上面我們提到,要減少白邊和黑邊相應的做法是:要有足夠的解析度以及合適的UV來匹配紋素密度。

對於解析度肯定是很好理解的,那麼合適的UV來匹配紋素密度是什麼意思呢?

假設我們有一張2K的紋理,然後有一個相同大小的面片網格模型。那麼如果讓這張2K紋理映射到整個網格的UV上,那麼這就是匹配的!如果讓這張2K的紋理值映射到這個網格的中間一小塊區域,那麼這個時候就是不匹配的!如下圖:

灰色區域是一整個網格的大小,這張2K的紋理值映射到了他的中間位置。這個時候就會出現白邊!!


推薦閱讀:

VRay for SketchUp工業產品表現之煤油燈
VRay for SketchUp環境阻光(AO)的簡介與應用
支持導入任意貼圖的maya工具——材質管理器

TAG:渲染 | shader |