【问题标题】:OpenGl Rendering Transparent .png with Random White PixelsOpenGL用随机白色像素渲染透明.png
【发布时间】:2012-07-27 12:32:34
【问题描述】:

我正在和朋友一起开发一款游戏,我们正在使用 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);

【问题讨论】:

  • 你对纹理使用什么包装模式?

标签: opengl png textures transparent


【解决方案1】:

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

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

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

【讨论】:

  • 我会调查的;我只使用 .pngs,因为它们是我在使用透明度方面做得最多的文件类型。您建议使用哪种文件类型?
  • 使用 Windows 'bmp' 格式很简单,加载它的源代码适合一页。但是,如果您已经将其启动并开始工作,那么我想您不妨继续使用 png。如果您正在制作一个完全商业化的应用程序,您可能希望最终制作自己的专有格式。确保您研究了恶魔和其他子库的许可证。
  • 感谢您的提醒。通常我很擅长记住检查这些,但我相信我朋友的话是最有用的,在这种情况下没有。
  • 所以,从短期来看,这对如何完成事情很有教育意义,但从长远来看,并没有帮助我解决问题。我已经尝试了一堆建议的东西,但没有一个能摆脱白色伪影。我没有制作自己的 mipmap,但我将拥有很多图像,所以这样做不是一个非常可行的选择。不过,我感谢您的帮助。
  • 您是否尝试使用 GL_NEAREST 而不是 GL_LINEAR?此外,将属性 GL_TEXTURE_WRAP_S 和 GL_TEXTURE_WRAP_T 设置为 GL_CLAMP_TO_EDGE 而不是 GL_REPEAT 可以帮助消除纹理边界处显示的线条。 “重复”功能用于在边框附近插入像素,即使您只打算不重复地绘制位图。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多