UnityShaderUV动画讲解三:移动端序列帧播放(算法优化)

在之前的序列帧动画基础上优化了算法,(之前的源码和现在的源码都和市面上的源码不同,他们都有帧播放BUG,会优先播放最底下一层然后再顺势往上播放,我晚上11点下班到家优化算法到1点才实现完全至上向下播放的流程)老规矩,先看看效果:

    

素材源文件:

      

源码奉上:


Shader "Unlit/UV_FpsAnimationCutOut" {
Properties
    {
        _Color("MainColor",Color) = (1,1,1,1)
        _MainTex("MainTex", 2D) = "white" {}
		_PlaySpeed("Speed",int) = 0
        _UCount("UCountt",Float) = 1
        _VCount("VCount",Float) = 1
		 /* 这里是UnityUI面板得一个开关,通过变体_AUTOPLAY
		去控制是否开启播放*/
		 [Toggle] _AUTOPLAY("AutoPlay",Float) = 0
       
    }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
			LOD 100
            Pass
            {
                   
                CGPROGRAM
 
                #pragma vertex vert
                #pragma fragment frag
				#pragma multi_compile_fog
                #include "UnityCG.cginc"
				//变体得启用
			    #pragma shader_feature  _AUTOPLAY_ON

 
                fixed4 _Color;
                sampler2D _MainTex;
                half _UCount;
                half _VCount;
                half _PlaySpeed;
			    half _FpsID=0;
 
                struct a2v
                {
                    half4 vertex:POSITION;
                    fixed2 uv:TEXCOORD0;
                };
 
                struct v2f
                {
                    half4 pos:SV_POSITION;
				    UNITY_FOG_COORDS(1)
                    fixed2 uv:TEXCOORD0;
                };
 
                v2f vert(a2v v)
                {
                    v2f o;
                    o.pos = UnityObjectToClipPos(v.vertex);
				     o.uv=v.uv;
                    return o;
                }
 
                fixed4 frag(v2f i):SV_Target
                {
					//判断动画播放是否开启
			        #ifdef  _AUTOPLAY_ON
                   //当前ID累加 ,流逝时间每秒乘以播放速度
				     _FpsID = floor(_Time.y * _PlaySpeed);
	                #endif
                    half indexX = floor(_FpsID / _UCount);
                    half indexY = _FpsID - indexX * _UCount;

                    fixed2 uv = i.uv + half2(indexY, _VCount-1-indexX);    
                    uv.x /= _UCount;
                    uv.y /= _VCount;
                    fixed4 col = tex2D(_MainTex, uv);
                    col.rgb *= _Color;
					//透明剔除,硬裁剪,节约性能,当然特效类的火焰等可能需要半透明处理。
			        clip(col.a - 0.5);      
                    UNITY_APPLY_FOG(i.fogCoord, col);
                    return col;
                }
 
                ENDCG
            }
        }
       
}

大家关注点个赞呗,下一篇特效片,;来一个特效软透明处理的源码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值