--- title: Strict PBR Shader with Substance description: Strict PBR Shader with Substance lang: zh-tw tags: PBR, RD, Article --- :book: Strict PBR Shader with Substance === ## :page_facing_up: Two Kind of PBS ![Imgur](http://i.imgur.com/3ChpIpq.png) ### Metallic - Roughness > Pros: * 比較容易製作,減少非金屬材質使用錯誤菲涅爾數值(F0)的狀況 * 較少的記憶體使用量(1張RGB+2張灰階) * 較廣泛的被大多製作流程接受 ![](https://i.imgur.com/AATTo7k.png) > Cons: * 對於非金屬類材質的菲涅爾數值(F0)沒有任何控制,除了某些軟體可以使用特殊的技巧來控制非金屬材質的菲涅爾數值 * 貼圖邊緣的白邊瑕疵比較明顯,特別是在低解析的狀況時。 :::info 之所以容易製作並且減少錯誤,是因為被限制在只能透過 Metallic 來控制 Diffuse 和 Reflection,因此反射能量總和不會超過接收的能量(energy conservation)。 但這個作法會讓所有非金屬材質的菲涅爾數值都相同,大約是塑膠(1.45~1.6)。 ::: ### Specular - Glossiness > Pros: * 物件邊緣的瑕疵比較不明顯 * 可以透過 specular map 控制非金屬物質的菲涅爾數值 > Cons: * 製作上容易使用錯誤的數值(比較不物理正確) * 較多的記憶體使用量(2張RGB+1張灰階) * 在用詞上容易和傳統的流程搞混,例如 Diffuse Map 就和傳統流程的貼圖完全不同。 :::info 容易錯誤的原因,是因為 Specular/Glossiness 流程在反射強度上,會透過 Diffuse 和 Specular 兩張貼圖來控制,這樣很容易在製作的時候做出不符合能量守恆的狀況,例如白色表面配上白色的反射,在製作的時候就很容易讓反射能量超過 1,相較於 Metallic 在反射強度上只需要透過 BaseColor 來控制,Specular/Glossiness 流程會困難許多。 ::: ### 邊緣瑕疵 邊緣瑕疵的原因,主要是貼圖的邊緣做顏色插集計算的關係, 兩種作法都會有,但黑色比較不明顯。 使用 Metallic/Rougheness 流程時, Base Color 在金屬部份是高亮度的顏色,這在模糊邊緣疊色會呈現白色, ![Imgur](http://i.imgur.com/ZfVwvTn.png) 使用 Specular/Glossiness 流程時, Base Color 在金屬部份是黑色,在模糊邊緣疊色會呈現黑色 ![Imgur](http://i.imgur.com/XtxEzts.png) :::info 雖然無法完全消除邊緣瑕疵的現象,但是透過適當的貼圖大小和 UV 比例,可以大幅的改善邊緣模糊的問題。 ::: ![Imgur](http://i.imgur.com/hwxTNpx.png) ![Imgur](http://i.imgur.com/XZobklT.png) ## :page_facing_up: Metallic/Roughness 流程的正確物理數值(顏色) ![Imgur](http://i.imgur.com/K3YV1Vt.png) ### Base Color (RGB - sRGB) :::info 這張RGB貼圖定義了兩個資料,非導體的反射顏色(diffuse and reflection color ),以及導體的反射強度(當該區域被定義為 metal 時)。 ::: ![Imgur](http://i.imgur.com/aTlPGBT.png) * 必須排除材質上的光線資訊 * 暗色的 RGB 數值應介於30~50之間(需嚴格限制) * 亮色的 RGB 數值不應高於 240 這些顏色上的限制除了符合物理正確, 也是為了保留數值空間讓環境因素(燈光、反射等等)使用, 在使用 PBR 流程時必須嚴格檢查 Albedo/BaseColor 的 RGB 數值。 ![Imgur](http://i.imgur.com/n4nwigK.png) ### Metallic (Grayscale - Linear) :::info 這張灰階貼圖用來定義該區域為金屬或是非金屬物質,類似遮罩的性質。 Metallic 本身沒有物理數值上的含意,僅用來解釋該區域的 Base Color 數值要轉換為 diffuse (非金屬) 或是反射率(金屬),一般來說 Metallic 只會是黑或白。 ::: ![Imgur](http://i.imgur.com/Xt53wMU.png) 金屬表面在貼圖描述( Base Color)上有兩個重點,一個是反射率在 70%~100% 的金屬區域,一個是氧化或是鏽蝕之後的非金屬區域。 ![Imgur](http://i.imgur.com/Ws4BRyu.png) * 金屬區域: 在 Metallic Map 上的顏色會是 235~255 sRGB,並且因為要達到 70%~100% 的反射率,Base Color 的顏色會落在 180~255 sRGB 的範圍。 * 鏽蝕與非金屬區域: 金屬表面因為鏽蝕或是被髒污覆蓋的區域,都應該被視為非金屬區域, 當 Metallic Map 上的顏色低於 235 sRGB 時, 反射強度就要低於 70%,Base Color 顏色需要低於 180 sRGB ### Roughness (Grayscale - Linear) 這張灰階貼圖描述物體表面的粗糙程度,黑色表示平滑,白色表示粗糙。 Roughness Map 沒有絕對的對錯,是藝術家可以自由創造最多細節描述的貼圖。 ![Imgur](http://i.imgur.com/lExiFiI.png) ## :page_facing_up: Specular/Glossiness 流程的正確物理數值(顏色) ![Imgur](http://i.imgur.com/cQUDJQ4.png) ### Diffuse/Albedo(RGB - sRGB) 這張 sRGB 貼圖看起來類似 Metal/Roughness 流程的 BaseColor, 製作的原則上也和 BaseColor 一樣,但是在金屬區域必須填上黑色。 ![Imgur](http://i.imgur.com/EKRcnWB.png) * 顏色反映材質本身的顏色,但金屬區域必須為黑色 * 必須排除材質上的光線資訊 * 暗色的 RGB 數值應該介於30~50之間(需嚴格限制),金屬區域必須完全是黑色。 * 亮色的 RGB 數值不能高於 240 :::info 光線照射到物體之後,會有三種行為,反射,吸收,穿透(折射)。物體顯示的顏色是反射光線的結果,分為 specular reflection 和 diffuse reflection,這兩個反射的能量必須符合能量守恆定律,因此在完全 specular reflection 金屬物體上,diffuse reflection 的能量會是 0,也就是黑色 ::: ### Specular (RGB- sRGB) 這張 sRGB 貼圖定義金屬的反射強度與非金屬的菲涅爾(F0)強度。 Specular 貼圖可以自由定義非金屬材質的(F0)強度, 不像 Metallic/Roughness 流程裡所有非金屬材質都是強制在 4% 反射率。 但是注意繪製時必須依照真實物理正確的強度,維持能量守恆, 非金屬的區域 Specular 必須是灰階,金屬區域的顏色必須在 180~255 sRGB 之間。 ![Imgur](http://i.imgur.com/xxNc0hW.png) 由於 Specular 貼圖同時包含金屬和非金屬的(F0)資訊,繪製時有不同的重點 * 金屬區域: (F0)必須基於真實物理資料,在鏽蝕或是污損的區域要降低反射強度,同時基於能量守恆原則,這些被定義為非金屬的區域在 Diffuse 的強度必須提高 ![Imgur](http://i.imgur.com/0zZvpLL.png) * 非金屬區域: 雖然可以自由的控制非金屬材質的(F0),但是請注意必須使用正確的物理數值。 非金屬材質因為大部分的能量都被折射或吸收,所以反射出來的光線遠比金屬材質低很多。 藉由折射率(IOR)的計算,大部分的非金屬材質的(F0)強度約為 2%~5%(linear), 換算為 sRGB 是 40-75 之間。 如果不確定材質的(F0)強度,一般我們會使用 4%(0.04-塑膠),寶石類是特例,它們的(F0)落在 0.05~0.17(linear)。 另外,在 Metallic/Roughness 流程裡,透明(air)會將(F0)定為 0.0~0.08(linear)並且將 specularLevel channel 設為 0。 ![Imgur](http://i.imgur.com/eLcDOhS.png) * Specular map 包含非金屬的(F0)資訊和金屬的反射強度。 * 非金屬的光源反射遠比金屬弱很多,通常只有 2~5%(40~75 sRGB )。 * 一般寶石類的(F0)是 0.05~0.17 (linear) * 一般流體類的(F0)是 0.02~0.04 (linear) * 金屬的反射強度是 70~100%(180-255 sRGB) * 如果你不知道材質的反射強度,那就用 0.04(塑膠)吧! ### Glossiness (Grayscale - Linear) 這張灰階貼圖用來描述物體表面的粗糙程度,黑色表示粗糙,白色表示光滑,越粗糙的表面會造成越多的 Diffuse 現象。 這張貼圖的結果會跟 Metallic/Roughness 裡的 Roughness map 黑白相反,製作上的注意事項跟 Roughness map 相同。 ![Imgur](http://i.imgur.com/KlGhl8B.png) * 盡情發揮你的創作能力吧! :::warning 補充事項: * More about linear working flow: ![](https://i.imgur.com/aAC8pk3.png) * How do I measure sRGB values in photoshop? ![Imgur](https://i.imgur.com/0j6hXGG.png) ::: ## :page_facing_up: AfterAll ### PBR 的歷史: [Ready at Dawn](http://www.readyatdawn.com) 2011~2015 年 The Order:1886 建立次世代里程碑 ![Imgur](https://i.imgur.com/jSQNOFX.png) Ready at Dawn 在 2013 SIGGRAPH 發表 PBR 製作流程影響至今,突破 console game 平台八年的技術瓶頸(這裡指的大約是 PS3 的全盛時期,主要是 Normal Map、AO 等技術 ) 開發公司當時發表的製作方式和規格都被眾多公司導入。 {%vimeo 135714180 %} {%youtube sYX9I3ONHc4 %} {%youtube -fb14WrLXEY %} {%youtube Zf5ekOlz7AE %} ### 物理正確性 VS 藝術性 ![Imgur](https://i.imgur.com/Rm17msU.png) {%youtube hh5HV4iic1Y %} 使用這些 PBS 物理性規範的目的並不是為了要限制藝術家的創作, 而是讓美術人員能基於一致並且符合物理真實規範的環境, 創作出更寫實,更讓人信服的作品。 ### 為什麼 PBS 要嚴格限制顏色範圍 ? > 因為黑貓也是需要有人關心的。 ![](https://i.imgur.com/Y1qR6bf.png) #### 保留材質受到光線與環境影響後的細節 {%youtube 2YcEKZlfrGM %} #### 人類對容易受到各種因素影響而得到錯誤的認知 "我覺得這樣比較好看"、"東西好看比較重要" 這類說法, 是藝術家對自己作品感到自信與驕傲的說法。 但美是很主觀的,每個人都會有自己的意見。 > 受到環境和其他因素影響,同樣的衣服會顯示不同顏色 ![Imgur](https://i.imgur.com/ykUT3DI.png) > 大多數的人無法分辨 A 和 B 的顏色亮暗 ![Imgur](https://i.imgur.com/P9ved1N.png) #### 數學物理公式是為了簡化材質調整 ![Imgur](https://i.imgur.com/QHDM48N.png) 困難的事情,交給科學家就好了。 ### 使用 PBS 的優勢 ? * #### 大多製作軟體具備即時預覽材質的功能。 * #### 減少材質球的使用數量: > PBS 是透過貼圖來區分材質屬性, 可以很容易的將多個材質整合在一張貼圖裡 * #### 將材質製作規格化: > 以往在不同軟體,不同平台,不同算圖引擎裡, 調整材質都有各自的一套方式,參數等等設定, 數位內容在這之間的轉換上非常的困難。 如果使用了 PBR 標準,只要將產生出來的貼圖指定到對應的屬性, 就可以得到近似的材質設定。 * #### 簡化材質製作 > 在 PBR 的製作流程裡需要調整的數值很少,而且一旦建立了規格化的基礎材質之後,藝術家可以更專心的去刻劃物件的歷史與故事性。 ### Substance Paint 的基本流程與注意事項 當我們使用 PBR 流程時,材質作法會和以前有一個很重要的差異, 不管是走 Specular/Glossiness 或是 Metallic/Roughness 路線, 以前我們會習慣將不同材質的物件分開然後給予不同的材質, 換個方向來說,就是我們會定義很多顆材質球在一個或是多個物體上, 但是在 PBR 流程裡,因為不同的材質是透過三張貼圖的組合來控制, 所以只需要一顆材質球就可以做出不同的材質特性。 :::info 注意事項 ::: * 輸出前使用 vertex color 區分不同的材質區域: 這是為了之後可以建立 ID 作為材質的 mask 使用,不同的軟體可以使用不同的方式,例如 Material ID 之類的。 ![Imgur](https://i.imgur.com/klou8SF.png) * 先上好一套內建的基本材質作為基底,再疊上自己想要的髒污'花紋等等效果,隨時使用 meta_rough_validata filter 偵測 最後混合出來的顏色是否符合 PBR 的規範。 ![Imgur](https://i.imgur.com/CfkeEIE.png) 如果製作過程都正確的話,最後輸出的貼圖可以在同樣使用 PBR 規範的軟體裡呈現出很接近的效果。 ![Imgur](https://i.imgur.com/IgdE5jx.png) 將貼圖使用在 Vray 這類算圖引擎,也可以得到很好的效果。 ![Imgur](https://i.imgur.com/QQxLJtw.png) * 注意 Substance 輸出的是圖片,但是代表數值的貼圖需要還原回數值,代表顏色的需要還原為顏色,建議輸出 EXR,這樣只需要校正 base color 和 reflection。 ### 為什麼目前 Substance 會在市場上成為主流工具 1. 針對 PBR 製作符合規格的快速工具 ![Imgur](http://i.imgur.com/AqajXpF.png) Substance 提供符合物理屬性的材質球和相關工具 2. 減少使用錯誤顏色範圍的機率 ![Imgur](http://i.imgur.com/jE2eCRg.png) 3. 解決複雜的數學問題 ![Imgur](http://i.imgur.com/rw2hGZV.png) 4. 更加靈活直覺的材質調整方式 Substance Paint 可以用圖層的方式去對材質的效果做各疊加和遮罩等等處理, 並且有各種 Samrt Material 可以使用。 ![Imgur](https://i.imgur.com/AUSTNje.png) 5. 較容易做出物理正確的材質 如果是在 3dsMax、Maya 這類軟體裡,因為沒有辦法正確的預覽,而且材質工具沒有預先做好規格和數值上的限制,只能憑藝術家的"感覺"去調整,容易調整出不符合能量守恆的材質。 ### 參考資料 --- #### 相關文章 * [How do I measure sRGB values in photoshop?](https://forum.allegorithmic.com/index.php?topic=4482.0) * [PBR_volume_02_rev05](https://www.allegorithmic.com/pbr-guide) * [PBR Validate filter](https://share.allegorithmic.com/libraries/824) * [基于物理的渲染(一):什么是渲染?](https://mp.weixin.qq.com/s/ZKyvB9NctTc3RUgkVB9zng) * [基于物理的渲染(二):光照的组成部分](https://mp.weixin.qq.com/s/thmMceux9oFjPB3ns1LBVA) * [基于物理着色(三)- Disney和UE4的实现](https://zhuanlan.zhihu.com/graphics/20122884) * [Breaking Down The Order: 1886](https://www.gametextures.com/breaking-down-the-order-1886/) * [色彩恆常性:你看到什麼顏色的洋裝](http://pansci.asia/archives/76012) #### PDF * [The Importance of Physically-Based Shading](http://blog.selfshadow.com/publications/s2012-shading-course/hill/s2012_pbs_importance.pdf) * [Crafting a Next-Gen Material Pipeline for The Order: 1886](http://blog.selfshadow.com/publications/s2013-shading-course/rad/s2013_pbs_rad_slides.pdf) #### 影片 * Understanding PBR {%youtube ueC2qGzWrgQ %} * Texturing in Uncharted 4 {%youtube UNxOxiR5T_M %} * Textile scanning acquisition {%vimeo 70992723 %}