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

ian*_*mas 15 java android opengl-es libgdx

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

在我的桌面上按预期渲染. Libgdx在我的桌面上运行,按预期工作

没有像我预期的那样在Galaxy nexus上渲染. 在我的Galaxy Nexus上运行的Libgdx没有按预期工作

圆纹理渲染期间绘制在for循环中,效果与使用0,0,0的RGBA像素映像,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();
Run Code Online (Sandbox Code Playgroud)

给予

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();
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ann 0

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

这意味着您必须对代码进行一些修改。这样做的好处是,你这样做的方式有一些缺陷:它会模糊运动中的所有物体,而不仅仅是球。除非你小心,否则很快就会产生丑陋的结果/伪影。

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

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