我正在尝试在 OpenGL 中的另一个纹理上放置纹理(带alpha)。我做的没有任何问题,但它不是我想要的:我的最近的图像的颜色受到背景图像(最远的纹理)的强烈影响,导致尽管出现橙色红色
任何人都知道一种混合(或摆脱alpha)的方法来解决这个问题吗?
混合初始化:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
绘制场景:
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
//furthest image (background)
glBindTexture(GL_TEXTURE_2D, texture[1]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(500, 0);
glTexCoord2f(1, 1); glVertex2f(500, 500);
glTexCoord2f(0, 1); glVertex2f(0, 500);
glEnd();
//nearest image (appears orange, should be red)
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(100, 100);
glTexCoord2f(1, 0); glVertex2f(300, 100);
glTexCoord2f(1, 1); glVertex2f(300, 300);
glTexCoord2f(0, 1); glVertex2f(100, 300);
glEnd();
glutSwapBuffers();
EDIT。 这是一张描绘它看起来如何的图像:
以下是它应该如何显示的图像:
答案 0 :(得分:2)
我相信你想要的是'alpha测试',而不是混合。参见
glEnable(GL_ALPHA_TEST)
glAlphaFunc()
如果要启用混合,则应使用
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
这将仅在源alpha为1的位置使用源颜色。目前,您的函数将源颜色添加到背景颜色。
如果你不想混合颜色,那么使用alpha测试是更好的方法,因为它使用较少的资源然后混合。
答案 1 :(得分:2)
此混合功能
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
是你的问题的原因。目的地的GL_ONE
表示帧缓冲区中已存在的任何内容都将被添加到alpha值的传入颜色中。
在您的情况下,您的红色纹理会添加绿色背景。由于 red + greenish = orange ,这就是你得到的。
你想要的是使用你的alpha通道掩盖目标帧缓冲区中的先前内容,这是使用
完成的glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
另外请记住,OpenGL状态是按需设置和重置的,因此在绘制其他纹理时,您可能需要其他设置来进行混合和混合功能。
答案 2 :(得分:0)
在大家的帮助下,我设法解决了这个问题:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
感谢所有贡献者:)