2010-01-25 5 views
5

Ich möchte eine Alpha-Maske in OpenGL verwenden, so dass weiß (1) = sichtbar und schwarz (0) = ausgeblendet.Alpha-Masken mit OpenGL

Also was ich tue ist ich schreibe etwas in der Alpha-Komponente des Framebuffers mit glColorMask(False, False, False, True) (ich benutze Python, Sie sehen) und zeichnen Sie dann etwas Geometrie über das Mischen.

Aber es funktioniert nicht: Ich habe versucht, füllen Sie den Alpha-Puffer komplett mit 0 und dann zeichnen einige Geometrie, die daher nicht sichtbar sein sollte. Aber es taucht immer auf, der Alpha-Puffer wird komplett ignoriert.

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

(Ja, die Projektionsmatrizen rechts so mein Bildschirm reicht von 0/0 bis 320/240.)

Das Dreieck nicht sichtbar sein soll, was habe ich falsch gemacht?

+1

Das Endergebnis ist ein weißes Dreieck auf schwarzem Hintergrund? Ich finde in deinen Schritten keine Fehler. – Bahbar

Antwort

3

Fragen Sie nach einem alpha buffer, wenn Sie Ihren GL-Kontext erstellen, wenn Sie nicht bereits sind.

+0

Das war in der Tat das Problem! Danke vielmals! – abenthy

0

Verwenden Sie glAlphaFunc (GL_GREATER, 0.5);

+0

err ... Er verwendet Blending, nicht Alpha-Tests. Alpha-Tests arbeiten gegen die Quell-Alpha, nicht die Ziel-Alpha. – Bahbar