今天开始给大家讲解动态效果第一弹:UV动画, 常见于特效使用,背景移动,贴图滚动效果等等。如图先看效果
其原理就是通过时间去修改UV坐标上的X值和Y值从而改变每个像素在模型表面的位置。
/* 这里是UnityUI面板得一个开关,通过变体_UVTIME
去控制是否Update Time,注意:变体的格式一定
是全部大写,不能有任何小写字母。*/
[Toggle] _UVTIME ("UvMoveTime", Float) = 0
/*使用变体都需要启用这个编译指令#pragma shader_feature
_UVTIME_ON 是判断条件 */
#pragma shader_feature _UVTIME_ON
//在片元着色器中判断变体状态
fixed4 frag (v2f i) : SV_Target
{
// 如果勾选了_UVTIME_ON,将开启Update Time;
#ifdef _UVTIME_ON
/*_Time是用来驱动shader内部的动画的变量,用来计算时间变量。
_Time的4个分量分别是(t/20, t, t*2, t*3);
_Time.y就是取4个分量的第2个分量。
*/
_Offset = _Time.y;
#endif
}
变体的使用有一篇参考文献写的非常好,我这里就不展开讲解了,各位技术大佬注意一点的是变体数量不能超过255个。另外变体使用不好,也会使shaderLab变得巨大,这里不展开详细得说明了大佬们请看参考文献:图形引擎实战:Unity Shader变体管理流程 - 知乎
_Offset = _Time.y;
_Time是用来驱动shader内部的动画的变量,用来计算时间变量。
_Time的4个分量分别是(t/20, t, t*2, t*3)
每个分量的值如下:
_Time.x = time / 20
_Time.y = time
_Time.z = time * 2
_Time.w = time * 3
参考unity官方文献:Unity - Manual: ShaderLab built-in values
完整代码如下:
Shader "Unlit/UV_move"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_Offset("Offset", Range(0,1)) = 0.0 //滚动的阈值
_U("U", Float) = 1.0 //X坐标方向上
_V("V", Float) = 1.0 //Y轴坐标方向上
/* 这里是UnityUI面板得一个开关,通过变体_UVTIME
去控制是否Update Time,注意:变体的格式一定
是全部大写,不能有任何小写字母。*/
[Toggle] _UVTIME ("UvMoveTime", Float) = 0
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
//变体得启用
#pragma shader_feature _UVTIME_ON
struct appdata
{
half4 vertex : POSITION;
fixed2 uv : TEXCOORD0;
};
struct v2f
{
fixed2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
half4 vertex : SV_POSITION;
};
sampler2D _MainTex;
fixed _Offset;
fixed _U;
fixed _V;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// 如果勾选了_UVTIME_ON,将开启Update Time;
#ifdef _UVTIME_ON
/*_Time是用来驱动shader内部的动画的变量,用来计算时间变量。
_Time的4个分量分别是(t/20, t, t*2, t*3);
_Time.y就是取4个分量的第2个分量。
*/
_Offset = _Time.y;
#endif
fixed2 uv = i.uv+_Offset*fixed2(_U,_V);
fixed4 col = tex2D(_MainTex, uv);
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}