我正在使用libgdx处理一个Android应用程序,我正在尝试绘制某种类型的风粒子,这些粒子会留下痕迹,类似于:http://hint.fm/wind/。
我设法绘制了粒子,这些粒子是将前一个位置连接到最新位置的线条。但是,如果我每次都清洁屏幕,它将只绘制当前位置,这将类似于小点移动,如预期的那样。
我想要做的是在这些粒子后面绘制一条痕迹,逐渐消失。为此,我尝试创建一个先前粒子位置的列表并使用递减的alpha绘制它们,但是要绘制许多粒子并且它被证明非常慢。所以我搜索了,还有另一种方法来实现这一点,即在绘制新粒子时清除一些透明度的屏幕。我现在的解决方案是使用这个:Unexpected results implementing simple motion blur in Libgdx,虽然我的桌面渲染按预期工作,但在android中有一个由我不理解的白色粒子形成的紫色背景。我该如何解决这个问题?
这是Android和桌面的屏幕截图:http://imgur.com/a/JM2sz
代码:
Pixmap screenClearPixmap = new Pixmap(480, 548, Format.RGBA8888);
screenClearPixmap.setColor(Color.rgba8888(0f, 0f, 0f, 0.1f));
screenClearPixmap.fill();
screenClearTexture = new Texture(screenClearPixmap);
screenClearSprite = new Sprite(screenClearTexture);
screenClearSprite.setSize(480, 548);
screenClearPixmap.dispose();
public void render() {
batch.begin();
screenClearSprite.draw(batch);
batch.end();
animate();
}
public void animate() {
moveParticles();
drawParticles();
}
public void drawParticles() {
shapeRenderer.begin(ShapeType.Line);
shapeRenderer.setColor(Color.WHITE);
...
shapeRenderer.line((float) particle.getOldX(), (float) particle.getOldY(), (float) particle.getX(), (float) particle.getY());
Gdx.gl20.glLineWidth(Global.LINEWIDTH);
shapeRenderer.end();
}
答案 0 :(得分:0)
我知道这已经晚了好几年了,但是因为这对我来说非常有用,所以我希望它可以帮助某人。
我见过的大多数Android设备(不包括模拟器)都要求您拨打Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT)
,否则您可能会得到一些奇怪的结果。这种方式允许您清除屏幕,但仍然可以通过绘制到帧缓冲区对象(FBO)来获得跟踪效果,这不会被glClear()清除,然后将FBO绘制到屏幕上。
创建一个FBO:FrameBuffer fbo;
创建一个SpriteBatch来绘制FBO:SpriteBatch batch;
在create()中:fbo = new FrameBuffer(Pixmap.Format.RGBA8888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
batch = new SpriteBatch();
在render()中:Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
fbo.begin(); //This must be called before your drawing code
shapeRenderer.begin();
shapeRenderer.setColor(0, 0, 0, 0.2f); //You can change the trail length by changing the alpha
shapeRenderer.rect(0, 0, screenWidth, screenHeight); //Draw a translucent rectangle to the FBO.
... Your drawing code goes here ...
shapeRenderer.end();
fbo.end(); //Make sure this is called after shapeRenderer.end() or shapeRenderer.flush();
batch.begin();
batch.draw(fbo.getColorBufferTexture(), 0, 0); //Draw the FBO
batch.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
请记得在应用程序的dispose()方法中调用fbo.dispose()
;