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

Posted

技术标签:

【中文标题】在 Libgdx 中实现简单运动模糊的意外结果【英文标题】:Unexpected results implementing simple motion blur in Libgdx 【发布时间】:2012-06-07 05:50:00 【问题描述】:

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

在我的桌面上按预期进行渲染。

在我的 Galaxy Nexus 上未按预期呈现。

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

screenClearSprite 创建

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();

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

【问题讨论】:

你能在其他安卓设备上重现这种行为吗? 你确定有问题吗,因为第二个屏幕截图上的球看起来比第一个屏幕截图上的球移动得慢?你的游戏循环是什么?您是否使用当前时间来计算运动模糊 - 可能是与您的 PC CPU 相比,nexus 的 CPU 更快/更慢。 是的,这可以在我的 Vibrant 和 Galaxy Nexus S 上重现。至于模糊,它们没有运动模糊计算。运动模糊可能不是该效果的最准确术语。我正在寻找的效果在顶部图像中准确描绘。问题似乎是作为不透明层绘制的纹理不能正确计算到 1。这会导致令人讨厌的条纹,我无法解释,因为它在我的两台电脑上按预期工作。 【参考方案1】:

这是一种不同的方法,您每次都使用纯色和无 alpha 清除屏幕。

这意味着您将不得不修改您的代码。这样做的好处是,您执行此操作的方式存在一些缺陷:它会使运动中的一切变得模糊,而不仅仅是球。除非你小心,否则很快就会产生丑陋的结果/伪影。

    和你现在做的一样,但不是将球绘制到批次中,而是将它们绘制到纹理/位图/其他上。然后每一帧在球图像上添加一个 alpha 混合图像,然后在其顶部绘制球的当前位置。然后将该图像添加到您的屏幕。很像你现在正在做的,除了你画到别的东西上并保持它。这样您就不必依赖正在绘制的视口,并且可以将所有内容分开。 此方法类似于绘制到累积缓冲区

    您可以跟踪每个球的 n 个最新位置,而不是按照您的方式进行操作。然后在每一帧都用不同的 alpha 绘制它们。这很容易实现。如果您有很多球或较大的 n,可能会导致许多绘图调用,但如果不是太多,则不应限制您的 fps 并提供良好的控制。

【讨论】:

#1 可能是最好的选择。我实施了#2,但球必须移动得非常快才能看到轨迹,所以我需要更改保存先前位置的频率,以获得良好的长轨迹。或者,直到稍后我才能对此进行测试,也许精灵本身允许修改 alpha,这与我原来的方法相同,但可能会按预期工作。所以创建 alpha 为 1 的像素图,然后使用 0.1f 的 sprite alpha。 sprite 在 Libgdx 中是否具有该功能? @tencent 你可以使用glBlendFuncglBlendColor来乘法混合纹理颜色和一个常量颜色。【参考方案2】:

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

为了在我的游戏中制作运动模糊,我使用了另一种方法“粒子效果”,它对我非常有效,而且我没有 android/桌面问题或不同的 Android 设备

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

使用 Particle Editor 制作正确效果文件的提示:

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

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

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

粒子效果有助于做运动效果 希望这会对某人有所帮助!

【讨论】:

以上是关于在 Libgdx 中实现简单运动模糊的意外结果的主要内容,如果未能解决你的问题,请参考以下文章

用matlab怎样产生运动模糊图像,运动图像包括匀速直线运动,匀加速运动,高频运动

5.Libgdx扩展学习之Box2D_刚体的运动和贴图

5.Libgdx扩展学习之Box2D_刚体的运动和贴图

5.Libgdx扩展学习之Box2D_刚体的运动和贴图

通过消除恒定运动进行运动检测

光流(optical flow)和openCV中实现