Pregunta

Actualmente estoy dibujando un fondo, luego un triángulo transparente en el búfer de plantilla, luego un cuadrado azul donde no se dibuja el triángulo. Esperaba que el efecto fuera un cuadrado azul con un agujero trianglular que exponga el fondo. Pero todo lo que estoy obteniendo es un triángulo negro atraído por todo lo demás. Creo que estoy obteniendo el efecto deseado en el cuadrado, pero la plantilla también se aplica al fondo.

Mi pregunta es ¿cómo puedo ajustar el siguiente código para permitir que el fondo se muestre a través de un agujero triangular en el cuadrado?

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();
}
}
¿Fue útil?

Solución

Problema uno: al dibujar el fondo, desactive la prueba de plantilla antes, o cambie la función de plantilla a GL_ALWAY para que pasen los fragmentos (lo recomengo). Luego está configurando dos Modi de plantilla diferentes después, pero tampoco lo hará, lo que pretende. Así que aquí está el cambio:

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top