0

我在 Libgdx 中创建了一个基于等距图块的游戏。我使用的纹理是 64x64 并使用 TexturePacker 打包到 TextureAtlas 中。然后将它们绘制到屏幕上。然而,在 64x64 纹理的像素化边缘移动时,它们会闪烁并且扭曲,如下图所示。我已经使用了 texturepacker 中可用的所有过滤器,您可以在下面看到线性和最近过滤器的结果。除了闪烁之外,线性滤镜还为纹理添加了黑色轮廓。如果不是因为相机移动时闪烁,我会很好。

瓷砖应该如何显示:

游戏外的瓷砖

线性过滤(可以清楚地看到黑线扭曲):

在此处输入图像描述

最近的过滤(更难看到,但像素化线不直):

在此处输入图像描述

最容易发现它的地方是棕色立方体的顶部和底部。根据相机的移动,失真发生在不同的地方(这会导致闪烁)。

有谁知道是什么原因造成的,或者有可能的解决方案吗?我不确定是否需要任何代码片段。

还值得一提的是,相机设置为 windowHeight/ppm (ppm = 64) 和 windowWidth/ppm,然后将纹理绘制到投影矩阵设置为 camera.combined 的批次上。

编辑:以某种方式将窗口高度从 800 降低到 710(最近)会更好: 降低高度

4

1 回答 1

0

打开premultiplyAlphaTexturePacker 中的选项并设置setBlendFunction.(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA)SpriteBatch。这应该摆脱闪烁的黑边。基本上,当使用线性过滤时,当精灵的边缘与屏幕上的像素不完全对齐时,像素的颜色是从精灵边缘的图像像素和不可见黑色中的图像像素线性采样的它旁边的空间(RGBA = 0000),因此边缘可能看起来比预期的更暗和更透明。预乘 alpha 通过改变插值操作的顺序来解决这个问题。详细解释herehere

此外,使用filterMinorMipMapLinearNearestMipMapLinearLinear确保您没有得到缩小的工件。(第一个表现更好,第二个在某些缩放级别下看起来更好,如果你的相机放大和缩小应该使用。)

最后,filterMax应该是Linear

如果精灵没有按照其原始大小的 1X、2X、3X 等精确地绘制,则最近过滤总是会产生不均匀的伪影,因为屏幕的某些行和列会在图像中的一个像素被绘制两次的地方。

于 2015-06-05T13:06:37.177 回答