Camera libGDX中的视差效应抖动

Camera libGDX中的视差效应抖动,camera,libgdx,parallax,smoothing,jitter,Camera,Libgdx,Parallax,Smoothing,Jitter,基本上我在游戏中用它来创造效果,但在移动时,图层会“摆动”。当相机缓慢移动时,这一点尤其明显 我已经修复了时间步长并使用插值平滑。我使用放大的像素艺术。摄像机以播放器为中心,移动后更新。禁用该效果可以使移动摄影机变得平滑 我想问题可能是: 层以不同的速度移动,这意味着它们以不同的速度移动 时代 取整显示使层在移动相机时每帧的位置略有不同 感谢您对低分辨率像素艺术的帮助,这是我使用的策略。我以1:1的分辨率绘制一个小的帧缓冲区,然后将其绘制到屏幕上。这应该可以解决紧张的问题 如果你的舞台也有相

基本上我在游戏中用它来创造效果,但在移动时,图层会“摆动”。当相机缓慢移动时,这一点尤其明显

我已经修复了时间步长并使用插值平滑。我使用放大的像素艺术。摄像机以播放器为中心,移动后更新。禁用该效果可以使移动摄影机变得平滑

我想问题可能是:

  • 层以不同的速度移动,这意味着它们以不同的速度移动 时代

  • 取整显示使层在移动相机时每帧的位置略有不同


感谢您对低分辨率像素艺术的帮助,这是我使用的策略。我以1:1的分辨率绘制一个小的帧缓冲区,然后将其绘制到屏幕上。这应该可以解决紧张的问题

如果你的舞台也有相同的分辨率,那么你必须使用一些技巧来正确处理输入。我用它来使用StretchViewport,但我手动计算世界宽度和高度以不拉伸世界,所以我基本上在幕后执行与ExtendViewport相同的计算。您还必须将宽度和高度四舍五入为整数。您应该在
resize
中执行此操作,并使用
viewport.setWorldWidth()
setWorldWidth()
应用宽度和高度。因此,在本例中,给构造函数的世界大小无关紧要,因为它将在
update()
中更改

调整大小
中的视口上调用
更新
时,需要在要绘制到的帧缓冲区的上下文中执行此操作。否则会弄乱屏幕的帧缓冲区尺寸

public void resize(int-width,int-height){
int worldWidth=数学圆((浮点)世界高度/(浮点)高度*(浮点)宽度);
viewport.setWorldWidth(worldWidth);
viewport.setWorldHeight(世界高度);
frameBuffer.begin();
viewport.update(宽度、高度、真值);//实际屏幕尺寸
frameBuffer.end();
}
您可以在LibGDX中查找使用帧缓冲区的示例。您应该在
frameBuffer.begin()
end()
之间绘制所有游戏,然后像这样将frameBuffer的颜色缓冲区绘制到屏幕上:

stage.act();
frameBuffer.begin();
//平局
stage.draw();
frameBuffer.end();
spriteBatch.setProjectionMatrix(spriteBatch.getProjectionMatrix().idt());
spriteBatch.begin();
draw(frameBuffer.getColorBufferTexture(),-1,1,2,-2);
spriteBatch.end();

在我的例子中,我对世界宽度和世界高度进行了更为复杂的计算,使它们成为实际屏幕尺寸的整数因子。这可以防止大像素在屏幕上的大小不同,这可能看起来很糟糕。或者,您可以将帧缓冲区纹理的过滤更改为线性,并在绘制时使用放大着色器。

您的游戏是低分辨率像素艺术吗?你在纹理上使用最近的过滤吗?是的,我有384x216和最近的,我缩放它。缩放时,它正确地为动画使用了额外的分辨率,但是,层不会一起移动FrameBuffer没有做太多,但我想不会有什么影响。我制作了一个清晰可见的小视频(云、山、森林、前景)screenviewport没有缩放问题,实际上我可以使用任何分辨率。游戏速度为x28,用于视频播放。如果我仔细观察,我甚至可以在terraria这样的游戏中看到这一点,但许多微小的动作会加剧这种情况。让我觉得是视差的性质造成的,也许它变得越来越不坏的比例越高(例如在4k显示器上)。你只对ui使用stage,对吗?感谢helpFrameBuffer,因为像素不能移动分数距离,所以这种抖动不可能发生。在您的视频中,我可以看到您没有使用1:1像素艺术比例的帧缓冲区,因为不同层的像素能够部分地相互重叠。如果我的层仅以精确的像素移动,它会更加不稳定,不是吗?或者这里帧缓冲区的确切用途是什么?我只在screenviewport中使用了您的代码,因为这使我能够完美地缩放到任何分辨率。它将移动得更“块状”,而不是抖动。它和一款真正的复古游戏没有什么不同,在这款游戏中,你从未有过像素部分重叠的情况。这种“块状”效应不像神经过敏那样引起恶心。我这样做是为了获得一个真实的复古外观。如果这不是你想要的外观,这个策略就不起作用。我以前从来没有这样做过。我认为解决方案可能是使用自定义着色器,使纹理线性化,然后在着色器中,在使用纹理坐标之前对纹理坐标应用一个函数,以便它们进行最接近的过滤,除了在texel边缘的狭窄区域。这将是给它一个很小的平滑度在非常边缘的像素。您可以使该平滑区域与合成屏幕像素的宽度相等。我以前从未做过这些……这只是个想法。