我正在尝试使用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);

这是我要在其上绘制的背景图像:

这里分别是纹理和蒙版(蒙版中的白色非常透明,我将其展平,以便您可以看到):

这是我期望得到的:

这是我实际上得到的:

知道可能是什么问题吗?

最佳答案

对于初学者来说,我认为这不会达到您的期望:

glBlendFunc(GL_ONE, GL_ZERO);
draw_img(mask);

这是将蒙版与背景混合在一起,但是您要说的是:“始终使用100%的蒙版,始终使用0%的目标”。此步骤之后,帧缓冲区中将不再有红色像素,因为您已用蒙版纹理将全部替换为帧缓冲区的通道。

我猜您可能只打算替换alpha通道,并保持颜色不变?如果在绘制蒙版之前使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE);蒙版了颜色通道,则可以执行此操作

我认为如果您这样做可能会奏效。

我认为通常可以通过glTexEnv的多重纹理操作来实现这种效果,但是如果您不想使用多重纹理,则应该可以使用。

09-25 10:52