Unity Shader 基於光照圖的簡易晝夜變化

開發MrsFu123發表於2022-05-21
    
    
    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/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章