2017-08-28 6 views
1

Je ne comprends pas pourquoi ces deux codes ne donnent pas le même résultat. J'ai permis le test de profondeur et d'essais au pochoir et ma boucle principale ressemble à ceci:Comportement du tampon stencil dans un cas simple (GL_ALWAYS, GL_LEQUAL)

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

De toute évidence, mon cube rend dans ce cas.

Cependant, si j'utilise ce code, rien rend du tout:

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_LEQUAL, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

Avec un seul objet dans ma scène, à la fois le code doit se comporter de la même manière. Pourtant, ce n'est pas le cas.

Je pensais que cela avait quelque chose à voir avec la valeur par défaut dans le tampon stencil. Cependant, depuis que je suis effacer le tampon de pochoir avant de le faire, la valeur par défaut doit être 0.

Par ailleurs, avec ce code, le cube rend ainsi:

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_LEQUAL, 0, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

Je ne comprendre ce qui se passe.

Répondre

2

glStencilFunc(GL_LEQUAL, 1, 0xFF) signifie if 1 <= 0, car le tampon du stencil contient 0, puisque vous l'avez effacé. La valeur de référence est 1, car vous transmettez cette valeur à la fonction. Cela échoue toujours.

Voir la page de référence des Khronos (glStencilFunc):

GL_LEQUAL Laissez-passer if (ref & mask) <= (stencil & mask).