PDA

View Full Version : How does gl_position.zw effect zbuffer?

HelloKitty
02-26-2013, 08:26 PM
I am making a custom projection system, and I am writing directly to gl_position.xyzw in vertex shader instead of using traditional viewprojection matrix.

I am currently setting the w parameter to 1.0.

Which value z, or w is used to fill the zbuffer? D
o I break the zbuffer by setting w to 1.0?

thokra
02-26-2013, 11:27 PM
Neither. The depth value after projection and perspective divide, mapped to [0,1] is used.

By manually setting w to one, you only express that no projection at all should take place. In general that's a bad thing. But there's also times when you provide normalized device coordinates directly in which case a w of 1 is absolutely necessary to preserve the coordinates for the viewport mapping. One classic example of that is a screen aligned quad.

mbentrup
02-27-2013, 01:25 AM
Well, to be more precise: gl_position contains the homogeneous coordinates of the already projected vertex, there's no further perspective transformation in the GL pipeline. The "perspective divide" is IMHO a bad misnomer, it is unrelated to the perspective projection, it is just needed for the normalization of the homogeneous coordinates to get Cartesian coordinates.

The final value written to the Z-buffer is then remapped linearly from [-1..1] to the GL depth range (usually [0..1]), so the GLSL formula would be:

mix(glDepthRange.near, glDepthRange.far, 0.5 * gl_position.z / gl_position.w + 0.5)

By setting w to 1.0 you will break perspective correct interpolation, because varyings are interpolated using 1/w for the perspective correction. Other than that there should be no problem with setting w to 1.0.

Dark Photon
02-28-2013, 05:00 AM
The "perspective divide" is IMHO a bad misnomer, it is unrelated to the perspective projection...
I wouldn't go that far. Typically eye-space .w == 1 (standard 3D). Of the two main projections (orthographic and perspective), perspective is the only one that populates clip-space .w with something besides eye-space .w, making use of the perspective divide in the position pipe. See OpenGL Projection Matrix (Song Ho Ahn) (http://www.songho.ca/opengl/gl_projectionmatrix.html) That said, if your crafty you could use the perspective divide for something else, but that's not the typical use case.

mbentrup
03-01-2013, 03:43 AM
Maybe it's not a bad name per-se, but I think it is confusing when you read a math book on homogeneous coordinates and projective geometry to understand the math behind the OpenGL transforms.

I think the name "perspective divide" suggests, that this division is part of the perspective transformation, but math books explain that multiplication of the coordinates by a non-zero factor (like 1/w) doesn't change the represented point, so it isn't really a transformation. All math books I read call this operation "normalization", and considering that the result is called normalized (device) coordinate, I'd say that would have been the better name.