开发者

Alpha masks with OpenGL

I want to use an alpha mask in OpenGL so that white(1)=visible and black(0)=hidden.

So what I do is I write something in the alpha component of the framebuffer using 开发者_如何学运维glColorMask(False, False, False, True) (I'm using python, you see) and then draw some geometry above it using blending.

But it isn't working: I tried filling the alpha buffer completly with 0 and then drawing some geometry that should thus not be visible. But it always shows up, the alpha buffer is completly ignored.

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

(Yes, the projection matrices are right so my screen ranges from 0/0 to 320/240.)

The triangle shouldn't be visible, what did I do wrong?


Try asking for an alpha buffer when you create your GL context, if you aren't already.


Use glAlphaFunc( GL_GREATER, 0.5 );

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜