gpt4 book ai didi

c++ - 通过 Alpha 混合的 OpenGL 掩蔽

转载 作者:太空宇宙 更新时间:2023-11-04 13:51:10 25 4
gpt4 key购买 nike

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

我用过这个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();

最佳答案

我想你的错误是:

当您使用 glBlendFunc(GL_ONE, GL_ZERO) 绘制背景时;作为结果,您通常在帧缓冲区中绘制它,但不提供所需的混合操作,在此过程中更有效的是根本不使用混合。因此,更有效的是 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 有任何疑问,我可以帮助您。

关于c++ - 通过 Alpha 混合的 OpenGL 掩蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23322724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com