Substance與PBR工作流總結
- 關於PBR
2.關於Substance
Substance是Allegorithmic公司的一套PBR美術製作工具,包括Substance Printer和Substance Designer等軟體,Substance Painter是PBR貼圖繪製軟體,
上圖是Gold材質的屬性面板,我們可以看到有Metal Properties和Age 這類的自定義引數,調整這些引數,就能重新生成新的PBR貼圖。
(使用Gold材質的渲染結果)
sbsar檔案除了動態生成PBR貼圖這個功能,其實與Unity材質沒有差別,因為它們都是使用相同的Shader。僅僅使用它的貼圖我們也可以渲染出完全一樣的效果。
Substance Painter比較重要的注意點是匯出貼圖的設定,通常我們將Config設定為Unity5(Standard Metallic)
而Unity5(Standard Metallic)的配置我們可以在上面CONFIGURATION中檢視和修改:
如圖,我們將為每套貼圖輸出Albedo,Normal,Emission,Metallic4張貼圖,Albedo的RGB通道使用Base Color的RGB顏色,Normal的RGB通道是NormalOpenGL的RGB顏色,而Metallic的RGB通道使用Metallic的灰度顏色,A通道使用Roughness的灰度顏色(這是我修改後的配置,預設配置不是這樣)。
3.整合到Unity開發流程的問題
實際開發中必定會存在的一個問題是,美術在Substance Painter中調出了一個牛逼哄哄的效果,開開心心地匯入Unity,發現效果不一樣了!除了一些光照的設定,最主要的是因為Color Space的問題。關於Color Space的概念可以看下這兩篇文章:
這是Unity中不同Color Space渲染SP的PBR貼圖的結果,第一張的Gamma Space,第二張是Linear Space,可以看出差異還是挺明顯的,特別是底座的顏色
SP的渲染是在Linear Space中進行的,匯出的貼圖經過了gamma encoding,如果在Unity中使用Linear Space渲染,渲染結果還是很接近SP中的效果的,但是Linear Space不僅消耗高,而且在某些移動平臺上不支援(需要OpenGL ES3.0以上及Metal圖形API支援),這意味著我們需要在Gamma Space中得到跟SP一樣的渲染效果。
With Unity 5.5, linear rendering is now available on Android and iOS. On Android, linear rendering requires OpenGL ES 3 graphics API which represents 61.1% of the Android devices. On iOS, linear rendering requires Metal graphics API which represents 71.1% of the iOS devices.
4.Substance Printer與Unity Gamma Space渲染效果一致化方案
方案1:修改Unity Standard Shader,手動加入gamma校正,使其達到Linear Space的效果。
Although Unity does not support the default linear pipeline on some platforms such as mobile. It is possible to do so yourself within shaders. This is done by applying the pow() function to gamma corrected input textures to transform the inputs to linear space, and applying pow() again before returning the result to put it back in gamma space. Note that this method will be computationally expensive, so be aware of the capabilities of your target devices and use it only where needed.
Unity提供了在UnityCG.cginc標頭檔案中提供了GammaToLinearSpace和LinearToGammaSpace 兩個方法進行兩個空間的轉化。但是我嘗試了仍然沒法得到Linear Space的渲染效果,顏色偏差還是存在,而且因為工作流程而加入額外的效能消耗,我覺得不是好方案,於是放棄這個方案。
方案2:不再調整Unity的渲染,我們調整SP的渲染,讓其使用Gamma Space渲染。幸好SP支援自定義Shader
這篇文章提供了這個方案:點選開啟連結,同時提供了一個模擬Unity PBR渲染的GLSL檔案,下載下來,在SP中File->Impoty resources匯入,在SHADER SETTINGS中設定為使用該shader,注意把Linear Space勾選去掉,因為我們要使用Gamma Space。匯出貼圖時,注意要修改Metallic貼圖的設定:RGB通道使用Metallic的灰度顏色,A通道使用Roughness的灰度顏色。
Untiy中的和SP中,差異算可以接受了