0

我正在编写一段简单的代码,在绿色背景上显示一个透明背景的精灵。现在我的精灵有问题,它有一个彩色背景(我可以改变颜色,所以它不是错误),而我的主背景上应该没有任何背景!

在我看来,问题在于,当纹理映射到彩色四边形时,所有 alpha 值都设置为与四边形颜色值相同,因为:

  1. PNG图像很好并且具有透明背景
  2. 我用 alpha 通道移植图像,因为我可以确定纹理背后的颜色,所以它不是导入问题
  3. 我的混合应该很好,因为整个四边形混合很好

这是我的纹理和混合代码:

//Texture Configuration
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(10, texNo);
    glBindTexture(GL_TEXTURE_2D, texNo[0]);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );      
    glEnable(GL_TEXTURE_2D);

    sfTexture[0].loadFromFile("image.png");
    sf::Texture::bind(&sfTexture[0]);


    //Blending
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

和我的绘图代码:

glBegin(GL_QUADS);

        glColor3f(0,1,0);
        glVertex2d(0,0);
        glVertex2d(220,0);
        glVertex2d(220,300);
        glVertex2d(0,300);


        glColor4f(1, 0, 0, 1);
        glBindTexture(GL_TEXTURE_2D, texNo[0]);
        glTexCoord2f(0,1); glVertex2d(xpos+0,ypos+0);
        glTexCoord2f(1,1); glVertex2d(xpos+30,ypos+0);
        glTexCoord2f(1,0); glVertex2d(xpos+30,ypos+30);
        glTexCoord2f(0,0); glVertex2d(xpos+0,ypos+30);
        //glDisable(GL_BLEND);

    glEnd();

更新:我尝试了 GL_MODULATE 而不是 GL_DECAL

带有 GL_MODULATE 的图像没有混合: GL_MODULATE 没有混合

带有混合的 GL_MODULATE 的图像: 带有混合的 GL_MODULATE

4

1 回答 1

0

正如 PeterT 在评论中所说:将颜色设置为 (1,1,1,1) 并使用默认的 GL_MODULATE 会更容易。问题在于,如果您使用 GL_DECAL,则输出片段使用 alpha 与多边形的 glColor 混合并写入 glColor4f 中给出的 alpha。此外,您只能在 glBegin() 和 glEnd 之间使用某些命令,因此只能使用 glTexCoord glColor glVertex 和其他类似命令。因此,使用一个 glBegin()/glEnd() 组合作为背景,然后更改设置,然后使用另一个 glBegin()/glEnd() 来绘制精灵。

于 2013-07-30T19:31:15.967 回答