无法正确使用OpenGL进行蒙版处理

4
我正在尝试使用OpenGL对图像进行遮罩,以使其部分区域变为透明。以下是我的代码,但它并没有起作用:
draw_img(background);

...

glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);

draw_img(foreground);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这是我的背景图像,我试图在其上绘制: background image 这是纹理和掩码,分别为(遮罩中的白色实际上是透明的,我只是将它压平以便您可以看到): texturemask 这是我期望得到的结果: expected result 而这是我实际得到的结果: actual result 你有什么想法,可能出了什么问题吗?
1个回答

4
首先,我认为这个不会达到您的预期效果:
glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);

这是将遮罩与背景混合,但您说“始终使用遮罩的100%和目标的0%”。在此步骤之后,帧缓冲区中将不再有红色像素,因为您已将帧缓冲区的所有通道替换为遮罩纹理。
我猜您可能想仅替换alpha通道,并保持颜色不变?如果在绘制遮罩之前屏蔽颜色通道,则可以这样做:glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE); 我认为如果您这样做,它可能会起作用。
我认为这种效果通常可以通过使用glTexEnv的多纹理操作来完成,但如果您不想使用多纹理,则应该可以使用此方法。

非常感谢!现在我明白为什么它会这样做了 - 我原以为第二个混合有误,实际上它是有效的,只是首先用黑色替换了背景。 - Skyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接