使用 OpenGL 的 Alpha 蒙版
我想在 OpenGL 中使用 alpha 蒙版,以便白色(1)=可见,黑色(0)=隐藏。
所以我要做的就是使用 glColorMask(False, False, False, True) 在帧缓冲区的 alpha 分量中写入一些内容(我正在使用 python,你看),然后在其上方绘制一些几何图形使用混合。
但它不起作用: 我尝试用 0 完全填充 alpha 缓冲区,然后绘制一些不应该可见的几何图形。但它总是出现,阿尔法缓冲区被完全忽略。
# 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()
(是的,投影矩阵是正确的,所以我的屏幕范围从 0/0 到 320/240。)
三角形不应该是可见的,我做错了什么?
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
创建 GL 上下文时尝试请求 alpha 缓冲区 ,如果你还没有的话。
Try asking for an alpha buffer when you create your GL context, if you aren't already.
使用 glAlphaFunc( GL_GREATER, 0.5 );
Use glAlphaFunc( GL_GREATER, 0.5 );