先设置序列帧图WarpMode 为Repeat;
Shader部分
Shader "My/Sequence" {
Properties {
_Opacity ("透明度", range(0, 1)) = 0.5
_Sequence ("序列帧", 2d) = "gray"{}
_RowCount ("行数", int) = 1
_ColCount ("列数", int) = 1
_Speed ("速度", range(0.0, 15.0)) = 1
}
SubShader {
Tags {
"Queue"="Transparent" // 调整渲染顺序
"RenderType"="Transparent" // 对应改为Cutout
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Pass {
Name "FORWARD_AD"
Tags {
"LightMode"="ForwardBase"
}
Blend One One // 修改混合方式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
// 输入参数
uniform sampler2D _Sequence; uniform float4 _Sequence_ST;
uniform half _Opacity;
uniform half _RowCount;
uniform half _ColCount;
uniform half _Speed;
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
float3 normal:NORMAL; //法线
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 顶点位置 总是必要
float2 uv : TEXCOORD0; // UV信息 采样贴图用
};
// 输入结构>>>顶点Shader>>>输出结构
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
// 顶点位置 OS>CS
o.pos = UnityObjectToClipPos( v.vertex);
// UV信息 支持TilingOffset
o.uv = TRANSFORM_TEX(v.uv, _Sequence);
//计算序列id
float id=floor(_Time.z*_Speed);
//所在行=当前值/列数 floor 取整
float idV=floor(id/_ColCount);
//计算当前id所在列 求余 余数=当前值-所在行*总列数
float idU= id - idV * _ColCount;
//计算横向U轴长度(步幅) 1/列数
float stepU=1.0/_ColCount;
//计算纵向V轴长度(步幅) 1/行数
float stepV=1.0/_RowCount;
//计算初始uv uv是左下角为原点 序列一般以左上为远点,所用所在列需要倒过来
float2 initUV=o.uv*float2(stepU,stepV)+float2(0.0,stepV*(_RowCount-1+idV));
o.uv=initUV+float2(idU*stepU,idV*stepV);
return o;
}
// 输出结构>>>像素
half4 frag(VertexOutput i) : COLOR {
// 采样贴图 RGB颜色 A透贴不必须
half4 var_Sequence = tex2D(_Sequence, i.uv);
half3 finalRGB = var_Sequence.rgb;
half opacity = var_Sequence.a * _Opacity;
// 返回值
return half4(finalRGB * opacity, opacity);
}
ENDCG
}
}
}