2010-01-25 8 views
5

Je souhaite utiliser un masque alpha dans OpenGL pour que blanc (1) = visible et noir (0) = masqué.Masques alpha avec OpenGL

Donc ce que je fais est que j'écris quelque chose dans le composant alpha du framebuffer en utilisant glColorMask(False, False, False, True) (j'utilise python, vous voyez) et puis dessinez une certaine géométrie dessus en utilisant le mélange.

Mais cela ne fonctionne pas: J'ai essayé de remplir complètement le buffer alpha avec 0 puis de dessiner une géométrie qui ne devrait donc pas être visible. Mais il apparaît toujours, le tampon alpha est complètement ignoré.

# 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() 

(Oui, les matrices de projection sont droite pour mon écran varie de 0/0 à 320/240.)

Le triangle ne doit pas être visible, qu'est-ce que je fait de mal?

+1

Le résultat final est un triangle blanc sur fond noir? Je ne vois rien de défectueux dans tes pas. – Bahbar

Répondre

3

Essayez de demander un alpha buffer lorsque vous créez votre contexte GL, si ce n'est déjà fait.

+0

C'était en fait le problème! Merci beaucoup! – abenthy

0

Utiliser glAlphaFunc (GL_GREATER, 0,5);

+0

err ... Il utilise le mélange, pas de test alpha.Alpha tests fonctionne avec l'alpha source, pas l'alpha de destination. – Bahbar

Questions connexes