Unity Shader 序列帧动画

时间:2022-09-25 22:39:07

shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分。

Unity Shader 内置时间变量
名称 类型 描述
_Time float4 (t/20,t,2t,3t)   其中t为自该场景加载所经过时间
_SinTime float4 (t/8,t/4,t/2,t)  其中t为自该场景加载所经过时间的正弦值
_CosTime float4 (t/8,t/4,t/2,t)  其中t为自该场景加载所经过时间的余弦值
unity_DeltaTime float4 (dt,1/dt,sdt,1/sdt)  其中dt为时间增量,sdt为时间增量的平滑值

脚本如下:

 Shader "MyUnlit/FrameAnimation"
{
Properties
{
_Color("Color Tint",color)=(,,,)
_MainTex ("Texture", 2D) = "white" {}
_CutX("CutX Amount",float)=
_CutY("CutY Amount",float)=
_Speed("Speed",range(,))=
}
SubShader
{
//一般序列帧动画的纹理会带有Alpha通道,因此要按透明效果渲染,需要设置标签,关闭深度写入,使用并设置混合
Tags { "RenderType"="transparent" "queue"="transparent" "ignoreprojector"="true" }
ZWrite off
blend srcalpha oneminussrcalpha Pass
{
Tags{"lightmode"="forwardbase"} CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS()
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
float _CutX;
float _CutY;
float _Speed; v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
//取得整数的时间
float time = floor(_Time.y*_Speed);
//整除部分为行(因为播放顺序是从左到右,先行后列)
float row = floor(time / _CutX);
//余数部分为列
float column = time - row * _CutX; //计算偏移值,其中u向为列索引值,v向为行索引的相反数(播放原点是左上角,而uv采样原点是左下角,所以v向偏移应该取反)
half2 uv = i.uv + half2(column,-row);
//除以行列得到最终的采样值
uv.x /= _CutX;
uv.y /= _CutY; fixed4 col = tex2D(_MainTex,uv);
col.rgb *= _Color;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
FallBack "Transparent/VertexLit"
}