通过Alpha Blending进行OpenGL屏蔽

时间:2014-04-27 11:19:43

标签: c++ opengl alphablending blending

我正在尝试渲染3个纹理, -背景 - 黑色/白色前景面膜 -foreground

我用过这个OpenGL - mask with multiple textures 因为它精确地描述了我的问题。但我无法让它发挥作用。我只获得Last rendererd Texture,在本例中为Foreground。我已经调用了glutInitDisplayMode(GLUT_ALPHA);在答案中将Alpha呈现视为过度消化。 谁能发现我身边的错误?

我的代码如下:

double stretch = ((double)m_videoResY * (double)m_depthResX) / ((double)m_videoResX * (double)m_depthResY);

glEnable(GL_BLEND);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(+0.5, -0.5, +0.5, -0.5, 0.001f, 1.0);

glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -0.5f);

glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glDisable(GL_DEPTH_TEST);

glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBlendFunc(GL_ONE, GL_ZERO);

glBindTexture(GL_TEXTURE_2D, m_backgroundTexture);//Draw BGTexture

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glBegin(GL_QUADS);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f(-0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();


glBlendFuncSeparate(GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ZERO);

//mask with userID
glBindTexture(GL_TEXTURE_2D, m_userIDTexture);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);


glBegin(GL_QUADS);
    glTexCoord2f(1.0f, 0.0f);
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glTexCoord2f(1.0f, 1.0f * stretch);
    glVertex3f(-0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 1.0f * stretch);
    glVertex3f(0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();



//blend with Video of User
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);


glBindTexture(GL_TEXTURE_2D, m_videoTexture);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);
    glVertex3f(-0.5f, -0.5f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);
    glVertex3f(-0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);
    glVertex3f(0.5f, 0.5f, 0.0f);
    glTexCoord2f(0.0f, 0.0f);
    glVertex3f(0.5f, -0.5f, 0.0f);
glEnd();

1 个答案:

答案 0 :(得分:0)

我认为你的错误是:

使用glBlendFunc(GL_ONE,GL_ZERO)绘制背景时; 结果你正常地在framebuffer中绘制它,但是提供不需要的混合操作,在这个传递上更有效的是根本不使用混合。所以,更有效的是glDisable(GL_BLEND),但你的传球工作就像你期望的那样。

第二次使用glBlendFuncSeparate绘图(GL_ZERO,GL_ONE,GL_SRC_COLOR,GL_ZERO);我不知道为什么你在这里使用如此柔和的功能并分离混合颜色和alpha值。 所以,看第三遍,我想你想用你的前景黑/白色面具修改你的背景alpha值。如果是,则必须使用glBlendFuncSeparate(GL_ZERO,GL_ONE,GL_ZERO,GL_SRC_COLOR); - 是的,小错误。

在绘制前景时的第三遍中,你有glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA),这意味着你想要绘制那些区域,你的黑/白面具是白色的,并与衰减混合以获得更暗的面具区域。

如果您对glBlendFunc有任何疑问,我可以帮助您。