OpenGl渲染透明.png随机白色像素

时间:2012-07-29 17:29:03

标签: opengl png textures transparent

我正和一位朋友一起玩游戏,我们正在使用openGl,过剩,恶魔和c ++来渲染一切。简单地说,我们使用的大多数.png都是正确渲染的,但是随机像素显示为白色。

这些像素分为两类。第一个是图像边缘的像素。这些是由于Photoshop的笔画功能(我试图修复)中的抗锯齿造成的。第二个是更神秘的一个。当敌人静止不动时,纹理看起来很好,但一旦跳跃,它就会出现一条随机的白线。

enter image description here

顶部的线条具有不同的坚固性(此镜头不是最坚固的)

这似乎是一个混合问题,但我并不熟悉openGl处理透明度的方式(我们的透明度代码是从堆栈溢出的其他问题中学到的,但是我在这个问题上找不到任何东西) 。我希望有什么能解决这两个问题,但我更担心的是第二个问题。

我们当前的设置代码:

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);

2 个答案:

答案 0 :(得分:1)

位图的透明区域也有颜色。如果它是100%透明的,你通常看不到它。 Photoshop通常在这些区域填充白色。

如果您使用的是不是GL_NEAREST的缩小或放大标记,那么您将进行插值。如果在两个像素之间进行插值,其中一个是蓝色和不透明,另一个是白色和透明,那么你将获得50%透明和浅蓝色的东西。使用插值时,您可能也会遇到与mimaps相同的问题。如果您使用mipmap,一种解决方案是自己生成它们。这样,您可以在进行插值时忽略透明区域。请在此处查看一些好的解释:http://answers.unity3d.com/questions/10302/messy-alpha-problem-white-around-edges.html

为什么使用png文件?您节省了一些磁盘空间,但需要包含像devil这样的复杂库。您不会在交付应用程序时节省任何空间,因为创建交付包的大多数工具都具有非常高效的压缩。并且您不会在GPU上保存任何内存,这可能是最关键的。

答案 1 :(得分:0)

这看起来像是源PNG中的工件。你确定那里没有这种光不透明的像素吗?

出现在顶部的白线可能是纹理图集中邻居纹理的UV插值误差(如果将NPOT纹理填充到具有白色不透明像素的POT,则为填充)。这就是为什么通常你需要填充每个方向至少有一个边缘像素的纹理。但是,正如Lars所说,这对mipmap没有帮助 - 您可能需要使用自定义mipmap生成或完全删除它。

相关问题