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 Shader- UV動畫原理及簡易實現Unity動畫
- Unity Shader基於視差對映的雲海效果Unity
- Unity——基於ShaderLab實現光照系統Unity
- Unity Shader 00 - 梳理 Unity Shader 的基本結構Unity
- 【Unity3D Shader程式設計】之二 雪山飛狐篇:Unity的基本Shader框架寫法&顏色、光照與材質Unity3D程式設計框架
- Unity3D中的shader基礎知識Unity3D
- 基於Vue的簡易MVVM實現VueMVVM
- 基於Websocket的簡易webshell實現Webshell
- 基於react的hash路由簡易實現React路由
- 基於Redis的簡易延時佇列Redis佇列
- Unity開發--(三)Shader程式設計:寫一個shader讓圖片的背面不被剔除Unity程式設計
- Unity的Forward+ FPTL光照剔除解析(一)UnityForward
- Unity的Forward+ FPTL光照剔除解析(三)UnityForward
- Unity的Forward+ FPTL光照剔除解析(四)UnityForward
- 基於vue全家桶實現的簡易商城Vue
- 基於 git 打造簡易的 npm 私有倉庫GitNPM
- Unity 的 Surface Shader有關記錄Unity
- 【Unity Shaders】Mobile Shader Adjustment—— 什麼是高效的ShaderUnity
- unity 統一替換shaderUnity
- Shader 繪製基礎圖形
- 新框架ES-MAML:基於進化策略、簡易的元學習方法框架
- 基於Pixel Shader的FFT已經完成FFT
- Unity3D 的物理渲染和光照模型Unity3D模型
- 基於React搭建一個簡易版豆瓣React
- 基於vue搭建一個簡易版豆瓣Vue
- Shader:優化破解變體的 “影分身” 之術優化
- unity shader 溶解,上下左右,cutoffUnity
- Unity3D學習筆記3——Unity Shader的初步使用Unity3D筆記
- 高效簡易開發基於websocket 的通訊應用Web
- 基於 WPF 的酷炫 GUI 視窗的簡易實現GUI
- Unity Shader 實現雨天的水面漣漪效果Unity
- Unity&Shader常用函式的使用方法Unity函式
- Unity Shader 入門精要 筆記(1)Unity筆記
- Unity3D 透明物體ShaderUnity3D
- 【Unity Shader入門精要】— 高階篇Unity
- Unite 2019|Unity的光照烘焙技術(上)Unity
- 基於函式的索引狀態變化函式索引
- 基於linux原生非同步io建立的簡易聊天程式Linux非同步