使用LibGDX(正交)Camera.zoom在移动相机时会使瓷砖闪烁?

时间:2016-02-25 19:53:02

标签: opengl libgdx

所以当我正常移动相机时,我有一些64x64精灵工作正常(没有闪烁/改组)

但是一旦我改变了camera.zoom(本来应该是我游戏中的一个主要技工),每次移动时精灵都会闪烁:(

例如更改为0.8f :(原谅蹩脚的占位符艺术)

左闪烁:

Left flicker

稍后一次按键:(右闪烁)

Right flicker

所以当你四处走动时,当地图闪烁时,它会让游戏玩法更加分散注意力......(不过有点)

缩放是一个平坦的0.8f,我现在正在使用camera.translate移动,我已经尝试转换为(int)它仍然闪烁...我的纹理/精灵正在使用最近的过滤。

我知道缩放可能会改变/像素化我的瓷砖,但为什么它们会闪烁?!好恼人......

所以我不知道我还能做些什么。有没有人有什么建议?非常感谢。

编辑:这里的参考是我的瓷砖表:

For reference here is my tilesheet

1 个答案:

答案 0 :(得分:4)

这是因为最近的过滤。根据缩放量,某些艺术品像素线将跨越屏幕像素线,因此它们比其他线条绘制一个像素宽。当相机移动时,在每个动画帧上舍入的方式不同,以便在每个帧上绘制不同的线条。

如果您不想使用复古的低分辨率美学,可以使用线性过滤和mip贴图(MipMapLinearLinear或MipMapLinearNearest)。然后从更大的分辨率艺术开始。如果您在缩放级别之间平滑过渡,那么第一种看起来会更好,但可能会对性能产生影响。

否则,您可以将相机的位置四舍五入为世界单位像素大小的精确倍数。然后,相同的放大列将始终对应于相同的屏幕像素,这将显着减少感知的闪烁。你说你正在将相机转换成int,但是这需要缩放艺术品,使得艺术的一个像素与屏幕的一个像素完全对应。

这并没有解决另一个问题,即某些像素线被绘制得更宽,因此它们看起来比相似的附近线条具有更大的视觉重量,如两个屏幕截图所示。也许一种方法可以使缩放成为第二步,因此您可以使用升级着色器控制外观。将场景绘制到帧缓冲区,该缓冲区的大小使得一个纹理像素对应于一个世界像素(没有缩放),并且还将相机锁定到整数位置。然后将帧缓冲区的内容绘制到屏幕上,并在此阶段进行缩放。使用专门的升级着色器将帧缓冲区纹理绘制到屏幕上,以最大限度地减少模糊并避免最近的过滤瑕疵。您可以通过在线搜索找到用于此目的的各种着色器。许多已经开发用于模拟器。