前言
之前專案使用Asset Store上的
Procedural Skybox 生成tool (還不便宜),結果用下來問題很多,偶爾會跳出error把整個場景的光變得很藍,要重開Unity才有可能修好。 求助官方DC也沒什麼處理。無奈之下只好自己做一套簡單的Skybox工具。
先看一下成果,功能包含:
- 用時間控制晝夜變化。
- 有太陽、月亮旋轉、交替效果。
- 簡單使用。
Skybox [1]
Unity Skybox是一種用於創建場景背景的特殊材質,它可以模擬無限遠的天空或環境。Skybox材質需要一種專門的Shader來渲染,這種Shader通常會將材質的六個面映射到一個立方體貼圖上,並根據攝像機的方向來顯示不同的面。Unity提供了幾種預設的Skybox Shader,例如6 Sided、Cubemap、Procedural等,也可以自定義Skybox Shader來實現更多的效果。
如果使用一般的texture來渲染Skybox,會出現接縫、變形或重複的問題,而使用立方體貼圖可以保證Skybox在任何角度都能呈現出連續和自然的效果。
下圖為不使用cubemap會發生接縫、變形或重複等問題。
正確Sample cubemap
要做reflect是因為原本是上下顛倒:
原理大概是這樣理解:
晝夜切換
背景旋轉 /淡入
但這個做法在銜接處會有撕裂的問題。
一個比較乾脆的做法是直接旋轉天空球本身的vertex:
成果:
太陽
太陽光環可以用簡單的距離判斷做。
配上顏色
月亮貼圖
月亮比較麻煩的點在於月亮需要畫貼圖。
要採樣貼圖就得先有uv,也就是說要在skybox的uv空間中割出一個[0~1]的方形月亮uv。
定義畫出0~1的範圍
合併剛剛切的那塊方形:
成果:
眼尖的同學應該可以看到他在側邊會有拉扯的distortion,尤其在極點最明顯。
所以uv應該要再做projection修正喔。
SDF月亮
當時有點惱,想做出3D有陰影變化的月亮(貼圖也能做x),所以一股腦地改成先用SDF畫出月亮球形,再直接套用貼圖。
SDF球體採樣texture
可以把月亮的球體當作另一個skybox處理就好囉。
補充閱讀:
- シェーダーに固定関数 TexGen を実装する - Unity マニュアル (unity3d.com)