Shader "Animations/VertexAnimation"{
Properties{
_MainTex ("Texture", 2D) = "white" {}
_AnimMap ("Animation Texture", 2D) ="white" {}
_AnimNorm ("Animation Normals", 2D) ="white" {}
}
SubShader{
Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalRenderPipeline"}
Cull off
Pass{
Tags{ "LightMode"="UniversalForward" }
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct appdata{
float2 uv : TEXCOORD0;
float4 pos : POSITION;
half3 normal : NORMAL;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
CBUFFER_START(UnityPerMaterial)
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _AnimMap;
float4 _AnimMap_TexelSize;
sampler2D _AnimNorm;
float4 _AnimNorm_TexelSize;
CBUFFER_END
float4 ObjectToClipPos (float3 pos){
return mul (UNITY_MATRIX_VP, mul (UNITY_MATRIX_M, float4 (pos,1)));
}
v2f vert(appdata v, uint vid : SV_VertexID){
UNITY_SETUP_INSTANCE_ID(v);
float x = (vid + 0.5) * _AnimMap_TexelSize.x;
float y = fmod(_Time.y / 1, 1);
float4 pos = tex2Dlod(_AnimMap, float4(x, y, 0, 0));
float3 normal = tex2Dlod(_AnimNorm, float4(x, y, 0, 0));
v2f o;
o.vertex = ObjectToClipPos(pos);
o.normal = TransformObjectToWorldNormal(normal);
o.uv = v.uv;
return o;
}
half4 frag (v2f i) : SV_Target{
half diff = dot(i.normal, float3(0,1,0)) * 0.5 + 0.5;
half4 col = tex2D(_MainTex, i.uv);
return diff * col;
}
ENDHLSL
}
}
}