Unity5 PBR如何實現天氣系統的雪景效果

遊資網發表於2020-02-25
Unity5之後加入了Physically Based Shading, 即PBS。PBS提供一整套BRDF Shading和Global Illumination解決方案,可以實現真實質感的渲染品質。

使用PBS改變了美術資源製作的pipeline。美術不需要再把光影表現畫在貼圖上,而是通過第三方工具在貼圖上標記出模型表面的物理屬性,通過引擎的shading和lighting系統自動得到當前環境下正確的渲染結果。這種方式還有利於實現遊戲中的日夜系統和其他動態光影效果。

Unity自帶的Standard Shader提供金屬度和高光兩種方式Shading, 可以滿足大部分場景物件的材質表現需要。下圖是Unity官方給出類似於迪士尼Shading Spectrum的Shader Charts。

Unity5 PBR如何實現天氣系統的雪景效果

但是在實際專案的開發過程中,往往需要在Standard Shader的基礎上新增一些自定義效果,比如服裝道具上Bling Bling的反光,天氣系統裡的雨雪等。這種需求既要求相容Unity的光照系統,又要實現PBR多樣化的表現。

下面以在Standard Shader上新增雪的效果為例,主要擴充套件BuildIn Shaders的兩個檔案:

1. Standard Shader.shader。Standard Shader裡有兩個lod sub shader。以第一個sub shader為例,分為5個pass。第一個pass是對主光源的前向渲染。第二個pass是對應動態點光源的渲染。第三個pass是關於Shadow map的計算。第四個pass是延遲渲染。第五個參與烘培間接光照計算,不參與實時渲染。新增雪的示例需要建立自己的shader檔案: Standard Shader with Snow.shader。並且修改第一個pass,自定義fragment shader: #pragma fragment fragForwardBase_Snow。

2. StandardCore.cginc。此檔案包含了vertex shader和fragment shader的實現。所以要自己建立一個新的StandardCoreSnow.cginc檔案,在裡面實現fragment shader。並且在Standard Shader with Snow.shader裡包含此檔案。

fragment shader的前向渲染實現是在fragForwardBaseInternal函式內。函式主要分三部分

i. 在FragmentSetup()內獲得畫素的BRDF引數,例如albedo,metallic, normal, eyeVec等。

ii. 在FragmentGI()內收集光照資訊。

iii. UNITY_BRDF_PBS()在StandardBRDF.cginc內根據當前graphics tier setting獲得相應的BRDF模型和光照輸入,輸出計算結果。

後兩步涉及lighting和BRDF模型的計算,無需改動。只需要重寫第一部分畫素資訊的收集函式即可: FragmentSetup_Snow()。這個函式內部實現照抄FragmentSetup(),只在結尾新增一個AddSnow()函式,在內部定義albedo如何表現雪的機制(示例中的實現因為專案關係暫時不便公開)。

Standard Shader的場景效果:

Unity5 PBR如何實現天氣系統的雪景效果

Standard Shader上加雪的效果:

Unity5 PBR如何實現天氣系統的雪景效果

還可以用一些trick做出不同的效果。比如下面石頭上雪的兩種覆蓋效果。第一種是正常的覆蓋方式,第二種側面覆蓋方式。後者可以用到石板臺階上,造成雪地被踩過的效果。
Unity5 PBR如何實現天氣系統的雪景效果

還可以做其他的一些效果,比如雪消融的動態效果,或者修改下顏色模擬植被。

Unity5 PBR如何實現天氣系統的雪景效果

結論, Unity5的Buildin Shaders雖然不是一個嚴格意義上的開源工程,但Unity實現了lighting和shading的分離,仍然很容易在其基礎上做出更復雜的擴充套件效果。
Unity5 PBR如何實現天氣系統的雪景效果


附:騰訊光子工作室群技術美術組招聘 Shading Tech Artist(含實習生,長期有效)

相關閱讀:
手遊逆向分析: Unity內還原遊戲場景/角色渲染效果
戲角色寫實頭髮製作

作者:大星星
專欄地址:https://zhuanlan.zhihu.com/p/26395413


相關文章