float4x4 matWVP : register(c0); float4 res : register(c5); float3 viewPos : register(c4); float3 lightDir : register(c6); float3x3 viewMatrixRotInv : register(c7); float4 projScaleOffsetInv : register(c11); struct vsOut { float4 p : POSITION; float2 t : TEXCOORD0; float3 e : TEXCOORD1; float2 l : TEXCOORD2; }; vsOut vs_main(float4 p : POSITION) { vsOut o = { p, p.xy, p.xyw, (float2)0.f }; o.p.xy += float2(-1.f, 1.f) * res.zw; o.t = o.t * float2(.5f, -.5f) + .5f; o.e.xy = o.e.xy * projScaleOffsetInv.xy + projScaleOffsetInv.zw; o.e = mul(o.e, viewMatrixRotInv); o.e.xy += float2(-1.f, 1.f) * res.zw; // Compute light position float4 lightPos = mul( float4(viewPos - lightDir, 1.0f), matWVP ); o.l = clamp( lightPos.xy / abs(lightPos.w), -1.f, 1.f ); o.l = o.l * float2(.5f, -.5f) + .5f; return o; };