Domanda

Voglio usare una maschera alfa in OpenGL in modo che il bianco (1) = visibile e nero (0) = nascosto.

Quindi quello che faccio è che scrivo qualcosa nella componente alfa del framebuffer utilizzando glColorMask(False, False, False, True) (sto usando python, si vede) e poi trarre alcune geometrie sopra di esso utilizzando la miscelazione.

Ma non funziona: Ho provato riempire il buffer alfa completamente con 0 e facendo poi alcune geometrie che non dovrebbe quindi essere visibile. Ma dimostra sempre, il buffer alfa viene completamente ignorato.

# 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ì, le matrici di proiezione sono proprio così il mio schermo va da 0/0 a 320/240.)

Il triangolo non deve essere visibile, che cosa ho fatto di sbagliato?

È stato utile?

Soluzione

Prova a chiedere a un alpha buffer di quando si crea GL vostro contesto, se non siete già.

Altri suggerimenti

Usa glAlphaFunc (GL_GREATER, 0,5);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top