Unity Shader 基於光照圖的簡易晝夜變化
public class DayAndNightManager : MonoBehaviour
{
public float 10; //一整天迴圈一次的時間,這裡預設的十秒
public Color morningColor = Color.white; //早晨顏色
public Color noonColor = Color.white; //中午顏色
public Color afterNoonColor = Color.white; //傍晚顏色
public Color nightColor = Color.white; //晚上顏色
private Color[] colors; //所用的所有時間段的顏色
private Color currentColor; //當前顏色
private float dayTimer; //時間
// Use this for initialization
void Start () {
//把所有時段的顏色收集起來,這裡多了一個,是因為整個是一個迴圈,結束的時候要回到凌晨時段,所以最後一個顏色是早晨的顏色
colors = new Color[ 5];
colors[ 0] = morningColor;
colors[ 1] = noonColor;
colors[ 2] = afterNoonColor;
colors[ 3] = nightColor;
colors[ 4] = morningColor;
//初始化
Shader.SetGlobalColor( "_SkyColor",Color.white);
currentColor = morningColor;
dayTimer = 0;
}
// Update is called once per frame
void Update()
{
//時間開始推進,乘以4是因為我們有四個時段,這樣再乘以後面的一整天時間才是準確的。
dayTimer += Time.deltaTime* 4/oneDayTime;
//一個迴圈結束了,重新開始
if (dayTimer >= ( float)colors.Length - 1)
{
dayTimer = 0;
}
//取樣兩個顏色,第一個是即將過去的時間顏色,第二個是即將到來的時間顏色,我們通過兩個數學方法向下和向上取整。
Color color01 = colors[Mathf.FloorToInt(dayTimer)];
Color color02 = colors[Mathf.CeilToInt(dayTimer)];
//兩個顏色的佔比,我們通過取時間的小數部分,就可以了。
float weight = dayTimer - Mathf.FloorToInt(dayTimer);
//利用權重來對顏色進行融合
currentColor = Color.Lerp(color01, color02, weight);
//修改全域性顏色,_SkyColor已經寫到所有的shader裡了
Shader.SetGlobalColor( "_SkyColor", currentColor);
//修改全域性時間,這個主要是控制天空盒的貼圖融合
Shader.SetGlobalFloat( "_DayAndNightChange", dayTimer);
}
//重點是這個變數,通過全域性修改這個變數的引數來對四個時段的貼圖取樣,並融合。
//這個變數的範圍與指令碼的時間一致,都是0-4迴圈,最後一個時段與第一個一樣,都是凌晨
float _DayAndNightChange;
half4 frag (v2f i) : SV_Target
{
//基本就是一些融合演算法,先利用時間來算出每個貼圖的顏色佔比,然後統一加到一起。
//這只是計算了天空盒的一面,後面的Pass演算法相同
half4 col01 = skybox_frag(i,_Tex01, _Tex01_HDR)*(saturate(1- _DayAndNightChange));
half4 col02 = (skybox_frag(i,_Tex02, _Tex02_HDR)*(saturate(2- _DayAndNightChange)))-(skybox_frag(i,_Tex02, _Tex02_HDR)*(saturate(1- _DayAndNightChange)));
half4 col03 = (skybox_frag(i,_Tex03, _Tex03_HDR)*(saturate(3- _DayAndNightChange)))-(skybox_frag(i,_Tex03, _Tex03_HDR)*(saturate(2- _DayAndNightChange)));
half4 col04 = (skybox_frag(i,_Tex04, _Tex04_HDR)*(saturate(4- _DayAndNightChange)))-(skybox_frag(i,_Tex04, _Tex04_HDR)*(saturate(3- _DayAndNightChange)));
half4 col05 = skybox_frag(i,_Tex01, _Tex01_HDR)*(saturate(_DayAndNightChange -3));
half4 c = col01 +col02+col03+col04+col05;
return c;
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016819/viewspace-2895934/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Unity——基於ShaderLab實現光照系統Unity
- Unity Shader- UV動畫原理及簡易實現Unity動畫
- Unity Shader基於視差對映的雲海效果Unity
- Unity Shader 00 - 梳理 Unity Shader 的基本結構Unity
- Unity 的 Surface Shader有關記錄Unity
- 基於Websocket的簡易webshell實現Webshell
- 基於Vue的簡易MVVM實現VueMVVM
- unity 統一替換shaderUnity
- Shader 繪製基礎圖形
- Unity的Forward+ FPTL光照剔除解析(四)UnityForward
- Unity的Forward+ FPTL光照剔除解析(一)UnityForward
- Unity的Forward+ FPTL光照剔除解析(三)UnityForward
- Unite 2019|Unity的光照烘焙技術(上)Unity
- 基於react的hash路由簡易實現React路由
- 基於Redis的簡易延時佇列Redis佇列
- unity shader 溶解,上下左右,cutoffUnity
- Unity3D學習筆記3——Unity Shader的初步使用Unity3D筆記
- 基於 git 打造簡易的 npm 私有倉庫GitNPM
- Unity&Shader常用函式的使用方法Unity函式
- Unity Shader 實現雨天的水面漣漪效果Unity
- 新框架ES-MAML:基於進化策略、簡易的元學習方法框架
- Unity Shader 入門精要 筆記(1)Unity筆記
- Unity3D 透明物體ShaderUnity3D
- Shader:最佳化破解變體的 “影分身” 之術
- 基於 Twirp RPC 的簡易 JSON Api Gateway 實現RPCJSONAPIGateway
- 基於vue搭建一個簡易版豆瓣Vue
- 基於React搭建一個簡易版豆瓣React
- Compute Shader 簡介
- 基於linux原生非同步io建立的簡易聊天程式Linux非同步
- 一個簡單的Tessellation Shader
- 基於Python PIL實現簡單圖片格式轉化器Python
- 基於JS簡單甘特圖JS
- Unity Shader-後處理:Bloom全屏泛光UnityOOM
- 基於AOP和Redis實現的簡易版分散式鎖Redis分散式
- VNPY 一種基於統計的交易策略簡易實現
- 在Unity中實現2D光照系統Unity
- 變易世界,簡易戰略,不易華為
- Python基於Socket實現簡易多人聊天室Python