UnityVATTool/Assets/Plugins/AnimMapBaker/Shaders/AnimMapWithShadowShader.shader

116 lines
2.2 KiB
Plaintext

/*
Created by jiadong chen
https://jiadong-chen.medium.com/
*/
Shader "chenjd/BuiltIn/AnimMapWithShadowShader"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
[Header(AnimMap)]
_AnimMap("AnimMap", 2D) = "white" {}
_AnimLen("Anim Length", Float) = 0
}
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
struct v2fShadow {
V2F_SHADOW_CASTER;
UNITY_VERTEX_OUTPUT_STEREO
};
float4 fragShadow(v2fShadow i) : SV_Target
{
SHADOW_CASTER_FRAGMENT(i)
}
sampler2D _AnimMap;
float4 _AnimMap_TexelSize;//x == 1/width
float _AnimLen;
v2f vert(appdata v, uint vid : SV_VertexID)
{
UNITY_SETUP_INSTANCE_ID(v);
float f = _Time.y / _AnimLen;
fmod(f, 1.0);
float animMap_x = (vid + 0.5) * _AnimMap_TexelSize.x;
float animMap_y = f;
float4 pos = tex2Dlod(_AnimMap, float4(animMap_x, animMap_y, 0, 0));
v2f o;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.vertex = UnityObjectToClipPos(pos);
return o;
}
ENDCG
SubShader
{
Pass
{
Tags { "RenderType" = "Opaque" "Queue" = "Geometry" }
Cull off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//开启gpu instancing
#pragma multi_compile_instancing
#include "UnityCG.cginc"
ENDCG
}
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment fragShadow
#pragma target 2.0
#pragma multi_compile_shadowcaster
ENDCG
}
}
}