opengl 使用LibGDX(正交)相机.缩放使瓷砖闪烁时,移动相机?

hjzp0vay  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(200)

我有一些64 X64的精灵,当我正常移动我的相机时,它们工作得很好(没有闪烁/洗牌)。但是一旦我改变相机。变焦(应该是我游戏中的一个主要机械)水平远离1F,精灵每次移动都会闪烁。
例如,更改为0.8f:
左闪烁:

一次按键后:(右闪烁)

所以当你移动的时候,Map闪烁的时候会分散你的注意力......(尽管很轻微)
缩放是一个单位0.8f,我目前正在使用相机。平移移动左右,我已经尝试铸造(整数),它仍然闪烁...我的纹理/精灵是使用最近的过滤。
我知道缩放可能会改变/像素化我的图块,但为什么它们会闪烁?

编辑

以下是我的分类表,供您参考:

1wnzp6jl

1wnzp6jl1#

这是因为最近过滤的缘故。根据缩放的大小,图片像素的某些线条会跨越屏幕像素的线条,因此它们会比其他线条宽一个像素。随着相机的移动,动画的每一帧上的圆角效果都不同,因此每一帧上不同的线条会被画得更宽。
如果您不想追求复古的低分辨率美感,可以对mip贴图使用线性过滤(MipMapLinearLinear或MipMapLinearNearest)。然后从更高分辨率的图片开始。如果您在缩放级别之间平滑过渡,则第一种效果会更好,但可能会影响性能。
否则,您可以将摄像机的位置舍入为世界单位中像素大小的精确倍数。这样,相同的放大列将始终与相同的屏幕像素相对应,这将大大减少感知到的闪烁。您说您将摄像机平移转换为int,但这需要缩放艺术作品,使艺术作品的一个像素与屏幕的一个像素精确对应。
这并不能解决另一个问题,即某些像素线被画得更宽,因此它们看起来比附近的相似线具有更大的视觉权重,这在两个截图中都可以看到。以便您可以使用放大着色器控制外观。将场景绘制到帧缓冲区,该缓冲区的大小可使纹理的一个像素对应于一个全局像素(没有缩放),并将相机锁定在整数位置。然后将帧缓冲区的内容绘制到屏幕上,并在此阶段进行缩放。使用专门的放大着色器将帧缓冲区纹理绘制到屏幕上,以最大限度地减少模糊并避免最近的过滤伪影。通过在线搜索,您可以找到用于此目的的各种着色器。许多着色器都是为与模拟器一起使用而开发的。

相关问题