在 Libgdx 中实现简单运动模糊的意外结果

2022-09-02 14:14:20

在附加的两张图片中,libgdx 的桌面屏幕截图按预期运行。不幸的是,我的Galaxy Nexus的屏幕截图并不像预期的那样。我正在尝试创建一个简单的运动模糊或轨迹效果。

在桌面上按预期呈现。Libgdx running on my desktop, working as expected

在我的Galaxy连接上没有像我预期的那样渲染。Libgdx running on my Galaxy Nexus not working as expected

在渲染过程中,圆形纹理在 for 循环中绘制,并且使用在圆圈之前绘制的 RGBA 0, 0, 0.1f 的像素贴图实现效果。

屏幕清除精灵创建

Pixmap screenClearPixmap = new Pixmap(256, 256, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0, 0, 0, 0.1f));
screenClearPixmap.fillRectangle(0, 0, 256, 256);
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(screenWidth, screenHeight);
screenClearPixmap.dispose();

呈现

batch.begin();
font.draw(batch, "fps:" + Gdx.graphics.getFramesPerSecond(), 0, 20);
screenClearSprite.draw(batch);
for (int i = 0; i < circleBodies.size(); i++) {
    tempPos = circleBodies.get(i).getPosition();
    batch.draw(circleTexture, (tempPos.x * SCALE) + screenWidthHalf
            - circleSizeHalf, (tempPos.y * SCALE) + screenHeightHalf
            - circleSizeHalf);
}
batch.end();

那么,我做错了什么呢?也许有更好的方法来获得运动的“运动模糊”效果?


答案 1

这是一种不同的方法,每次都使用纯色清除屏幕,而不使用Alpha。

这意味着您将不得不对代码进行一些修改。这样做的好处是,你这样做的方式有一些缺陷:它会模糊运动中的一切,而不仅仅是球。并且会迅速产生丑陋的结果/伪影,除非你小心。

  1. 执行与现在相同的操作,但不是将球绘制到批处理中,而是将它们绘制到纹理/位图/其他任何内容上。然后,每个帧在球图像上添加一个 Alpha 混合图像,然后在该图像上以当前位置绘制球。然后将该图像添加到屏幕上。就像你现在所做的那样,除了你画到别的东西上并保留它。这样,您就不必依赖要绘制的视口,并且可以将所有内容分开。此方法类似于绘制到累积缓冲区

  2. 而不是按照你现在的方式去做,你可以跟踪每个球的n个最新位置。然后每帧绘制所有这些,用不同的alpha。这很容易实现。如果您有很多球或一个大n,可能会导致许多绘图调用,但如果它不是太多,它不应该限制您的fps并提供很好的控制。


答案 2

也许有更好的方法来获得运动的“运动模糊”效果?

为了使我的游戏中的运动模糊,我使用另一个approch“粒子效果”,它与我一起工作得很好,我没有Android /桌面问题或不同的Android设备

您所要做的就是使用Libgdx的“粒子效果编辑器”并制作您的效果,然后将其加载到项目中,最后将其绘制在您绘制对象的同一位置(并绘制对象)

使用Paticle编辑器制作正确效果文件的提示:

  • 设置(使用)要在粒子效果中模糊其运动的对象的相同图像

  • 尝试限制计数:允许的最大粒子数

  • 禁用“速度”和“角度”参数

粒子效果有助于做运动效果 希望这将有助于某人!


推荐