庄懂老师https://space.bilibili.com/6373917?spm_id_from=333.788.b_765f7570696e666f.1
序列帧动画
两层PASS,AB+AD
Shader "Unlit/sequence"
{
Properties{
_MainTex ("RGB:颜色 A:透贴",2d)="white"{}
_Opacity ("透明度",range(0,1))=0.5
_Sequence ("序列帧",2d)="geay"{}
_RowCount ("行数",int)=1
_ColConut ("列数",int)=1
_Speed ("速度",range(1,20))=5
}
SubShader{
Pass {
Name"AB"
Tags {
"LightMode" = "ForwardBase"
"Queue"="Transparent"
"RenderType"="TransparentCutout" // 对应改为Cutout(在此处无用,为了规范以及其他情况可能使用)
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
}
Blend One OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform half _Opacity;
struct VertexInput {
float4 vertex : POSITION; //老朋友顶点位置
float2 uv0:TEXCOORD0; //uv信息采样贴图用
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0:TEXCOORD0;
};
VertexOutput vert(VertexInput v) {
VertexOutput o = (VertexOutput)0;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv0 =v.uv0;
return o;
}
float4 frag(VertexOutput i) : COLOR {
half4 var_MainTex=tex2D(_MainTex,i.uv0); //采样贴图 RGB颜色 A透贴
half3 finalRGB= var_MainTex.rgb;
half opacity = var_MainTex.a * _Opacity;
return half4(finalRGB*opacity,opacity);
}
ENDCG
}
Pass {
Tags {
"Queue"="Transparent"
"RenderType"="TransparentCutout" // 对应改为Cutout(在此处无用,为了规范以及其他情况可能使用)
"ForceNoShadowCasting"="True" // 关闭阴影投射
"IgnoreProjector"="True" // 不响应投射器
"LightMode" = "ForwardBase"
}
Blend One One
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _Sequence; uniform float4 _Sequence_ST;
uniform half _RowCount;
uniform half _ColConut;
uniform half _Speed;
struct VertexInput {
float4 vertex : POSITION; //老朋友顶点位置
float2 uv0:TEXCOORD0; //uv信息采样贴图用
float3 normal: NORMAL ;
};
struct VertexOutput {
float4 pos : SV_POSITION;
float2 uv0:TEXCOORD0;
};
VertexOutput vert(VertexInput v) {
VertexOutput o = (VertexOutput)0;
v.vertex.xyz += v.normal *0.0005;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv0 =TRANSFORM_TEX(v.uv0,_Sequence); //UV信息 支持Tilling Offset
float id =floor(_Time.y*_Speed);
float idV = floor(id/_ColConut); //获取列数
float idU = id-idV*_ColConut; //获取行数
float stepU =1.0/_ColConut; //获取单个图片列步幅
float stepV =1.0/_RowCount; //获取单个图片行步幅
float2 initUV = o.uv0 * float2(stepU,stepV) + float2(0.0,stepV*(_RowCount-1));//初始序列帧位置
o.uv0 = initUV + float2(idU*stepU,-idV*stepV);
return o;
}
float4 frag(VertexOutput i) : COLOR {
half4 var_Sequence=tex2D(_Sequence,i.uv0); //采样贴图 RGB颜色 A透贴
half3 finalRGB=var_Sequence.rgb;
half opacity = var_Sequence.a;
return half4(finalRGB*opacity,opacity);
}
ENDCG
}
}
FallBack "Diffuse"
}
unityUV在左下角,有些序列帧开始图位置不一样需要修正
极坐标
Shader "Unlit/co15-coordinator"
{
Properties
{
_MainTex ("RGB:颜色 A:透贴", 2D) = "gray" {}
_Opacity ("透明度",range(0,1)) = 0.5
[HDR]_Color("颜色",color) = (1.0,1.0,1.0,1.0)
}
SubShader
{
Tags {
"Queue" = "Transparent" //加个渲染序列,调整渲染顺序
"RenderType" = "Transparent"
"ForceNoShadowCasting"= "True" //特效里默认关闭阴影投影
"IgnoreProjector" = "True" //特效里默认不响应投射器
}
Pass
{
Name "Forward_AB"
Tags{"LightMode" = "ForwardBase"}
Blend One OneMinusSrcAlpha //修改混合方式
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
uniform half _Opacity;
uniform half3 _Color;
struct appdata
{
float4 vertex : POSITION;
float2 uv0 : TEXCOORD0;
float4 color : COLOR; //追加顶点色
};
struct v2f
{
float2 uv0 : TEXCOORD0;
float4 pos : SV_POSITION;
float4 color : COLOR;
};
v2f vert (appdata v)
{
v2f o;
o.pos= UnityObjectToClipPos(v.vertex);
o.uv0 = TRANSFORM_TEX(v.uv0, _MainTex);//视频中删掉我觉得怪可惜的,可以尝试别的贴图可能有不错效果呢
o.color=v.color;
return o;
}
fixed4 frag (v2f i) : COLOR
{
i.uv0 = i.uv0- float2(0.5,0.5);
float theta = atan2(i.uv0.y,i.uv0.x);
theta = theta/3.14159*0.5+0.5;
float r = length(i.uv0)+frac(_Time.x*3);
i.uv0 = float2(theta,r);
half4 var_MainTex = tex2D(_MainTex, i.uv0);
half3 finalRGB = (1-var_MainTex.rgb)*_Color;
half opacity = (1-var_MainTex.r)*_Opacity*i.color.r;
return half4(finalRGB*opacity,opacity);
}
ENDCG
}
}
}