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
- win10系統下天氣磁貼不顯示當地天氣如何解決Win10
- win10如何關閉工作列天氣 win10系統天氣怎麼關Win10
- 5.22 天氣預報系統 小
- Flutter Weather天氣模組實現Flutter
- 使用純 CSS 實現超酷炫的粘性氣泡效果CSS
- windows10系統下天氣定位不了如何解決Windows
- Cocos Creator 3D 材質系統:曲面效果如何實現?3D
- Angular+ionic+cordova實現天氣AppAngularAPP
- 微信小程式-基於高德地圖API實現天氣元件(動態效果)微信小程式地圖API元件
- 安裝win10系統bootmgr pbr黃燈怎麼辦_安裝win10系統bootmgr pbr黃燈如何處理Win10boot
- 【專題資料】遊戲中的天氣系統遊戲
- MMORPG手遊天氣系統的沉浸感設計
- 短視訊系統,實現介面陰影效果
- CSS 如何實現羽化效果?CSS
- 如何在遊戲陪玩系統原始碼中實現“刮刮樂”效果?遊戲原始碼
- Flutter 系統是如何實現ExpansionPanelList的Flutter
- Win10系統怎麼設定天氣預報實時更新Win10
- Python實現天氣查詢功能(外加Excel技巧)PythonExcel
- Flutter吸附效果如何實現?Flutter
- reactnative實現qq聊天訊息氣泡拖拽消失效果React
- 短視訊系統,Android 使用MotionLayout實現動畫效果Android動畫
- 直播系統app原始碼,用遞迴實現氣泡排序APP原始碼遞迴排序
- 通用天氣系統調研及手遊方案推薦
- win10系統下怎麼更改天氣預設位置以及城市天氣Win10
- 直播系統程式碼,Android自定義View實現呼吸燈效果AndroidView
- Flutter實踐:天氣預報Flutter
- 為什麼win10天氣始終顯示北京_win10系統的天氣預報怎麼設定Win10
- OneClock的翻頁時鐘效果是如何實現的
- win10 天氣如何固定桌面_win10 天氣怎麼新增桌面Win10
- 報表如何實現行列互換效果?
- 如何在 ThreeJS 中實現輝光效果JS
- Web 頁面如何實現動畫效果Web動畫
- 教你如何使用MvcPager實現分頁效果MVC
- Knative 實戰:基於 Knative Serverless 技術實現天氣服務-下篇Server
- win10系統下天氣應用打不開的解決方法Win10
- 基於cJSON及心知天氣模組化實現獲取城市氣象資訊(現在、未來)JSON
- DOM 和 Canvas 如何實現文字豎向排列的效果Canvas