(GLSL) Ecriture dans gl_FragDepth

GLSL, OpenGL shading language



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.

3 thoughts on “(GLSL) Ecriture dans gl_FragDepth”

  1. Matumbo

    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.

  2. loubna

    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

Leave a Comment

Your email address will not be published. Required fields are marked *