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

21
在这两张图片中,libgdx桌面版的截图表现如预期。但是我的Galaxy Nexus手机屏幕截图不尽如人意。我试图创建一个简单的运动模糊或拖影效果。
在我的桌面上按照我的预期进行渲染。 Libgdx running on my desktop, working as expected 在我的Galaxy Nexus上未按照我的预期进行渲染。 Libgdx running on my Galaxy Nexus not working as expected 圆形纹理在渲染时使用for循环绘制,并且利用RGBA为0、0、0、0.1f的像素图在圆形绘制之前绘制以获得效果。
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();

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


你能在其他安卓设备上重现这个问题吗? - Stefan Hanke
1
你确定存在问题吗?因为第二张截图上的球看起来只是移动速度比第一张截图上的球慢而已。你的游戏循环是什么?你使用当前时间来计算运动模糊吗?也许 Nexus 的 CPU 与你的 PC CPU 相比速度更快/更慢。 - Svetlin Mladenov
是的,这个问题可以在我的Vibrant和Galaxy Nexus S上重现。至于模糊效果,没有运动模糊计算。运动模糊可能不是该效果最准确的术语。我要寻找的效果在顶部图像中被准确地描述了。问题似乎在于绘制为不透明层的纹理没有正确地计算到1。这会导致难看的条纹,我无法解释,因为它在我的两台电脑上按预期工作。 - ian.shaun.thomas
2个回答

0
也许有更好的方法来实现运动模糊效果? 为了在我的游戏中制作运动模糊效果,我使用了另一种方法“粒子效果”,它对我非常有效,我没有遇到Android /桌面问题或不同的android设备问题。 你需要做的只是使用Libgdx的“粒子效果编辑器”制作自己的效果,然后将其加载到你的项目中,最后在与你绘制对象相同的位置绘制它(并同时绘制你的对象) 使用Paticle Editor制作正确的效果文件的提示: -设置(使用)要在粒子效果中模糊其运动的对象的相同图像 -尝试限制"count":允许的最大粒子数 -禁用“velocity”和“Angle”参数 粒子效果有助于实现运动效果 希望这能帮助到某些人!

0

这里有一种不同的方法,每次用纯色和无透明度清除屏幕。

这意味着您将不得不修改您的代码。好处是,您现在的做法存在一些缺陷:它会使所有运动中的物体变模糊,而不仅仅是球。并且如果您不小心,很快就会产生丑陋的结果/伪像。

  1. 现在做的事情可以保持不变,但是不要将球绘制到批处理中,而是绘制到纹理/位图/其他地方。然后每一帧在球形图像上添加一个 alpha 混合图像,然后在其上绘制当前位置的球形图像。然后将该图像添加到屏幕上。这种方法类似于绘制到累加缓冲区。

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


#1 可能是最好的选择。我实现了 #2,但为了看到轨迹,小球必须移动非常快,因此我需要更改保存先前位置的频率,以获得较长的良好轨迹。或者,我无法测试这一点直到稍后,也许精灵本身允许修改 alpha,这将是与我的原始方法相同的方法,但可能会按预期工作。因此,使用 alpha 值为 1 创建 pixmap,然后使用 alpha 值为 0.1f 的 sprite。在 Libgdx 中,精灵是否具有该功能? - ian.shaun.thomas
@tencent 你可以使用 glBlendFuncglBlendColor 对纹理颜色进行乘法混合,从而与一个常量颜色混合。 - Stefan Hanke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接