我在理解如何使用 OpenGL 处理/渲染多个对象时遇到了一点困难。我环顾四周,在谷歌和 OpenGL 红皮书中找到了答案,这些答案与我试图弄清楚的内容类似,但我需要看看我是否有正确的想法。
我的第一个想法是我应该分别处理带有 X、Y 和 Z 的平移和旋转变量的位置数据。将单个网格存储在该类的静态 VBO 中,然后对于我要渲染的每个实例执行 for-next 循环
- 加载标识
- 变换到特定对象的位置/旋转
- 使用 drawarrays 在该位置渲染网格
- 循环到下一个对象并为每个对象重复上述操作
为每个帧更新处理这样的转换是否会显着影响性能?
有人提到的另一种方法是将每个顶点的所有位置数据粘贴在单个 VBO 中,然后通过单个调用对其进行渲染。在这种方法中,我假设“创建”一个对象,我需要通过一个函数处理每个顶点的位置数据,该函数将获取其局部坐标(通过静态数组)并将该特定对象的位置数据添加到顶点,然后将其存储在 VBO 中?如果是这种情况,我将如何处理旋转?
我的第三个想法是在对象的每个实例中存储一个 4x4 矩阵来保存平移/旋转信息,然后当我去渲染时,我只需加载该对象的矩阵,从单个 VBO 绘制网格,然后加载下一个对象的矩阵,从同一个 VBO 中绘制,等等......
最后,我看到有些人建议为每个对象设置一个 VBO,并为每个实例调用 drawarray。这种方式对我来说似乎非常低效,并且让我想知道如果您为每个网格都调用它,那么拥有 VBO 的意义何在。似乎立即模式(我知道它已贬值)会更快,因为您没有为每个对象创建和绑定 VBO 的开销。
这些处理/渲染多个对象的任何/所有方法是否有效?如果是这样,每种方法的优缺点是什么?
最有意义的方法是每个网格有一个 VBO,然后在每次更新时转换它们,或者在每次更新时加载每个对象的矩阵并以这种方式渲染。我对 OpenGL 和图形渲染还很陌生,所以我试图完全理解处理渲染多个对象所需信息的最佳方法。