清除libgdx中具有透明度的屏幕以绘制粒子轨迹

时间:2014-04-22 13:17:53

标签: android libgdx

我正在使用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();
}

1 个答案:

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