为什么我的精灵有彩色背景? /为什么透明精灵有背景?

时间:2013-07-28 11:38:33

标签: opengl png textures sprite sfml

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

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

  1. PNG图片很好并且背景透明
  2. 我用alpha通道移植图像因为我可以确定纹理背后的颜色,所以它不是导入问题
  3. 我的混合应该是整个四重混合okey
  4. 这里我的纹理和混合代码:

    //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 without blending

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

1 个答案:

答案 0 :(得分:0)

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