【问题标题】:OpenGL Masking via Alpha Blending通过 Alpha 混合进行 OpenGL 遮罩
【发布时间】:2014-04-27 11:19:43
【问题描述】:

我正在尝试渲染 3 个纹理, -背景 -黑/白前景蒙版 -前景

我用过这个OpenGL - mask with multiple textures 因为它准确地描述了我的问题。但我无法让它工作。我只得到最后一个渲染纹理,在这种情况下是前景。我调用了 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();

【问题讨论】:

  • 你能仔细检查一下你真的得到了阿尔法平面吗?使用GLint val; glGetIntegerv(GL_ALPHA_BITS, &val);。当你说你打电话给glutInitDisplayMode(GLUT_ALPHA)时,我想你在最初的glutInitDisplayMode电话中添加了GLUT_ALPHA?我认为一旦创建窗口就不能更改模式。
  • @Skofgar:您请求目标 alpha 位平面是正确的,但您必须了解这并不常见(一些同样不常见的实现甚至不支持它)。它几乎从不用于典型渲染,因此即使您的像素格式通常是 32 位,您也经常会得到类似 RGBx 的东西(本来/可能用于 Alpha 的东西,x,变成对齐填充),除非您明确要求目标 alpha 大于 0 位的像素格式。
  • GLUT_ALPHA 应该这样做,但如果您使用错误的其他参数组合,您可能会使用 GDI 像素格式(Windows 上的脑死亡软件渲染器,不支持目标 alpha) .确定发生了什么的唯一方法是请求有关您的像素格式的一些信息 GLUT 提供给您之后,所有平台都使用模式匹配系统像素格式选择,并将返回他们认为最接近您要求的内容。
  • @RetoKoradi 根据 glGetIntegerv,我有 8 个 Alpha 位平面。这是好事还是坏事?
  • @AndonM.Coleman 如何请求所述模式匹配以查看我的像素格式?

标签: c++ opengl alphablending blending


【解决方案1】:

我想你的错误是:

当您使用 glBlendFunc(GL_ONE, GL_ZERO); 绘制背景时 结果,您通常在帧缓冲区中绘制它,但不需要提供混合操作,在此过程中更有效的是根本不使用混合。所以,更有效的是 glDisable(GL_BLEND),但是你的 pass 在这里工作就像你期望的那样。

第二遍你用 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 有任何疑问,我可以为您提供帮助。

【讨论】:

  • 我如何使用片段着色器将蒙版的黑色空间替换为第二个纹理?
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2011-05-25
  • 2011-12-14
  • 2011-04-08
  • 2023-03-22
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多