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

Unity5之後加入了Physically Based Shading, 即PBS。PBS提供一整套BRDF Shading和Global Illumination解決方案,可以實現真實質感的渲染品質。

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

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

但是在實際項目的開發過程中,往往需要在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的場景效果:

Standard Shader上加雪的效果:

還可以用一些trick做出不同的效果。比如下面石頭上雪的兩種覆蓋效果。第一種是正常的覆蓋方式,第二種側面覆蓋方式。後者可以用到石板台階上,造成雪地被踩過的效果。

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

_騰訊視頻 https://v.qq.com/x/page/o0394j8suw1.html

結論, Unity5的Buildin Shaders雖然不是一個嚴格意義上的開源工程,但Unity實現了lighting和shading的分離,仍然很容易在其基礎上做出更複雜的擴展效果。


推薦閱讀:

為什麼我看壞arnold渲染器的發展
FFT Ocean
【UnrealEngine4】藍圖-材質的數據傳輸與偽ComputePipeline

TAG:Unity游戏引擎 | 渲染 | shader |