【发布时间】:2013-07-28 11:38:32
【问题描述】:
我正在编写一段简单的代码,在绿色背景上显示具有透明背景的精灵。现在我的精灵有问题,它有一个彩色背景(我可以更改颜色,所以它不是错误),而我的主背景上应该没有任何背景!
在我看来,问题在于,当纹理映射到彩色四边形时,所有 alpha 值都设置为与四边形颜色值相同,因为:
- PNG 图像很好,并且具有透明背景
- 我使用 Alpha 通道移植图像,因为我可以确定纹理背后的颜色,所以它不是导入问题
- 我的混合应该还不错,因为整个四边形混合还不错
这里是我的纹理和混合代码:
//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