Voici la liste complète des tests de validation d’un point :
à Scissor Test à Alpha Test à Stencil Test à Depth Test à […] à framebuffer
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)
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)
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)