1

我正在和朋友一起开发游戏,我们使用 openGl、glut、devIL 和 c++ 来渲染所有内容。简单地说,我们使用的大多数 .png 都可以正确渲染,但是有随机像素显示为白色。

这些像素分为 2 类。第一个是图像边缘的像素。这些是由 Photoshop 的笔画功能(我正在尝试修复)进行的抗锯齿造成的。第二个是更神秘的一个。当敌人静止不动时,纹理看起来不错,但只要它跳跃,就会在其顶部出现一条随机的白线。

在此处输入图像描述

顶部的线具有不同的坚固度(这个镜头不是最坚固的)

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

我们当前的设置代码:

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

2 回答 2

1

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

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

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

于 2012-07-29T20:26:27.370 回答
0

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

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

于 2012-07-30T11:36:56.547 回答