ModelBuilder#createBox 方法是一种方便的方法,用于创建带有单个 Node 的 Model,其中包含单个 NodePart,其中包含单个框形状。和做的一模一样:
ModelBuilder builder = new ModelBuilder();
builder.begin();
builder.node();
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material);
BoxShapeBuilder.build(mpb, width, height, depth);
model = builder.end();
它创建一个Mesh 对象,这是一个OpenGL 资源,它只包含(取决于属性)8 或24 个顶点和36 个索引。除非它是您要渲染的唯一内容,否则有这么小的Mesh 对性能非常不利。
这是因为每个Mesh(或Node 的(部分))都意味着一个渲染调用。这意味着它必须等待之前的渲染调用完成以及 CPU 和 GPU 同步。将尽可能多的形状组合成一个Mesh 并一次渲染它会更高效。毕竟,GPU 旨在同时在多个顶点上并行执行。
这与为什么例如SpriteBatch 在渲染之前组合尽可能多的精灵。这也是为什么使用单个TextureAtlas 比使用单独的纹理性能更好的原因。
因此,如果您要使用仅包含单个框的模型创建体素引擎,那么您最终会收到数千次渲染调用。那会很慢,以至于你的游戏几乎无法玩。
当然,解决这个问题很简单,只需在零件上添加多个框即可:
ModelBuilder builder = new ModelBuilder();
builder.begin();
builder.node();
MeshPartBuilder mpb = builder.part("box", primitiveType, attributes, material);
BoxShapeBuilder.build(mpb, x1, y1, z1, width1, height1, depth1);
BoxShapeBuilder.build(mpb, x2, y2, z2, width2, height2, depth2);
//...
BoxShapeBuilder.build(mpb, xn, yn, zn, widthn, heightn, depthn);
model = builder.end();
ModelBuilder#createBox(和其他创建方法)隐藏了这个逻辑,这使得查看幕后发生的事情以及优化它的难易程度变得不那么明显。因此,有一天我可能会删除这些方法。不幸的是,createXXX 方法对于想要快速入门的新手学习 3D API 非常有帮助(例如,我在我的博客上的 tutorials 中使用它)。这就是我仍然没有删除它们的原因。
顺便说一句,将ModelBuilder 用于体素引擎是一种矫枉过正。你可能想看看this tutorial,我在这里展示了一种在运行时组合简单形状的简单方法。最新版本的 libGDX 甚至包含 ShapeCache,它几乎可以直接用作体素块。
我不确定为什么您会认为在建模应用程序中创建一个盒子与通过代码创建它有什么不同。也许你可以链接到你找到的参考。