Opengl最佳VAO模型的体素引擎

我在LWJGL 3(用于JVM的OpenGL绑定)上创建了一个体素引擎。 我将所有的对象数据存储在世界级的。 世界细分为32 * 32 * 32块。 块使用八叉树存储。 所有我的渲染的主要部分是共享一个网格,但具有不同的变换matrix和一些其他数据的立方体。 为了渲染那些我每块使用一个VAO,它只包含一个立方体网格实例,并且具有存储在其VBO中的所有立方体数据(如变换)。 我构造了每个块VAO,并在一次调用中完全渲染 – glDrawElementsInstanced。 如果我需要更改块中的某些立方体数据,我将从头开始重新构建VAO或更改单个缓冲区数据。 这应该是非常有效的,对吧?

但是我需要渲染一些其他的东西,比如复杂的网格对象或效果或者一些debugging的东西。

我应该如何渲染这些对象? 我应该为每个网格创建一个VAO,然后使用相同的网格为每个对象执行实例化渲染? 或者,我应该批处理所有对象与他们的网格为每个块一个VAO,并完全呈现?

我最近试图创建一个VAO,它包含每个网格的一个实例和所有的对象数据。 但是我不能正确渲染它。 因为每次我需要以某种方式切换对象数据VBO,同时渲染实例化的网格。 它没有工作。

代码为最后的VAO: http : //pastebin.com/WanNsR5L

我不认为你应该实例化个别块。 这是很多数据你必须来回发送到GPU …这是不可行的,特别是对于体素引擎。

我会从块数据构建一个网格,并将其放置到一个VBO。 每次有块更新时,放弃网格并在其中创建一个新网格。

我觉得“贪心网格”algorithm很容易实现,速度相当快,但并不总是最优的。 你可以在这里find更多的信息,以及更多关于如何修改它以更好地执行的信息:http:/ 0fps.net/2012/06/30/meshing-in-a-minecraft-game/

网格划分不仅增加了性能,而且为模块化开辟了道路。 您可以无缝地添加不同的algorithm,如双轮廓,行进立方体等,而不会影响任何其他代码。