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);

这是我正在尝试绘制的背景图像:

背景图片

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

质地面具

这是我期望得到的:

预期结果

这就是我实际得到的:

实际结果

知道可能是什么问题吗?

4

1 回答 1

4

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

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

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

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

我想如果你这样做,它可能会奏效。

我认为这种效果通常可以通过 glTexEnv 的多重纹理操作来完成,但如果你不想使用多重纹理,这应该可以。

于 2012-05-01T16:58:54.793 回答