uv动画
什么是uv动画?我们知道贴图的渲染就是每个顶点有一个uv属性,光栅化之后,片段着色器得到线性插值的一个uv坐标根据这个坐标去对应的纹理像素。那么我们只需要在顶点着色去给uv坐标一个根据时间增量就可以实现了。
unity提供了一些内置变量,其中就有时间相关的
_Time其中就是一个时间累加的变量了,我取的是_Time.y正常的时间累加
unity相关文档链接
核心代码
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv += float2(_XSpeed, _YSpeed)*_Time.y;//这就是uv随着时间累加的关键代码了
return o;
}
我这里没有限制uv在0-1因为我纹理的属性WrapMode 是 Repeat的,如果不是就要自己限制uv坐标在0-1范围内不然会出现意外的结果。
看一下效果图
完整代码
Shader "Unlit/UVMove"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_XSpeed("XSpeed",Range(-10,10)) = 0
_YSpeed("YSpeed",Range(-10,10)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
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;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _XSpeed;
float _YSpeed;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv += float2(_XSpeed, _YSpeed)*_Time.y;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}