(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.


2 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.

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

− 6 = 1