首页 文章

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

提问于
浏览
0

我试图画出一些留下痕迹的风粒子,类似于: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

    我知道这已经晚了好几年了,但是因为这对我很有用,所以我发布这篇文章是为了帮助某人 .

    我见过的大多数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() ;

相关问题