【问题标题】:Why my sprite has a colored background? / Why transparent sprite has a background?为什么我的精灵有彩色背景? / 为什么透明精灵有背景?
【发布时间】:2013-07-28 11:38:32
【问题描述】:

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

在我看来,问题在于,当纹理映射到彩色四边形时,所有 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 without blending

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

【问题讨论】:

  • 你不能把 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);线?你为什么需要它?我不熟悉它,但显然它将你的纹理颜色(兔子)与四边形颜色(红色)混合在一起,这正是你不想要的。
  • 如果没有贴花,BG 仍然不透明,GL_DECAL 确定使用纹理贴图中的颜色绘制带纹理的多边形(而不是考虑在没有纹理的情况下多边形会绘制什么颜色)。
  • @Darky 我认为将颜色设置为 (1,1,1,1) 并使用默认的 GL_MODULATE 会更容易。问题是,如果你使用GL_DECAL,那么输出片段使用alpha 与多边形的glColor 混合,并写入glColor4f 中给出的alpha。但是,如果这不能解决问题,那就没关系了。
  • this link 似乎相关并证实了@FullFrontalNudity 所说的。
  • 我之前尝试过 GL_MODULATE,GL_MODULATE 本身工作正常,但启用混合后,我的背景无缘无故消失了。

标签: opengl png textures sprite sfml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    相关资源
    最近更新 更多