【问题标题】:Efficient 3D block rendering with Libgdx使用 Libgdx 进行高效的 3D 块渲染
【发布时间】:2014-03-12 09:43:32
【问题描述】:

首先,我对 3D 编程和 libgdx 还是很陌生。 我看了一些教程,我已经渲染了我想要的场景。我有一些 1x1x1 块,用ModelBuilder.createRect() 为每个可见面创建,所以如果另一个块覆盖这个块的一个面,则没有为这个块创建矩形。也不需要顶部和底部矩形,因为我永远看不到它们(除了地板)。所以我想,这非常有效。我也启用了Backface culling,我启用了Viewfrustum culling。但是,如果我朝一个方向看,我的视锥中有很多块,FPS 会下降到 15-20。这对我来说还是可以的,因为我的笔记本电脑已经 5 年多了,性能不是最好的,但this answer 让我思考。

“模型构建器仅用于调试”。好的,但是我应该如何创建我的盒子?为什么我应该在建模应用程序(如 Blender)中为简单的正方形创建 Model?通过这样做,我什至无法剔除被其他块占据的面。 所以我的问题是: 如何以最有效的方式创建和渲染这些框?

【问题讨论】:

  • IIRC,您的方法会导致每个矩形都进行一次绘制调用,如果您有很多矩形,这将变得非常昂贵。查看 DecalBatch 了解您在做什么。它可以将所有矩形组合成一个绘图调用。
  • 但是ModelBatchflush()不是只有在缓冲区满的时候才发送给GPU的,所以只发送到GPU一次。还有DecalBatch,据我所知,sdoes not do what I need,它在3D空间中绘制了一个2DTexture,不是吗?
  • 哦,是的,没错。你在使用混合吗?你画了多少个矩形? DecalBatch 可以绘制没有纹理的实心矩形......你只需要一个自定义 GroupStrategy 来设置它。这个家伙 (badlogicgames.com/forum/…) 发现 DecalBatch 和 ModelBuilder 对矩形有相似的性能。
  • 我使用混合,实际上我有一个 100*100 的方块地图,有 4 个方块高的墙壁。我在 z 方向上只有边缘墙 + 1 个墙穿过整个地图,内部有 1 个洞(要穿过)。所以大约有 1000 个矩形(最多,取决于我的位置和方向导致平截头体剔除)。所有的矩形都有一个 128*128 像素的纹理。我想将它们分组,但当时我无法重复Textures(请参阅我的另一个问题(stackoverflow.com/questions/21908241/…))
  • 我不知道是什么导致了你的低帧率,除了可能是过度过度绘制(你可以通过不使用混合来测试)。所以这可能无济于事,但我使用 DecalBatch 做了类似的事情。 DecalBatch 在 3D 空间中绘制矩形,这几乎就是您使用 ModelBatch 所做的。但我认为你可以将贴花子类化,这样你就可以手动调整 UV 以避免不得不将每面墙最多绘制四次。相反,使用具有可重复纹理的单个贴花,并将两个顶部顶点处的 V 设置为您想要的任何高度(1、2、3 或 4)。

标签: java performance 3d libgdx culling


【解决方案1】:

ModelBuilder#createRect 将为每个矩形创建一个新模型。当渲染一个模型实例的(部分)时,它意味着一个绘图调用。因此 ModelBuilder#createRect 效率极低。最好将多个矩形组合成一个(a 的一部分)模型。这可以使用:

modelBuilder.begin();
MeshPartBuilder mpb = modelBuilder.part(....);
mpb.rect(...); // first rect.
mpb.rect(...); // second rect.
// etc.
Model model = modelBuilder.end();

请注意,这仍然不够有效,例如体素引擎。如果您的目标是针对体素进行优化,您可能希望在自定义 RenderableProvider 中构建网格(在平截头体剔除和深度排序之后)。这是一个例子:https://github.com/libgdx/libgdx/tree/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/voxel

【讨论】:

  • 我昨天才开始使用MeshPartBuilder,正如我所见,我可以为Textures 提供UV。非常感谢您的回答。对此还有一个小问题:如果我从整个左边界墙上创建一个Model。这是否更有效,然后使用视锥体剔除渲染一些较小的部分(比如说 4 个部分)?
  • 回答这个问题的唯一方法是进行基准测试,它取决于太多变量(顶点数、着色器复杂性、gpu 等)。在大多数情况下,这样的问题表明过早的优化。在实践中,最好使用常识,仅在遇到问题时进行优化。例如。将可能在截锥体中组合在一起的静态部分组合在一起,当一个部分可能被剔除而另一部分不被剔除时拆分部分,并拆分相同(重复)并且可能彼此独立剔除的部分。跨度>
  • 非常感谢 Xoppa 这真的帮了很多忙。感谢您开发了出色且易于使用的 3D API + 帮助像我这样的新手使用它:P 继续努力!
  • 旧问题和旧答案,但我正在努力理解体素测试示例。有没有关于那里到底发生了什么的解释文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2014-03-12
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多