C++ 通过Alpha混合的OpenGL掩蔽

C++ 通过Alpha混合的OpenGL掩蔽,c++,opengl,alphablending,blending,C++,Opengl,Alphablending,Blending,我正在尝试渲染3种纹理, -背景 -黑白前景遮罩 -前景 我用过这个 因为它准确地描述了我的问题。但是我不能让它工作。我只得到最后渲染的纹理,在本例中是前景。我调用了glutInitDisplayMode(GLUT_ALPHA);按照答案中的建议进行Alpha渲染。 有人能从我这边发现错误吗 我的代码如下: double stretch = ((double)m_videoResY * (double)m_depthResX) / ((double)m_videoResX * (double)m

我正在尝试渲染3种纹理, -背景 -黑白前景遮罩 -前景

我用过这个 因为它准确地描述了我的问题。但是我不能让它工作。我只得到最后渲染的纹理,在本例中是前景。我调用了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();

我想你的错误是:

使用glBlendFunc(GL_ONE,GL_ZERO)绘制背景时; 所以你们可以正常地在帧缓冲区中绘制,但并没有提供必要的混合操作,更有效的方法是根本不用混合。因此,更有效的方法是glDisable(GLU混合),但您的通行证在这里的效果与您预期的一样

第二次使用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_减_DST_ALPHA),这意味着要绘制那些区域,其中黑白遮罩是白色的,并与衰减混合以获得更暗的遮罩区域


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

您能再次检查一下您是否真的有alpha平面吗?使用
GLint val;glGetIntegerv(GL_ALPHA_位和val)。当你说你调用了
glutInitDisplayMode(GLUT\u ALPHA)
时,我想你在你最初的
glutInitDisplayMode
调用中添加了
glutInitDisplayMode
?我认为一旦创建了窗口,您就不能更改模式。@Skofgar:您请求目标alpha位平面是正确的,但您必须理解这并不常见(一些同样不常见的实现甚至不支持它)。它几乎从未在典型的渲染中使用过,因此即使您的像素格式通常为32位,您也经常会使用类似RGBx的格式(Alpha、
x
中本应/可能使用的内容将成为对齐的填充)除非您明确要求目标alpha大于0位的像素格式。
GLUT_alpha
应该这样做,但如果您使用其他参数的错误组合,您可能会得到GDI像素格式(Windows上的braindead软件渲染器,不支持目标alpha)。要确定发生了什么,唯一的方法是在GLUT提供给您一些关于像素格式的信息后,请求这些信息。所有平台都使用模式匹配系统选择像素格式,并将返回他们认为最接近您要求的内容。@RetoKoradi根据glGetIntegerv,我有8个Alpha位平面。这是好还是坏?@AndonM.Coleman我如何请求所述图案匹配以查看我的像素格式?我如何使用片段着色器将遮罩的黑色空间替换为第二个纹理?