【補遺】基於體積的大氣散射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的,效果還行吧,移步pan.baidu.com/s/1dZbs9S即可。


個人實現的Shader效果,加入曲面細分會更好


推薦閱讀:

聚焦9.8直播 | UI製作大師初養成!
Unity手游開發札記——使用Fast Shadow Receiver優化渲染效率
從零開始學基於ARKit的Unity3d遊戲開發系列18
Unity3D程序腳本反編譯分析與加密
Unity3D UGUI優化:製作鏡像圖片(2)

TAG:Unity游戏引擎 |