我正在尝试使用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的多重纹理操作来实现这种效果,但是如果您不想使用多重纹理,则应该可以使用。