前往
大廳
主題 達人專欄

[Unity Shader] 自製晝夜變化 Skybox Shader !

%%鼠 拒收病婿 | 2024-01-14 23:48:12 | 巴幣 3436 | 人氣 366

前言

之前專案使用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處理就好囉。



 
 

補充閱讀:
  1. シェーダーに固定関数 TexGen を実装する - Unity マニュアル (unity3d.com)




送禮物贊助創作者 !
0
留言

創作回應

樂小呈
原來天空盒的 vertex 也能控制噢
2024-01-15 10:40:14
%%鼠 拒收病婿
度,既然都有vertex shader 了,就能控制
2024-01-15 15:11:04
追蹤 創作集

作者相關創作

更多創作