【问题标题】:Android. AndEngine. Image artifacts where transparency is used安卓。和引擎。使用透明度的图像伪影
【发布时间】:2012-01-17 14:55:53
【问题描述】:

我正在使用 AndEngine(基于 OpenGL 的 2D 引擎)。当我使用具有透明度的纹理(PNG 图像)时,我在图像的边界上有图像伪影。我需要帮助解决这个问题。我附上了2张图片。首先,我只使用某种字体显示文本。在第二个您可以看到圆角,但在纹理的角落您也可以看到工件。请注意,这只发生在真实设备上。在模拟器上一切正常。我的设备是运行 Android 2.1 的三星 i5700 Galaxy Spica

【问题讨论】:

  • 您确认图像本身没有伪影吗?如果是这样,您的问题可能与抖动有关。
  • 我在图像编辑器中验证了它。图像还可以。同样在模拟器上一切正常。
  • 是的,我正在使用 BitmapTexureAtlas

标签: android opengl-es andengine


【解决方案1】:

AndEngine Artifacts 的大社区 Wiki

Sprite 工件

BILINEAR 过滤对最近的四个像素的颜色进行插值,这使得纹理在缩放/旋转或使用非整数值移动时变得漂亮,但有一些困难。

黑色或暗线伪影

纹理图集背景可能是黑色的,texregion 的边缘像素与此背景混合。使用自定义透明纹理图集,或使用修改后的 TextureAtlas 构建器,它会用透明度填充自身(TODO 找到描述此内容的论坛链接)

精灵边缘有不需要的 alpha

如果纹理背景是透明的,alpha 仍然会混合到边缘颜色中。 向您的纹理区域添加一个 1 像素的拉伸(在边缘的额外行/列中重复边缘像素),并将您的区域边缘定位在原始边缘像素和添加的边缘像素之间。这将确保双线性插值仅从您的区域中挑选像素。

其他边缘工件

如果纹理区域太靠近,区域边缘可能会从其他区域边缘获取一些像素。在纹理区域之间使用填充。

文本工件

基线下偶尔出现的小垂直线 (GLES1)

在我的字体中,J 字符有一个过度向左延伸的下曲线,这会在渲染I 字母时导致一个小伪影,因为IJ 在纹理中彼此相邻,而且可能也是附近。

尝试降低字体大小、增加纹理大小或修改更大的Font.PADDING 值(5 对我有用,而不是1)。但是请注意,默认情况下,增加PADDING 也会增加行距,这可能不是我们所希望的。可以引入新的YPADDING 并在必要时使用以进行补偿。

消失的字母

字体按需渲染到字体纹理图集。这可能会导致纹理图集空间不足,从而产生有趣的效果(请参阅Dissapearing ChangeableText)。

一种解决方案是将此 sn-p 插入Font#createLetter(char) 方法:

    if (this.mCurrentTextureY + letterHeight > textureHeight) {
        throw new IllegalStateException("Could not allocate space for letter " + pCharacter + " on texture. " +
                "Please enlarge the texture atlas size. This would be letter #" + this.mLetterCount);
    }

【讨论】:

    【解决方案2】:

    我想出了解决办法。这些伪影背后的原因是纹理过滤设置。我使用了导致伪影的 TextureOptions.BILINEARTextureOptions.BILINEAR_PREMULTIPLYALPHA。我选择了 TextureOptions.DEFAULT,纹理变得清晰且没有任何伪影。不过有一个缺点。我的游戏中有平滑的精灵运动。但是有了这个新的过滤设置(以及结果的纹理脆度),精灵的运动变得不平滑......有点波涛汹涌。需要创建几个具有不同过滤选项的 TextureAtlases。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      我会检查引擎上的缩小/放大过滤器设置。在对纹理进行插值时,如果纹理应用的目标与纹理大小不同,则可能会出现伪影。

      【讨论】:

      • 没有使用放大倍率。我正在创建的精灵从纹理中获取它们的大小。 (即如果纹理为 50x50,则精灵将具有相同的大小)
      【解决方案5】:

      在纹理中放置textureRegions 时,一定要留出几个像素的缓冲区。我发现了同样的问题,纹理显示相邻纹理区域的一个像素左右。只需添加一个 2-5 像素的边界,它就会消失。

      【讨论】:

      • 实际上我在图像之间确实有一个缓冲区。我使用 1px 但根据您的建议尝试增加它。没有效果。神器还在
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多