您的位置:首页 > 其它

Shader动画之UV动画与顶点动画

2017-12-18 20:40 281 查看
用Shader实现动画主要包括两种方式:

1.UV动画

主要用于 序列帧、模拟无限重复的背景

让模型顶点对应的uv随时间变化,使其对应纹理像素不断随时间变化

但是无法达到让物体“变形”的效果

例如:

v2f vert(a2v v){
v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord,_FirstLayer) + frac(float2(_MoveSpeed1,0.0) * _Time.y);
o.uv.zw = TRANSFORM_TEX(v.texcoord,_SecendLayer) + frac(float2(_MoveSpeed2,0.0) * _Time.y);
return o;
}
float4 frag(v2f i):SV_Target{
float4 color1 = tex2D(_FirstLayer,i.uv.xy);
float4 color2 = tex2D(_SecendLayer,i.uv.zw);
float4 color = lerp(color1,color2,1 - color1.a);
return color;
}
其中 
TRANSFORM_TEX()方法使用时必须注意,需要提前声明 纹理名_ST  变量,这是因为该方法的作用是计算模型空间下的顶点UV,对应的 纹理UV,
可以理解成,为模型的每个顶点指定其所对应的是纹理贴图上的哪一个像素。 但是,Unity中纹理贴图都会自动对应两个基础属性,Tiling 和 Offset
其中 Tiling 是指纹理贴图的阵列(相当于行、列方向的重复次数),设置为 3 x 3 ,即每行有3个,每列有3个。
Offset 是指贴图的偏移,因为我们要在代码中实现uv偏移,这里设置为0




2.顶点动画

原理和uv动画有相同的地方,但是顶点动画

可以让物体动起来的同时,达到变形的效果

其主要原理是在 顶点着色器中对模型的顶点进行偏移,再将偏移后的顶点位置输出到片元着色器中。

用正弦函数,以时间为变化量,输出对应的 x方向偏移,即可模拟简单的水流效果

y = Asin(频率 * t  + w)

v2f vert(a2v v){
v2f o;
float4 offset = float4(0.0,0.0,0.0,0.0);
offset.x = sin(_Frequency * _Time.y  + v.vertex.x * _WaveLength + v.vertex.y * _WaveLength + v.vertex.z* _WaveLength) * _Magnitude;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex + offset);
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.uv += float2(0.0,_Time.y * _Speed);
return o;
}
float4 frag(v2f i):SV_Target{
float4 c = tex2D(_MainTex,i.uv);
c.rab *= _Color;
return c;
}








内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Shader 动画