我正在使用AndEngine(基于2D OpenGL的引擎)。当我使用具有透明度的纹理(PNG图像)时,我在图像上的边框上有图像伪像。我需要帮助解决这个问题。我附上了2张图片。首先,我只使用某种字体显示文本。在第二个,您可以看到圆角,但在纹理的角落,您也可以看到工件。请注意,这仅在REAL设备上发生。在模拟器上一切都OK。我的设备是运行Android 2.1的三星i5700 Galaxy Spica corner with artifact http://i44.tinypic.com/2crttlx.png text with artifact http://i39.tinypic.com/10r4yn9.png
答案 0 :(得分:10)
BILINEAR过滤插值最近的四个像素的颜色,这使得纹理在缩放/旋转时很好,或者用非整数值移动,但是有一些困难。
纹理图集背景可能是黑色,并且texregion的边缘像素与此背景混合。使用自定义透明纹理图集,或使用修改后的TextureAtlas构建器填充透明度(TODO查找论坛链接,如下所述)
如果纹理背景是透明的,则alpha仍然会混合为边缘颜色。 向纹理区域添加1像素的拉伸(在边缘处的额外行/列中重复边缘像素),并将区域边缘定位在原始边缘像素和添加的边缘像素之间。这将确保双线性插值仅选取您所在地区的像素。
如果纹理区域太近,则区域边缘可能会从其他区域边缘获取一些像素。在纹理区域之间使用填充。
在我的字体中,J
字符有一条过于向左延伸的下曲线,这会在呈现I
字母时产生一个小工件,因为IJ
彼此相邻纹理,可能太近了。
尝试降低字体大小,增加纹理大小或破解较大的Font.PADDING
值(5
为我工作而不是1
)。但请注意,默认情况下,增加PADDING
也会增加行间距,这可能并不理想。可以引入新的YPADDING
并在必要时进行补偿。
字母按需呈现给Font纹理图集。这可能会导致纹理图集上的空间不足,产生有趣的效果(请参阅Dissapearing ChangeableText)。
一种解决方案是将此代码段插入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);
}
答案 1 :(得分:5)
我找到了解决方案。这些工件背后的原因是纹理过滤设置。我使用 TextureOptions.BILINEAR 和 TextureOptions.BILINEAR_PREMULTIPLYALPHA 导致了这些工件。我选择了 TextureOptions.DEFAULT ,纹理变得清晰,没有任何文物。但是有一个缺点。我的游戏中有精彩的精灵运动。但是随着这种新的过滤设置(以及结果的纹理清晰度),精灵运动变得不顺畅......有点不稳定。需要使用不同的过滤选项创建几个TextureAtlases。
答案 2 :(得分:2)
答案 3 :(得分:0)
我会检查引擎上的缩小/放大滤镜设置。插入纹理时,如果纹理应用程序的目标与纹理的大小不同,则可能会出现伪影。
答案 4 :(得分:0)
在纹理中放置textureRegions时,请务必留下几个像素的缓冲区。我发现了同样的问题,纹理显示相邻纹理区域的像素左右。只需添加2-5像素边界即可消失。