2012-07-22 83 views
1

我试图在OpenGL上放置一个纹理(带有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(); 

编辑。 这里有一个形象描绘它的外观: issue

下面是怎样看的图像: target

+0

我看不到你在混合什么颜色,你想要达到什么以及你实际达到了什么。如果最近的图像是透明的,为什么它不会受其背景影响?橙色有什么问题? – Kos 2012-07-22 15:38:54

+0

@Kos嗯,我有一个绿色的背景,我有一个红色的纹理,其中使用alpha的地方。在那些地方我想提到背景(草)。这就像2D游戏,玩家在表面上行走。相反,我的背景颜色影响“玩家”,因此我的红色纹理变成橙色(红色+绿色)。 – Robin92 2012-07-22 15:49:13

回答

2

我相信你想要的是“alpha测试”,而不是融合。见

glEnable(GL_ALPHA_TEST) 
glAlphaFunc() 

如果你想离开勾兑启用,您应该使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

这将只使用地源颜色在源alpha为1.目前你的函数添加源颜色背景颜色。

如果你不想混合任何颜色,那么使用alpha测试是更好的方法,因为它使用较少的资源,然后混合。

+0

这也行不通。它围绕我的纹理创建黑色表面(围绕该R字母)。 – Robin92 2012-07-22 16:04:27

+0

听起来像你的图像的alpha通道缺失或损坏。 @ Robin92 – Tim 2012-07-22 16:16:10

+0

你说得对!将我的纹理作为PNG(BMP)解决了问题。谢谢:) @Tim – Robin92 2012-07-22 16:23:40

2

这种混合FUNC

glBlendFunc(GL_SRC_ALPHA, GL_ONE); 

是你的问题的原因。目的地的GL_ONE意味着,帧缓冲区中已存在的任何内容都将被添加到alpha值的输入颜色对角线上。

在你的情况下,你的红色纹理被添加了绿色的背景。而且由于红色+绿色=橙色这就是你得到的。

你想要的是掩盖了目标帧缓冲区以前的内容与你的alpha通道,这是使用

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

还记得OpenGL的状态,就是要建立和按需重置,所以绘画时完成其他纹理,然后你可能需要其他设置混合和混合功能。

0

随着大家的帮助,我设法解决的问题:

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

谢谢到所有捐献者:)

相关问题