【補遺】基於體積的大氣散射Shader
作者表示,該shader是一個收費的feature,並不希望上傳到github,即便只是根據原理寫出來的。所以在此表示抱歉,有需要的同學可以去作者網站上支持一波。
教程目錄:
破曉:【翻譯】基於體積的大氣散射(一)
破曉:【翻譯】基於體積的大氣散射(二)
破曉:【翻譯】基於體積的大氣散射(三)
破曉:【翻譯】基於體積的大氣散射(四)
破曉:【翻譯】基於體積的大氣散射(五)
破曉:【翻譯】基於體積的大氣散射(六)
破曉:【翻譯】基於體積的大氣散射(七)
作者網站:
Alan Zucconi - Independent developer
接下來是一些補遺,本教程寫得相對繁複,但是在實現上又只有一鱗半爪,而我這個半桶水又犯了想當然的錯誤,在此總結一下,想要完成自己Shader的同好或許能有些幫助。
- 該shader代碼統統都在自定義光照模型中實現。
啊,這個可能,看起來是廢話。然而當時我第一次接觸體積渲染,就是這位作者的教程。在他之前的這份教程中,是在surf函數中完成rayMarching的,因此想當然,我最開始的實現是在surf函數中寫的。這麼寫原理上沒什麼問題,但是如果需要在大氣球體中加入動態雲之類的實現,那surf函數就顯得非常累贅。因此,散射在光照模型中實現,可讀性會好一些。
另附上作者的體積渲染教程——(Unity教程|立體渲染(一) - 綜合技術 - Unity官方中文論壇 - Unity3d.com)
- 光照函數中,入射點的worldPos需要自己計算
既然選擇在光照函數中實現,跟surf函數不一樣的是,其輸入——SurfaceOutput結構體——中並沒有該像素的世界空間坐標。不過好在我們知道要渲染的是個球體,有球體的坐標,以及該像素的法線。所以入射點應該是_PlanetRadius * s.Normal + _PlanetCenter。
- 比例問題
由於物理公式是基於地球的標準算出來的,所以如果要在Unity裡頭實現,一定一定要先把單位給確認好。比如在地球上,其標準高度是H=8500m,這是基於地球的直徑12756km的情況下計算出來的;在Unity中,如果要實現的行星體積大約在100單位的情況下,就需要更加仔細的確認。
- 圖片清晰度足夠大
作者的付費下載資源中有8K清晰度的地球和其他行星的貼圖,我找了個4K的,效果還行吧,移步https://pan.baidu.com/s/1dZbs9S即可。
推薦閱讀:
※聚焦9.8直播 | UI製作大師初養成!
※Unity手游開發札記——使用Fast Shadow Receiver優化渲染效率
※從零開始學基於ARKit的Unity3d遊戲開發系列18
※Unity3D程序腳本反編譯分析與加密
※Unity3D UGUI優化:製作鏡像圖片(2)
TAG:Unity游戏引擎 |