如您所愿,您必须glEnableVertexAttribArray
在处理顶点数组对象时启用属性数组。即使您可以为每个属性绑定不同的缓冲区,您也不能在“每个绘制调用”或类似的情况下绑定不同的属性。这意味着 VAO 指向的所有内容都必须存储相同的属性。当然,您可以忽略 VAO 提供的某些属性,但这可能会导致效率低下,并且可能不是一个好的做法。
这再次意味着,每个具有相同 VAO 绑定的绘图调用都使用相同的属性。我认为这是确定是否需要新 VAO 的最佳方法,首先确定是否需要一组不同的属性。然后,您可以通过指向索引缓冲区中某个其他位置的一组索引轻松地确定要绘制对象的哪一部分。
在更面向对象的场景中(例如游戏,其中您有不同的网格),最实用的方法是简单地为每个网格创建一个或多个 VAO。这允许您为每个网格(静态、动态或流)拥有不同类型的缓冲区。您甚至可以拥有几个大缓冲区(每个缓冲区 1 到 8 MB 或类似的缓冲区)并拥有多个使用相同缓冲区的 VAO。我经常这样做是为了避免频繁的内存分配。
我只是给了你两个选择:
- 每组新属性都有一个新的 VAO
- 场景中每个不同对象的新 VAO
这取决于您拥有的最方便的场景类型,但在大多数情况下,您可能不会发现性能有那么大的差异。当然,在某些情况下性能稍好一些,但您应该自己弄清楚。
考虑到您的问题,我可以看到两个选项。你没有说你是否会经常更新顶点。如果您不断更改图形并更新顶点,我会给轴提供自己的 VAO,因为它们永远不会改变,因此它们可以使用静态缓冲区,而图形本身可以使用动态或流缓冲区。但是,如果轴是整个图表的一部分,这意味着图表本身不会经常更新,为了方便起见,您可以将它们全部放在一个 VAO 中。
请记住,这些只是建议,您应该选择最适合您的框架和/或具有最佳性能的,或者只是最方便的。
希望这会有所帮助。