之前给客户写的一个比较常用的序列帧shader,方便他适用项目的各种情况;
先放个URP书写模板,然后往里塞东西就行;
Shader "Unlit/URP_normal"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderPipeline"="UniversalRenderPipeline"
"RenderType"="Opaque" }
LOD 100
Pass
{ Tags{"LightMode"="UniversalForward"}
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
uniform float4 _MainTex_ST;
CBUFFER_END
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
float4 frag (v2f i) : SV_Target
{
half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
return col;
}
ENDHLSL
}
}
}
Shader "Unlit/URP_XuLieZhen"
{
Properties
{
[Header(Option)]
[Enum(UnityEngine.Rendering.BlendOp)] _BlendOp ("BlendOp", Float) = 0
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend ("SrcBlend", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend ("DstBlend", Float) = 0
[Enum(UnityEngine.Rendering.CullMode)]_CullMode ("CullMode", float) = 2
_Sequence ("序列帧", 2D) = "gray"{}
_RowCount ("行数", int) = 1
_ColCount ("列数", int) = 1
_Speed ("速度", range(-15.0, 15.0)) = 1
_Opacity ("透明度", range(0, 1)) = 0.5
}
SubShader
{
Tags {
"RenderPipeline"="UniversalRenderPipeline"
"Queue"="Transparent" "RenderType"="Opaque"
"ForceNoShadowCasting"="True" "IgnoreProjector"="True"
}
LOD 100
Pass
{
Name "XuLieZhen"
Tags{"LightMode"="UniversalForward"}
BlendOp [_BlendOp]
Blend [_SrcBlend] [_DstBlend]
Cull [_CullMode]
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _SHADOWS_SOFT
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
uniform float4 _Sequence_ST;
uniform half _Opacity;
uniform half _RowCount;
uniform half _ColCount;
uniform half _Speed;
CBUFFER_END
TEXTURE2D(_Sequence);
SAMPLER(sampler_Sequence);
struct VertexInput
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct VertexOutput
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
VertexOutput vert(VertexInput v)
{
VertexOutput o = (VertexOutput)0;
//v.vertex.xyz += v.normal * 0.01;
o.vertex = TransformObjectToHClip(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _Sequence);
float id = floor(_Time.z * _Speed);
float idV = floor(id / _ColCount);
float idU = id - idV * _ColCount;
float stepU = 1.0 / _ColCount;
float stepV = 1.0 / _RowCount;
float2 initUV = o.uv * float2(stepU, stepV) + float2(0.0, stepV * (_ColCount - 1.0));
o.uv = initUV + float2(idU * stepU, -idV * stepV);
return o;
}
float4 frag(VertexOutput i) : COLOR
{
// sample the texture
half4 var_Sequence = SAMPLE_TEXTURE2D(_Sequence, sampler_Sequence, i.uv);
half3 finalRGB = var_Sequence.rgb;
half opacity = var_Sequence.a * _Opacity;
return half4(finalRGB * opacity, opacity);
}
ENDHLSL
}
}
}