Loading效果之四Shader

思路:

(1)提高畫方型函數,並支持可自轉功能

(2)以fixed2(0.5, 0.5)爲圓點,在圓點、正右、右上、正上、左上、正左、左下、正下、右下9個方位畫上方型

(3)圓點方型做縮放動畫,其餘方型做自轉以及直線來回運動,

代碼如下:

Shader "Hidden/Loading"
{
    Properties
    {
		_Color("Color", Color) = (1, 1, 1, 1)
		_Move("Move", Range(0, 1)) = 0.1
		_Breath("Breath", float) = 0.1
		_Wait("Wait", Range(0, 1)) = 0
		_Angle("Angle", float) = 0.1
		_Width("Width", Range(0, 1)) = 0.1
    }
    SubShader
    {
		Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

			fixed4 _Color;

			fixed _Width;

			fixed _Wait;

			fixed _Move;
			
			fixed _Angle;

			fixed _Breath;

			fixed drawRect(int index, fixed2 uv, fixed2 center, fixed2 size)
			{
				fixed2 newUv = uv - center;

				fixed angle = step(1, index) * (_Time.y * _Breath + radians(index * 30));

				newUv = fixed2(newUv.x * cos(angle) - newUv.y * sin(angle), newUv.x * sin(angle) + newUv.y * cos(angle));

				return step(-0.5 * size.x, newUv.x) * step(newUv.x, 0.5 * size.x) * step(-0.5 * size.y, newUv.y) * step(newUv.y, 0.5 * size.y);
			}

			fixed2 getRectCenter(int index)
			{
				fixed2 rectCenters[9];

				rectCenters[0] = fixed2( 0,  0);
				rectCenters[1] = fixed2( 1,  0);
				rectCenters[2] = fixed2( 1,  1);
				rectCenters[3] = fixed2( 0,  1);
				rectCenters[4] = fixed2(-1,  1);
				rectCenters[5] = fixed2(-1,  0);
				rectCenters[6] = fixed2(-1, -1);
				rectCenters[7] = fixed2( 0, -1);
				rectCenters[8] = fixed2( 1, -1);

				return rectCenters[index];
			}

            fixed4 frag (v2f i) : SV_Target
            {
				_Color.a = 0;
				for(int z = 0; z < 9; z++)
				{
					fixed w = _Width;

					fixed curTime = _Time.y - (z - 1) * _Wait;

					curTime = step(0, curTime) * curTime;

					fixed add = smoothstep(0, 1, abs(sin(curTime)));

					fixed2 rectCenter = _Move * add * getRectCenter(z);
					
					add = smoothstep(0, 1, 1 - abs(sin(_Time.y)));

					w += step(z, 0) * _Move * add;

					_Color.a += drawRect(z, i.uv, rectCenter + fixed2(0.5, 0.5), fixed2(w, w));
				}

                return _Color;
            }
            ENDCG
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章