gl_FragDepth est une des built-in variables disponibles dans GLSL. Plus exactement, gl_FragDepth est une variable de sortie du fragment shader. gl_FragDepth sert à mettre à jour la valeur du depth buffer pour le fragment en cours de traitement. C’est un variable de type float.
gl_FragDepth n’est pas obligatoire et si elle n’est pas présente dans le pixel shader (ooops le fragment shader je voulais dire), OpenGL la met à jour automatiquement avec la bonne valeur. Quand elle est présente dans le frag shader, le developpeur doit bien sur la mettre à jour, mais doit aussi faire attention aux différents branchmements (if/else) afin qu’une valeur soit écrite quelque soit la branche. En résumé, gl_FragDepth doit être obligatoirement mise à jour dans tous les cas, sinon sa valeur sera indéfinie (car OpenGL ne va pas s’en occuper).
Quelle valeur écrire dans gl_FragDepth? Et bien je vois deux cas: soit une valeur qui dépend de votre algo, soit une simple copie de gl_FragCoord.z. Un petit example de frag shader:
uniform float x; void main (void) { if (x < 0.5) gl_FragDepth = x; else gl_FragDepth = gl_FragCoord.z; }
En général gl_FragDepth varie de 0.0 à 1.0:
– 0.0 représente un pixel sur le near plane de la camera
– 1.0 représente un pixel sur le far plane de la camera
gl_FragDepth est disponible dans toutes les version de GLSL, y compris dans le GLSL d’OpenGL 4 et 4.1.
Voilà, c’est tout ce que j’ai à dire sur gl_FragDepth pour aujourd’hui! Si j’ai dit une bétise ou mieux si vous avez quelque chose à ajouter par rapport à gl_FragDepth, un petit commentaire (ou un tweet) fera l’affaire.
A noter toutefois, et si je ne dis pas de bêtise, si on touche à cette variable de sortie, on empêche la carte de faire du “early z-cull”.
Le Fragment Shader n’aurait même pas été appelé si le depth-test foirait, alors qu’en touchant à cette variable la carte ne peut pas savoir ce que tu vas écrire dedans, donc ne connait pas à l’avance le résultat du depth-test et appelle le shader pour tous les fragments.
J’imagine qu’on doit écrire dans cette variable pour des algos bien précis.
Effectivement, la reprogrammation de gl_FragDepth desactive l’early-z-culling. Mais AMD a une solution à ce problème: GL_AMD_conservative_depth…
Merci beacoup pour le poste. Ma question est : Est ce qu’on peut utiliser gl_fragedepth avec les points, au lieu de triangles? je veux changer la profondeur des fragment du point affiché sur l’écran et aynt un size (gl.PointSize=5.0)?
Merci d’avance