libGDX渲染TextureRegion渲染过多

4
我希望使用libGDX开发一个简单的2D横向卷轴游戏。
我的世界包含许多不同的64x64像素块,这些块通过SpriteBatch使用相机绘制到屏幕上。我的640x640px资源文件包含所有这些图片。块纹理在我的资源文件中被定位为(0, 0), (0, 64), (64, 0)等等。 当我的应用启动时,我加载纹理并创建许多不同的TextureRegions:
    texture = new Texture(Gdx.files.internal("texture.png"));
    block = new TextureRegion(texture, 0, 0, 64, 64);
    block.flip(false, true);
    // continue with the other blocks

现在,当我渲染我的世界时,一切似乎都很好。但是一些块(大约10%的块)的绘制方式好像TextureRegion的矩形位置不正确 - 它会将上一个块纹理中最底部的像素行绘制为其顶部像素行。大多数块都被正确地渲染了,我检查了多次并确保输入了正确的位置。
奇怪的是,当我在电脑上而不是安卓设备上启动游戏时,纹理被正确地绘制!
在寻找解决方案时,许多人提到了过滤器,但是无论是线性还是最近的过滤器都对我没有用。 :(
希望我能以易于理解的方式解释问题,并且您有任何想法如何解决它(即如何仅绘制我要绘制的纹理区域)!
最好的问候
编辑:错误只出现在某些位置。当我在不同位置绘制具有相同纹理的两个块时,其中一个被正确绘制,而另一个则没有...我不明白....

我想不出解决方案,但我建议你看一下LibGdx纹理打包器。一切都将自动打包和解包,我认为你不会遇到这种奇怪的绘图问题。 - Yasen Bagalev
听起来像是纹理过滤的问题。要么是你在程序中将浮点坐标转换为整数并意外地截断(向下取整),所以63.99999变成了63。 - Dan Hulme
1个回答

4

在将图像打包成一张纹理时,应始终在图像之间留出空白。因为如果您使用 FILTER_LINEAR(我认为是默认设置)进行采样,每个像素点会从四个最近的像素中进行采样。如果您的图像没有留出空白像素填充,则对于所有边缘像素,它将从相邻的图像中获取像素。

因此,解决问题的三个选项:

  1. 在纹理文件中手动添加图像之间的空格
  2. 停止使用 FILTER_LINEAR (但如果您不按原生图像尺寸绘制,例如缩放图像,则结果会很丑)
  3. 使用 Libgdx Texture Packer。它具有内置功能,可以在打包图像时完成这项工作。

1
非常感谢!我尝试了第三个方法,并使用了纹理打包器,现在一切都很好 :) 这甚至使得加载所有不同的纹理变得更加容易,因为纹理打包器允许我索引我的纹理 :D 所以非常感谢你 :) - WhiteStripes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接