quote:
>The weird thing is, glDepthRange(0, 0) can actually have interesting applications when trying to get very advanced effects, dealing with z masking and depth textures.
Huh, I''ve never heard about anything about this technique !?
Could you tell a little bit more please ? Give an example if possible ?
Thanks in advance.
No probs. One application, for example, are reflection. Everybody always told you, that you need a stencil buffer to make good multiple reflection in your scene, right ? Wrong. You don''t need a stencil buffer at all, all you need is glDepthRange. Effectively, calling glDepthRange(0,0) degenerates the z value written to the zbuffer to always be zero, but does not effect other raterization properties of the face. This makes it a perfect mask. Instead of a stencil mask, you can just write a z-mask with this method (if you use GL_LESS as depth buffer test on your scene, then the masked z buffer (being zero at masked pixels) will make sure that *no* geometry can draw into the masked region). You can unmask the region with glDepthRange(1,1). Here you go, perfect refllections, no stencil needed, works on every card that supports a zbuffer.
quote:
> Isn''t there an OGL extension, that uses the value 1/z in the buffer (kind of w-buffering)
I think the hardware decides it automatically for us.
But I may be wrong...
No it uses a linear zbuffer by default. The extension is called wgl_depth_float, I just looked it up. My 3D card does not support it, though.
quote:
Si 2 face s''intersectent, forcément elles ne sont pas coplanaires (sinon il y a comme qui dirait un pépin). Mais une question que je me pose : parles-tu d''une intersection en L, en T ou en X ?
En L je suis d''accord au détail près qu''il faut être tordu pour ne pas avoir les mêmes cordonnées dans l''angle. Donc ce ne peut logiquement pas être de cela dont tu parles, car la solution n''est pas de découper les polygones.
En T je suis d''accord uniquement si on voit le T de dos (c''est-à-dire si la caméra est au dessus de la lettre T).
En X je ne suis pas d''accord, car tu ne pourras pas te débarraser du "z-fighting" même en découpant les polygones.
Je parles du dernier cas, 2 faces qui s''intersectent en X. Hmm, comment expliquer ça, c''est pas évident... Ça à avoir avec la façon qu''OpenGL rasterise les triangles. Par l''interpolation de la valeur Z sur le triangle, OGL perds tout d''abord de la précision, et puis il n''est pas garanti, qu''un certain pixel reçoit la même valeur z, si les vertex bougent un tout petit peu. Disons, que tu as 2 faces en X, l''une d''entre elles bouge lentement en X ou Y. Regardes l''intersection de plus proche, tu verras qu''il y a une sorte de scintillement dans les pixel qui font l''intersection. C''est un effet comparable à celui créer par les vertex T. Ça doit pas nécessairement être énorme, mais selon les couleurs et le contrast, ça peut être assez génant. Par contre, si tu découpes les faces à l''intersection, cette ligne est mathématiquement précise, elle aura toujours les même valeurs z, même si elle bouge en X ou Y. L''intersection sera toujours claire et sans défauts. Les faces coplanaires sont un cas différent, là il faut le poly offset.
quote:
>or a 64bit zbuffer, as some SGI systems have
Well, of course it may be a little bit better. But it''s just about pushing the limits of the buffer a bit further. It does not really eliminate the problem.
I would say, it practically does eleminate the problem. Keep in mind, that the range of a 64bit buffer is around 1,100,000,000,000 times higher than the range of a 24bit buffer... means that instead of have two values mapping over the range of one single z unit in your 24 bit buffer, they map to a range of over 1 trillion units in the 64 bit buffer... That should *really* be enough