我在Libgdx中创建了一个基于等距平铺的游戏。我使用的纹理是64x64,并使用TexturePacker打包到TextureAtlas中。然后将它们绘制到屏幕上。然而,当围绕64x64纹理闪烁的像素化边缘移动并且它们被扭曲时,这可以在下面的图像中看到。我使用了texturepacker中可用的所有过滤器,下面你可以看到线性和最近过滤器的结果。除了闪烁之外,线性滤镜还为纹理添加了黑色轮廓。如果相机移动时闪烁不闪,我会很好。
图块应如何显示:
线性过滤(您可以清楚地看到黑线扭曲):
最近的过滤(难看,但像素化的线不直):
最容易发现它的地方是棕色立方体的顶部和底部。根据相机的移动,失真发生在不同的地方(这会导致闪烁)。
任何人都知道是什么导致这种情况,或者有可能的解决方案?我不确定是否需要任何代码段。
还值得一提的是,相机设置为windowHeight / ppm(ppm = 64)和windowWidth / ppm,然后将纹理绘制到投影矩阵设置为camera.combined的批处理中。
编辑:以某种方式将窗口高度从800减少到710(最近)时效果更好:
答案 0 :(得分:0)
打开TexturePacker中的premultiplyAlpha
选项,并在SpriteBatch上设置setBlendFunction.(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA)
。这应该摆脱闪烁的黑色边缘。基本上,当使用线性滤波时,当精灵的边缘与屏幕上的像素完全对齐时,像素的颜色是从精灵边缘的图像像素线性采样的。在其旁边的不可见黑色空间(RGBA = 0000)中的图像像素,因此边缘可能看起来比预期更暗且更透明。预乘alpha可以通过改变插值的操作顺序来解决这个问题。详细说明here和here。
另外,使用filterMin
或MipMapLinearNearest
的{{1}}来确保您没有获得缩小工件。 (第一个表现更好,第二个在某些缩放级别看起来更好,如果你的相机放大和缩小,应该使用它。)
最后,MipMapLinearLinear
应为filterMax
。
如果精灵没有以原始大小的1X,2X,3X等精确绘制,则最近的滤波将始终产生不均匀的伪像,因为屏幕中将存在某些行和列,其中绘制了图像中的像素两次。