如何有效地使用VBO

时间:2014-02-09 19:14:59

标签: opengl

我正在尝试自己进入OpenGl,所以我正在阅读一些关于有效使用顶点缓冲对象的教程/文章。起初我认为渲染东西的最简单方法是每个对象使用一个VBO,但我觉得,使用一个大的VBO(至少对于静态对象)来说更有效率。

OpenGL wiki:

  

...最好将许多对象放入一个VBO并尝试减少对glBindBuffer和glVertexPointer以及其他GL函数的调用次数

所以我基本上有一个巨大的VBO和一个IBO,并使用glBufferSubData添加我的数据。对于每个对象或任何我存储顶点和索引偏移的地方,如果我想绘制特定的一个,我使用glDrawElementsBaseVertex

我的问题是,如果我想删除数据,我不知道该怎么办。我可以把它放在那里,但这似乎不对。

或者我可以用空指针调用glBufferData,然后重新加载所有其他对象。

我能想象的第三件事就是实现某种内存管理,它可以跟踪VBO中的“漏洞”并用新对象重新填充它们。

有没有更好的方法来解决这个问题?这可能取决于具体情况。我在考虑像一个大型游戏世界,一切都是静态的,但当你向一个方向移动时,你不再需要相反的数据。

1 个答案:

答案 0 :(得分:0)

首先,我会将VBO用于一切:静态和动态。只需使用正确的提示(GL_STATIC_DRAWGL_DYNAMIC_DRAW)。

其次,不是使用一个巨大的VBO(你可能正在做以保存状态更改),我建议您在每个网格上使用VBO,但在渲染之前实现某种网格的批处理以减少状态更改。这样就不必担心数据中的任何漏洞了。