我进行了很多关于将顶点数据收集到常被称为批处理的组中的方法的研究。
以下是对该主题最有趣的两篇文章:
https://www.opengl.org/wiki/Vertex_Specification_Best_Practices
http://www.gamedev.net/page/resources/_/technical/opengl/opengl-batch-rendering-r3900
第一篇文章介绍了如何操作VBO的最佳实践(最大大小、格式等)。
第二篇文章展示了一个简单的例子,说明如何使用批处理来管理顶点内存。根据作者的说法,每个批次必须包含一个VBO实例(以及一个VAO),他强烈强调VBO的最大大小在1Mo(1000000字节)到4Mo(4000000字节)之间。第一篇文章也提供了相同的建议。我引用:“根据nVidia的一个文档,1MB到4MB是一个很好的大小。驱动程序可以更容易地进行内存管理。对于所有其他实现(如ATI/AMD、Intel、SiS)也应该是这种情况。”
我有几个问题:
1)上述最大字节大小是否是绝对规则?分配比4Mo(例如10Mo)更重要的字节大小的VBO是否那么糟糕?
2)对于总顶点字节大小大于4Mo的网格,我们该怎么办?我需要将几何图形拆分成多个批次吗?
3)一个批次是否必须作为属性存储一个唯一的VBO,或者可以将多个批次存储在单个VBO中?(这是两种不同的方式,但第一种方式似乎是正确的选择)。你同意吗?
根据作者的说法,每个批次处理一个唯一的VBO,大小在1到4 Mo之间,整个VBO必须仅包含共享相同材质和变换信息的顶点数据。因此,如果我需要将另一个具有不同材质的网格进行批处理(因此无法将顶点与现有批次合并),我必须创建一个新的批次,并实例化一个新的VBO。
因此,根据作者的说法,我的第二种方法是不正确的:不建议将多个批次存储在单个VBO中。