在libgdx中的3D空间中渲染SpriteBatch + ParticleEffect?

时间:2014-01-04 17:57:38

标签: 3d libgdx particle-system spritebatch

我使用的是libgdx版本0.9.9。我想在3D空间中使用ParticleEffect以及其他3D模型渲染火焰效果。

我的代码的逻辑流程:

  1. ModelBatch Begin
  2. 使用ModelBatch
  3. 在Bullet World中渲染所有3D模型
  4. ModelBatch End
  5. SpriteBatch Begin
  6. 使用SpriteBatch
  7. 使用ParticleEffect(effect.draw)渲染火焰效果
  8. SpriteBatch End
  9. 使用舞台
  10. 绘制HUD

    问题:火焰效果在3D空间中的某个点上呈现正常。但是当我旋转相机以使3D模型位于相机和火焰效果之间时,火焰效果会渲染3D模型,而不是隐藏在3D模型后面。

    我尝试过的事情:

    1. 我首先尝试渲染SpriteBatch然后再渲染3D模型:在这种情况下,火焰效果不可见。我猜测3D模型(图层)渲染了火焰效果(图层),因此效果不可见。
    2. 我尝试在步骤1和3之间渲染SpriteBatch,即在modelbatch.begin和modelbatch.end之间渲染SpriteBatch。在这种情况下,根本看不到火焰效果。
    3. 我尝试将粒子效果渲染为Actor(添加到HUD Stage)。正如预期的那样,火焰效果呈现为最顶层HUD层的一部分,同样的问题仍然存在。
    4. 我尝试过探索贴花,但发现粒子效果不适用于DebcalBatch。我不想在贴花上显示动画火.gif,因此没有尝试。
    5. 有没有人遇到过类似的问题?任何建议的解决方法都可以使ParticleEffect成为3D世界的一部分,以便在被其他3D模型阻挡时隐藏它?我看过Xoppa在youtube上发布了关于libgdx中3D粒子的视频,但没有提到步骤/解决方案。任何帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分:0)

如果您希望火焰出现在后面而不是顶部,则需要首先渲染spritebatch。问题似乎是屏幕在3D渲染时自动清除。有几种方法可以解决这个问题。

您可以尝试确保只有第一个进程清除屏幕。

这是代码:

Gdx.graphics.getGL20().glClearColor( 1, 0, 0, 1 );
Gdx.graphics.getGL20().glClear( GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );

不幸的是,如果你的3D渲染器在内部调用它并且你无法控制它,那么你就是一个绑定。 (我不确定你使用了多少库代码或你自己的代码)

我建议将两者渲染到帧缓冲区对象,然后您可以将两个帧缓冲区对象中的图像作为2D纹理渲染到屏幕上。然后,您可以根据需要在这些之间使用混合,或者您可以设置alpha或禁用混合,使得一个在另一个之上,只需确保以任何您想要的顺序渲染它们。

http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/glutils/FrameBuffer.html

答案 1 :(得分:0)

SpriteBatch未按以下呈现顺序显示的原因:

  1. 使用SpriteBatch渲染粒子效果
  2. 渲染3D模型
  3. 是因为3d模型由与SpriteBatch重叠的Skydome组成,因此完全隐藏了它。我从上面步骤#2中渲染的3D模型集中取出Skydome,并在粒子效果之前渲染它。

    以下渲染顺序对我来说很好:

    1. 使用ModelBatch渲染Skydome
    2. 使用SpriteBatch渲染粒子效果
    3. 使用ModelBatch
    4. 渲染其余模型

      有了这个,粒子效果就在天空前面,但在3d模型后面。