Question

Je dessine actuellement un arrière-plan, puis un triangle transparent dans le tampon du pochoir, puis un carré bleu où le triangle n'est pas dessiné.J'espérais que l'effet serait un carré bleu avec un trou trianglulaire exposant l'arrière-plan.mais tout ce que je reçois est un triangle noir dessiné sur tout le reste.Je pense que j'obtiens l'effet désiré sur le carré mais le pochoir est également appliqué à l'arrière-plan.

Ma question est de savoir comment puis-je ajuster le code suivant pour permettre à l'arrière-plan d'être affiché à travers un trou triangulaire dans le carré?

static void Draw(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

//big blue square
glColor3ub(0,255,255);
glBegin(GL_POLYGON);
glVertex3i(5, 5, 0);
glVertex3i(-5, 5, 0);
glVertex3i(-5, -5, 0);
glVertex3i(5, -5, 0);
glEnd();

glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

/* transparent triangle */
glColor4ub(0.0f, 0.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glVertex3i(-4, -4, 0);
glVertex3i(4, -4, 0);
glVertex3i(0, 4, 0);
glEnd();

glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_INCR, GL_KEEP, GL_DECR);

glStencilFunc(GL_EQUAL, 2, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

/* blue square */
glColor3ub(0, 0, 200);
glBegin(GL_POLYGON);
glVertex3i(3, 3, 0);
glVertex3i(-3, 3, 0);
glVertex3i(-3, -3, 0);
glVertex3i(3, -3, 0);
glEnd();

if (doubleBuffer) {
    glutSwapBuffers();
} else {
    glFlush();
}
}
Était-ce utile?

La solution

Problème 1: lorsque vous dessinez l'arrière-plan, désactivez le test de pochoir avant ou basculez la fonction de pochoir sur GL_ALWAYS pour que les fragments passent (je recommande de l'éteindre).Ensuite, vous définissez deux modi de pochoir différents par la suite, mais aucun ne fera, ce que vous avez l'intention.Voici donc le changement:

glDisable(GL_STENCIL_TEST);
glStencilMask(0x0);

draw_background();

glEnable(GL_STENCIL_TEST);
glStencilMask(0x1);
glStencilFunc(GL_ALWAYS, 0x1, 0x1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);

draw_trangle();

glStencilFunc(GL_NOTEQUAL, 0x1, 0x1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);

draw_blue_square();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top