Pregunta

Quiero usar una máscara alfa en OpenGL de modo que el blanco (1) = visible y negro (0) = oculto.

Así que lo que hago es escribir algo en el componente alfa del uso de este dispositivo usando glColorMask(False, False, False, True) (estoy usando pitón, que se ve) y luego dibujar un poco de geometría por encima de ella utilizando la mezcla.

Pero no está funcionando: Probé llenando el alfa tampón completamente con 0 y luego dibujo algo de geometría que por lo tanto no debe ser visible. Pero siempre aparece, el búfer alfa es completamente ignorada.

# Clear alpha buffer to 0, and clear color buffer.
# After this, the alpha buffer should probaby be filled with 0.
glClearColor(0, 0, 0, 0)
glClear(GL_COLOR_BUFFER_BIT)

# Disable blending.
glDisable(GL_BLEND)

# Disable color writing.
glColorMask(False, False, False, True)

# Set color to a white with alpha 0.
glColor4f(1, 1, 1, 0)

# Now draw a fullscreen quad.
# After this, the alpha buffer should really be filled with 0.
# Shouldn't it?
glBegin(GL_QUADS)
glVertex2f(0, 0)
glVertex2f(320, 0)
glVertex2f(320, 480)
glVertex2f(0, 480)
glEnd()

# Enable color writing.
glColorMask(True, True, True, True)

# Enable blending so that incoming fragments are multiplied
# by alpha values already in the buffer.
glEnable(GL_BLEND)
glBlendFunc(GL_DST_ALPHA, GL_ONE)

# Set color to a white with alpha 1.
glColor4f(1, 1, 1, 1)    

# Now draw a triangle.
# It should not be visible because alpha in framebuffer is 0
# and 0 * 1 = 0.
glBegin(GL_TRIANGLES)
glVertex2f(20, 50)
glVertex2f(300, 50)
glVertex2f(160, 210)
glEnd()

(Sí, las matrices de proyección están justo por lo que mis rangos de pantalla desde 0/0 a 320/240.)

El triángulo no debe ser visible, lo que hice mal?

¿Fue útil?

Solución

Trate pidiendo una alfa búfer cuando se crea su contexto GL, si no está ya.

Otros consejos

Uso glAlphaFunc (GL_GREATER, 0,5);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top