Shader "Custom/URP_Projector" { Properties { _Color ("Tint Color", Color) = (1,1,1,1) _Attenuation ("Falloff", Range(0.0, 1.0)) = 1.0 _ShadowTex ("Cookie", 2D) = "gray" {} } SubShader { Tags {"Queue"="Transparent"} Pass { ZWrite Off ColorMask RGB Blend SrcAlpha One // Additive blending Offset -1, -1 HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fog #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionOS : POSITION; }; struct Varyings { float4 positionHCS : SV_POSITION; float4 uvShadow : TEXCOORD0; float fogFactor : TEXCOORD1; }; CBUFFER_START(UnityPerMaterial) float4 _Color; float _Attenuation; CBUFFER_END TEXTURE2D(_ShadowTex); SAMPLER(sampler_ShadowTex); float4x4 unity_Projector; Varyings vert(Attributes IN) { Varyings OUT; OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz); OUT.uvShadow = mul(unity_Projector, IN.positionOS); OUT.fogFactor = ComputeFogFactor(OUT.positionHCS.z / OUT.positionHCS.w); return OUT; } float4 frag(Varyings IN) : SV_Target { float2 projUV = IN.uvShadow.xy / IN.uvShadow.w; float4 texCookie = SAMPLE_TEXTURE2D(_ShadowTex, sampler_ShadowTex, projUV); float4 outColor = _Color * texCookie.a; float depth = IN.uvShadow.z; float atten = clamp(1.0 - abs(depth) + _Attenuation, 0.0, 1.0); float3 color = outColor.rgb * atten; color = MixFog(color, IN.fogFactor); return float4(color, outColor.a); } ENDHLSL } } }