【发布时间】: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