#include "common.hlsli" #include "shadow.hlsli" struct v2p { float3 lightToPos : TEXCOORD0; // light center to plane vector float3 vPos : TEXCOORD1; // position in camera space float fDensity : TEXCOORD2; // plane density along Z axis }; uniform float4 m_lmap[2]; Texture2D s_noise; #define USE_LMAP #define USE_LMAPXFORM #define USE_SHADOW // Pixel float4 main(v2p I) : SV_Target { // ----- shadow float4 P4 = float4(I.vPos, 1); float4 PS = mul(m_shadow, P4); float s = 1.0f; #ifdef USE_SHADOW s = shadow(PS); #endif // ----- lightmap float4 lightmap = 1.0f; #ifdef USE_LMAP #ifdef USE_LMAPXFORM PS.x = dot(P4, m_lmap[0]); PS.y = dot(P4, m_lmap[1]); #endif lightmap = s_lmap.Sample(smp_rtlinear, PS.xy / PS.w); #endif // ----- attenuate float rsqr = dot(I.lightToPos, I.lightToPos); // distance 2 light (squared) float att = saturate(1 - rsqr * Ldynamic_pos.w); // q-linear attenuate // ----- noise PS.xy /= PS.w; PS.xy *= 0.3333; float time = timers.z * 0.1; PS.x += time; float4 t_noise = s_noise.SampleLevel(smp_linear, PS.xy, 0); PS.x -= time; PS.y -= time * 0.70091; t_noise *= s_noise.SampleLevel(smp_linear, PS.xy, 0); t_noise = t_noise * 0.5 + 0.5; // out float maxIntens = I.fDensity; float3 result = maxIntens * s * att; result *= lightmap.xyz; result *= Ldynamic_color.xyz * t_noise.xyz; return float4(PushGamma(result), 0); }