Members - Reputation: 100
Posted 22 February 2012 - 07:48 PM
I'm looking for a way to get the correct depth value in GLSL. I am rendering a cube and I am stepping inside that cube (it's a volume rendering application).
In the picture below
The blue dots should have a deeper z value than the red one. However, when I am displaying the value of z as a color, I am getting the same color at the blue (on the outside) as the red dot which is in front (meaning I am getting the same depth). I am trying with gl_FragCoord.z (and tried several others too). Does anyone have a suggestion what I could use.
Members - Reputation: 1121
Posted 25 February 2012 - 02:27 AM
How are you doing your volume rendering?
Are you doing ray marching in the fragment shader and are you looking at isosurfaces? Then you probably have just rendered a viewport quad and start marching until you find the isovalue. In that case you should look how far you have traveled along the ray and use this as depth. (Well this is rather distance than depth. The blue dots would have the same depth, but a different distance. But you can always compute the depth by projecting the distance on the view ray of the center pixel.) When doing ray marching gl_FragCoord.z does not have any meaning, since you just render a quad. (In this case gl_FragCoord.z gives you probably the same value all over the viewport…)
Or are you doing it by some sort of slicing? If you place your slices in world/view space then it should be safe to use the depth. In fact you want linear depth values, right? In a fragment shader you could get them like this:
linearDepth = 1.0 / gl_FragCoord.w; // get view space depth scaled = (linearDepth - BoxNear) / (BoxFar – BoxNear); // normalize to [0..1]gl_FragCoord.w stores the reciprocal of the depth in view space (positive in front of the camera).
BoxNear and BoxFar are the maximum extends of the box you’re looking at along the z-axis in view space.
Indeed, it may already be correct (in case you're slicing), but not scaled properly to let you see it. You could try to scale the depths a little so that the front of the box is mapped to black and the back to white (as I have done above).
Is depth being output as a color? is the color the only info you are going on? the values may be very close together and may look the same, but may not be.