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
        }
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值