#ifndef CUSTOMSHADOWMAP_BASE_INCLUDE #define CUSTOMSHADOWMAP_BASE_INCLUDE float4 tex2Dproj(sampler2D s, in float3 t) { return tex2D(s, t.xy / t.z); } TEXTURE2D(_SGameShadowMap); SAMPLER(sampler_SGameShadowMap); half _SGameShadowBias; half _SGameShadowStrength; float4x4 _ShadowMatrix; inline float4 GetCustomShadowCoords(float3 worldPos) { return mul(_ShadowMatrix, float4(worldPos, 1)); } inline float GetCustomShadowAtten(float4 shadowCoords) { #if defined(SHADER_API_MOBILE) float lightDepth = SAMPLE_TEXTURE2D(_SGameShadowMap, sampler_SGameShadowMap, shadowCoords.xy / shadowCoords.w).r; #else float lightDepth = 1 - SAMPLE_TEXTURE2D(_SGameShadowMap, sampler_SGameShadowMap, shadowCoords.xy / shadowCoords.w).r; #endif float atten = lerp(1, 0.35, step(lightDepth, (shadowCoords.z - _SGameShadowBias))); // float atten = (shadowCoords.z - _SGameShadowBias) < lightDepth ? 1 : 0.5; // atten = lerp(1, atten, _SGameShadowStrength); // atten = pow(atten, 2); atten = lerp(atten, 1, step(0.99 , shadowCoords.x)); atten = lerp(atten, 1, step(0.99 , shadowCoords.y)); return atten; } #if defined(_PROJECTOR_ON) float4x4 _ProjectorVP; TEXTURE2D(_ProjectorTex); SAMPLER(sampler_ProjectorTex); inline float4 GetProjectorUV(float4 vertex, float4x4 o2wMat) { float4x4 propMVP = mul(_ProjectorVP, o2wMat); float4 projProjPos = mul(propMVP, vertex); projProjPos = ComputeScreenPos(projProjPos); return projProjPos; } inline float3 GetProjectorColor(float3 oriCol, float4 projUV) { return oriCol + SAMPLE_TEXTURE2D(_ProjectorTex, sampler_ProjectorTex, projUV).rgb; } #endif #endif