2014-03-12 141 views
0

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

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

+0

IIRC,你的方法会导致每个矩形的一次绘制调用,如果你有很多矩形,它将变得非常昂贵。查看DecalBatch,了解您正在做的事情。它可以将所有矩形组合成一次绘制调用。 – Tenfour04

+0

但是'ModelBatch'' flush()'只有当它的缓冲区已满时才会刷新它们,所以它只会被发送到GPU一次。同样''DecalBatch',尽我所知,没有做我所需要的,它在3D空间中绘制2D纹理,不是吗? – Springrbua

+0

哦,是的,没错。你在使用混合吗?你绘制了多少个矩形? DecalBatch可以绘制没有纹理的实心矩形......您只需要一个自定义的GroupStrategy来设置它。这家伙(http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=12493&p=55804&hilit=decalbatch#p55804)发现DecalBatch和ModelBuilder对矩形具有相似的性能。 – Tenfour04

回答

1

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

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

+0

我刚刚开始使用'MeshPartBuilder',因为我已经看到了我可以给它纹理的UV。非常感谢您的回答。这只是另一个小问题:如果我在整个左边墙上创建一个'Model'。这是更有效率,然后渲染一些较小的部分(让我们说4部分)与视锥截取? – Springrbua

+1

回答这个问题的唯一方法是基准测试,它依赖于太多的变量(顶点数,着色器复杂度,GPU等)。在大多数情况下,这些问题表明过早优化。在实践中,最好使用常识,只有在遇到问题时才进行优化。例如。将可能在平截头体中一起的静态部分组合在一起,当一部分可能被剔除而另一部分不可被分割时,分割部分是相同的(重复的)并且可能被相互独立地剔除。 – Xoppa

+0

非常感谢Xoppa这真的帮了很大忙。感谢您使用真棒且易于使用的3D API +帮助像我这样的新手使用它:P保持它! – Springrbua