views:

40

answers:

2

Hi folks this should be an easy task but for some reason I do not get it worked out...

I just want to get a visualization of the depth in my scene using a shader:

float4x4 matViewProjection;
float4x4 matWorld;
float4 eyePos;

struct VS_OUTPUT 
{
  float4 position : POSITION0;
  float depth : TEXCOORD0;
};

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );

 float3 posWorld = mul(input.position, matWorld);
 output.depth = distance(posWorld, eyePos);
 return( output );
}

To get the depth value (or so I thought) I calculate the distance between the position in world space and the view position.

And the corresponding pixel shader

float4 ps_main(VS_OUTPUT input) : COLOR0
{   
   float depth = input.depth;
   return float4(depth, depth, depth, 1.0f);
}

Which results nothing but a white color

So I started trial & error multiplying a value to depth:

float depth = input.depth * 0.005f;

which gives a satisfying result depending on the distance to the object. So if I get closer to the object I will have to adjust the value again.

So theres something very wrong...

Thanks for reading!

+1  A: 

Well your problem is that you aren't normalising the depth value at any point. It can be anywhere in the range of ZNear to ZFar.

Try the following for your vert shader:

VS_OUTPUT vs_main( VS_INPUT input )
{
 VS_OUTPUT output;
 output.position = mul( input.position, matViewProjection );
 output.depth    = output.position.z / output.position.w;
 return( output );
}

After w divide any valid Z-value will be in the range 0 to 1. Any Z-Value that is not in this range is outside the frustum (ie in front of the near clipping plane or behind the far clipping plane) and hence won't get to the pixel shader anyway.

Goz
Yes... I didn't forgot about normalizing the value, but I used the normalize() function for it and just got a grey color... I did not think about using the homogenious divide - thanks for this reminder!!!
bear in mind that the sort of normalisation i'm talking about is very different to a vector normalisation.
Goz
A: 

Just a short addition: using

output.depth    = output.position.z / output.position.w;

results in a dark to bright coloring along the distance while

output.depth    = 1.0f - (output.position.z / output.position.w);

would result in bright to dark coloring, which is hopefully correct as well.

Yeah thats perfectly ok.
Goz