Tests de validation et stencil buffer

1.   Chaîne de tests

       Voici la liste complète des tests de validation d’un point :

à Scissor Test à Alpha Test à Stencil Test à Depth Test à […] à framebuffer

2.   Scissor test

       Le scissor test est paramétré par :

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

       Cela permet de limiter l’affichage à un rectangle dont le coin haut – gauche à pour coordonnées (x, y) dans la fenêtre. Par défaut (x, y) = (0, 0) et width et height ont la même taille que la fenêtre.
       Le test est activé par :

glEnable(GL_SCISSOR_TEST)

3.   Alpha test

       Un point peut être éliminé par sa valeur alpha avec :

void glAlphaFunc( GLenum func, GLclampf ref )

       avec func = GL_NEVER, GL_LESS, GL_EQUAL, GL_LEQUAL, GL_GREATER, GL_NOTEQUAL, GL_GEQUAL, ou GL_ALWAYS
       Ne pas oublier, comme toujours : glEnable(GL_ALPHA_TEST)

4.   Stencil test

            Ce test est plus complexe, mais plus utile que les deux précédents. Tout comme le depth-buffer, le stencil-buffer est un espace mémoire de la taille du framebuffer. Mais cette fois son utilisation est libre. Sous AUX, ne pas oublier de le rajouter à l’initialisation :

auxInitDisplayMode(AUX_DOUBLE | AUX_RGBA | AUX_DEPTH | AUX_STENCIL);

4.1.               Effacement

       D’abord, le stencil étant comme le depth un buffer, il faut (le plus souvent) l’effacer à chaque image avec :

glClear(… | GL_STENCIL_BUFFER_BIT) ;

       La valeur de remplissage est paramétrable avec :

void glClearStencil( GLint s )

4.2.               Initialisation

            Comme pour tous les tests, il faut appeler :

glEnable(GL_STENCIL_TEST) ;

            Le test est paramétré par deux fonctions :

void glStencilFunc( GLenum func, GLint ref, GLuint mask)

            qui sert à indiquer le test à effectuer, les paramètres sont :

·        func = GL_NEVER, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUAL, GL_EQUAL, GL_NOTEQUAL, ou GL_ALWAYS

·        ref = valeur de référence du test

·        mask = masque binaire à appliquer à la valeur du stencil et à ref pour le test

La fonction :

void glStencilOp( GLenum fail, GLenum zfail, GLenum zpass )

            sert à indiquer ce qui se passe suivant le résultat du test du stencil et du depth, avec :

·        "fail" indique l’opération à effectuer sur la valeur dans le stencil lorsque le stencil test a échoué. Peut être égal à GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCR, GL_DECR, ou GL_INVERT.

·       " zfail" indique de même l’opération à effectuer si le stencil est passé mais pas le depth.

·        "zpass" indique l’opération à effectuer si le stencil et le depth sont validés.

4.3 Utilité

Pour le moment, l'utilité du "Stencil_buffer" ne doit pas vous sauter aux yeux. Et pourtant, il est extrémement pratique. Nous verrons dans le chapître suivant 2 grandes utilisation de ce "buffer" : les ombres simples et le reflet dans un miroir. Mais pour l'instant, nous allons voir en gros, à quoi il sert.

Le stencil buffer permet de dessiner une scène quelconque, non pas dans la fenètre toute entière, mais dans une forme quelconque. Imaginez que vous voulliez dessiner un cube à l'écran, mais au travers d'un hublot, rond et non pas la fenètre toute entière, carrée. Vous allez activer le "Stencil-Test", dessiner votre hublot dans le Stencil buffer (et non pas à l'écran, nous verrons comment au prochain chapître), puis dessiner votre cube, comme à l'accoutumé, à l'écran cette fois-ci. Seule la portion de votre cube se trouvant sur le hublot sera déssinée.

La scène n'est affichée que dans la pseudo-ellipse

Autre exemple : le "stencil buffer" sert aussi lorsque l'on veut afficher un tableau de score, un décor statique comme dans les jeux tels que Tétris (une partie de l'écran est fixe, ou presque)

 

Page précédente    Page suivante