我正在尝试自己进入OpenGl,所以我正在阅读一些关于有效使用顶点缓冲对象的教程/文章。起初我认为渲染东西的最简单方法是每个对象使用一个VBO,但我觉得,使用一个大的VBO(至少对于静态对象)来说更有效率。
OpenGL wiki:
...最好将许多对象放入一个VBO并尝试减少对glBindBuffer和glVertexPointer以及其他GL函数的调用次数
所以我基本上有一个巨大的VBO和一个IBO,并使用glBufferSubData
添加我的数据。对于每个对象或任何我存储顶点和索引偏移的地方,如果我想绘制特定的一个,我使用glDrawElementsBaseVertex
。
我的问题是,如果我想删除数据,我不知道该怎么办。我可以把它放在那里,但这似乎不对。
或者我可以用空指针调用glBufferData
,然后重新加载所有其他对象。
我能想象的第三件事就是实现某种内存管理,它可以跟踪VBO中的“漏洞”并用新对象重新填充它们。
有没有更好的方法来解决这个问题?这可能取决于具体情况。我在考虑像一个大型游戏世界,一切都是静态的,但当你向一个方向移动时,你不再需要相反的数据。
答案 0 :(得分:0)
首先,我会将VBO用于一切:静态和动态。只需使用正确的提示(GL_STATIC_DRAW
或GL_DYNAMIC_DRAW
)。
其次,不是使用一个巨大的VBO(你可能正在做以保存状态更改),我建议您在每个网格上使用VBO,但在渲染之前实现某种网格的批处理以减少状态更改。这样就不必担心数据中的任何漏洞了。