使用OpenGL无法正常工作

时间:2012-05-01 16:15:08

标签: c++ opengl masking

我试图用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

这里分别是纹理和面具(面具中的白色真的是透明的,我只是将它弄平,所以你可以看到):

texture mask

这是我期望得到的:

expected result

这就是我实际得到的:

actual result

知道可能是什么问题吗?

1 个答案:

答案 0 :(得分:4)

首先,我不认为这会做你期望的事情:

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

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

我猜你可能打算只更换alpha通道,并保持颜色不变?如果在使用glColorMask(GL_FALSE,GL_FALSE,GL_FALSE, GL_TRUE);

绘制蒙版之前屏蔽颜色通道,则可以执行此操作

我认为如果你这样做可能会有用。

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