6

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

我的代码的逻辑流程:

  1. 模型批处理开始
  2. 使用 ModelBatch 渲染 Bullet World 中的所有 3D 模型
  3. 模型批次结束
  4. SpriteBatch 开始
  5. 使用 SpriteBatch 使用 ParticleEffect (effect.draw) 渲染火焰效果
  6. SpriteBatch 结束
  7. 使用 Stage 绘制 HUD

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

我尝试过的事情:

  1. 我尝试先渲染 SpriteBatch,然后渲染 3D 模型:在这种情况下,火焰效果不可见。我猜测 3D 模型(图层)正在渲染火焰效果(图层),因此效果不可见。
  2. 我尝试在第 1 步和第 3 步之间渲染 SpriteBatch,即在 modelbatch.begin 和 modelbatch.end 之间渲染 SpriteBatch。在这种情况下,火焰效果根本不可见。
  3. 我尝试将粒子效果渲染为 Actor(添加到 HUD 舞台)。正如预期的那样,火焰效果渲染为最顶层 HUD 层的一部分,同样的问题仍然存在。
  4. 我曾尝试探索贴花,但发现粒子效果不适用于 DebcalBatch。我不想在贴花上显示动画火焰 .gif,因此没有尝试。

有没有人遇到过类似的问题?有什么建议的解决方法可以使 ParticleEffect 成为 3D 世界的一部分,以便在被其他 3D 模型阻挡时隐藏起来?我在 youtube 上看到了 Xoppa 发布的关于 libgdx 中的 3D 粒子的视频,但没有提到任何步骤/解决方案。任何帮助将不胜感激。

4

2 回答 2

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

于 2014-01-06T22:34:54.460 回答
0

SpriteBatch 未按以下渲染顺序显示的原因:

  1. 使用 SpriteBatch 渲染粒子效果
  2. 渲染 3D 模型

是因为 3d 模型由与 SpriteBatch 重叠的 Skydome 组成,因此将其完全隐藏。我从上面第 2 步中渲染的一组 3D 模型中取出 Skydome,并在粒子效果之前渲染它。

以下渲染顺序对我来说工作正常:

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

这样,粒子效果就在天空的前面,但在 3d 模型的后面。

于 2014-02-03T03:10:11.007 回答