uv动画是根据图片纹理的移动来达成效果的,uv动画一般(基本了吧)是先对图片进行采样,接着对uv进行增减来达成移动效果,而乘可以让其放大,除可以在做帧动画的时候可以用到。除法会获取到纹理涂的某一块区间。
这是uv移动动画对uv进行的操作
v2f vert (a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//根据时间来偏移uv的x分量,从而让x分量达到移动效果
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex) + frac(float2(_ScrollX, 0.0)*_Time.y);
o.uv.zw = TRANSFORM_TEX(v.texcoord, _DetailTex) + frac(float2(_Scroll2X, 0.0)*_Time.y);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv.xy);
// apply fog
fixed4 col2 = tex2D(_DetailTex, i.uv.zw);
fixed4 cc = lerp(col, col2, col2.a);
return cc;
}
其中对uv的操作等价于
fixed4 frag(v2f i) : SV_Target
{
// sample the texture
i.uv.xy += frac(float2(_ScrollX, 0.0)*_Time.y);//纹理采样后对uv进行增减
fixed4 col = tex2D(_MainTex, i.uv.xy);
// apply fog
fixed4 col2 = tex2D(_DetailTex, i.uv.zw);
fixed4 cc = lerp(col, col2, col2.a);
return cc;
}
这是帧动画对uv进行的操作
fixed4 frag (v2f i) : SV_Target
{
float time = floor(_Time.y*_Speed);//floor函数取整
float row = floor(time / _HorizontalAmount);//time除以_HorizontalAmount的结果商来做诶当前的对应的行索引
//float row = fmod(time, _HorizontalAmount);
float column = time - row * _HorizontalAmount; //使用他们的余数作为列索引
_Test = _Test2;
//half2 uv = i.uv + half2(column, -row);//对uv纹理进行偏移,xy的改变会让图片位置改变
//uv.x /= _HorizontalAmount;//UV.x把图片分成HorizontalAmount份
//uv.y /= _VerticalAmount;//uv。y把图片分成HorizontalAmount份
fixed2 seqUV = float2((i.uv.x) / _HorizontalAmount, (i.uv.y) / _VerticalAmount);
seqUV.x += row / _HorizontalAmount;
seqUV.y -= column / _VerticalAmount;
fixed2 uv = i.uv + fixed2(column, -row);
uv.x /= _HorizontalAmount;
uv.y /= _VerticalAmount;
fixed4 c = tex2D(_MainTex, uv);
c.rgb *= _Color;
return c;
}
顶点动画是对顶点动态改变而形成动画
对顶点改变主要是在顶点着色器中对顶点进行的改变,来造成图片向各个地方进行延伸或缩减
而上图的计算纹理就是对于上面的纹理动画,利用_Speed变量来控制纹理动画的快慢