Unity5 PBR如何實現天氣系統的雪景效果
使用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做出不同的效果。比如下面石頭上雪的兩種覆蓋效果。第一種是正常的覆蓋方式,第二種側面覆蓋方式。後者可以用到石板臺階上,造成雪地被踩過的效果。
還可以做其他的一些效果,比如雪消融的動態效果,或者修改下顏色模擬植被。
結論, Unity5的Buildin Shaders雖然不是一個嚴格意義上的開源工程,但Unity實現了lighting和shading的分離,仍然很容易在其基礎上做出更復雜的擴充套件效果。
附:騰訊光子工作室群技術美術組招聘 Shading Tech Artist(含實習生,長期有效)
相關閱讀:
手遊逆向分析: Unity內還原遊戲場景/角色渲染效果
戲角色寫實頭髮製作
作者:大星星
專欄地址:https://zhuanlan.zhihu.com/p/26395413
相關文章
- w10系統天氣為什麼只顯示北京天氣_win10系統本地天氣如何設定Win10
- css實現氣泡框效果CSS
- Flutter Weather天氣模組實現Flutter
- win10系統下天氣磁貼不顯示當地天氣如何解決Win10
- win10如何關閉工作列天氣 win10系統天氣怎麼關Win10
- 微信小程式-基於高德地圖API實現天氣元件(動態效果)微信小程式地圖API元件
- 5.22 天氣預報系統 小
- 【專題資料】遊戲中的天氣系統遊戲
- windows10系統下天氣定位不了如何解決Windows
- Windows10系統天氣應用閃退如何解決Windows
- Angular+ionic+cordova實現天氣AppAngularAPP
- PHPAjaxJavaScriptJson實現天氣資訊獲取PHPJavaScriptJSON
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- MMORPG手遊天氣系統的沉浸感設計
- window8系統如何讓天氣顯示在metro介面中
- 使用純 CSS 實現超酷炫的粘性氣泡效果CSS
- 安裝win10系統bootmgr pbr黃燈怎麼辦_安裝win10系統bootmgr pbr黃燈如何處理Win10boot
- 中央氣象局天氣預報介面---java實現Java
- 如何實現倒影效果
- css3實現的氣泡效果程式碼例項CSSS3
- 網站或系統中直接嵌入天氣資訊網站
- Win10系統怎麼設定天氣預報實時更新Win10
- Cocos Creator 3D 材質系統:曲面效果如何實現?3D
- CSS如何實現div的透明效果CSS
- 短視訊系統,實現介面陰影效果
- Win10系統更改天氣應用中顯示天氣城市的方法【圖】Win10
- 【轉載】《天諭》全新PBR技術曝光
- 天氣預報的功能實現(使用聚合的提供的外部介面)
- Flutter 系統是如何實現ExpansionPanelList的Flutter
- CSS 如何實現羽化效果?CSS
- CSS進階篇--CSS3實現氣泡效果CSSS3
- Python實現天氣查詢功能(外加Excel技巧)PythonExcel
- JavaScript:雪景(轉)JavaScript
- Flutter實踐:天氣預報Flutter
- win10系統下怎麼更改天氣預設位置以及城市天氣Win10
- 直播系統app原始碼,用遞迴實現氣泡排序APP原始碼遞迴排序
- Flutter吸附效果如何實現?Flutter
- css如何實現div全屏效果CSS