# Light Space and Light Texture Space in shaders

I'm looking into material translucency and I'm working through some GPU Gems documentation (http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html).

In Example 16-4 it references matrices for both light space and light texture space.

   // Given a point in object space, lookup into depth textures
// returns depth

float trace(float3 P,
uniform float4x4  lightTexMatrix, // to light texture space
uniform float4x4  lightMatrix,    // to light space
uniform sampler2D lightDepthTex)
{
// transform point into light texture space
float4 texCoord = mul(lightTexMatrix, float4(P, 1.0));

// get distance from light at entry point
float d_i = tex2Dproj(lightDepthTex, texCoord.xyw);

// transform position to light space
float4 Plight = mul(lightMatrix, float4(P, 1.0));

// distance of this pixel from light (exit)
float d_o = length(Plight);

// calculate depth
float s = d_o - d_i;

return s;
}


Can anyone explain to me what light texture space iS and how exactly I'd calculate a matrix for it? I think I'm OK getting the light matrix and it's projection matrix but a 4x4 light texture space matrix is blowing my mind.

I can't find anything else that specifically references those terms, but I'm well aware that terminology for shaders changes depending on who you speak to. They may well be better known as something else, though I'd hope Nvidia would be using well recognised terminology.

From quickly perusing the article, it sounds like the texture they're talking about is simply a shadow map for the light, although it stores linear world-space distance in a color channel rather than using the nonlinear post-projective depth. In any case, lightTexMatrix here is the same matrix you'd use for calculating the position to sample a shadow map—namely, it transforms the point to light space, then applies the shadow map projection matrix, then remaps the result from the [-1, 1] of NDC to the [0, 1] of texture coordinates.
• Ok thanks, I'll have a look at that. I'm actually having problems with something else in the shader at the moment preventing it from compiling so I can't check it at the moment before I get that sorted. But from what I gather you mean something like:  float4 point = mul( LightMatrix, input.position ); float4 texCoord = mul( LightProjectionMatrix, point ); float d_i = Linear01Depth( tex2Dproj( texCoord.xyw ).r ); – Dave Jan 11 '14 at 16:50