保持原有的颜色

时间:2012-07-22 11:20:28

标签: opengl textures glut alpha blending

我正在尝试在 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。 这是一张描绘它看起来如何的图像: issue

以下是它应该如何显示的图像: target

3 个答案:

答案 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)

在大家的帮助下,我设法解决了这个问题:

  • 将我的纹理重新保存为PNG(尽管有BMP)
  • 将混合功能更改为glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

感谢所有贡献者:)