我搞砸了一个简单的概念,即使用C++ / OpenGL创建2D墙。每个墙由4个顶点描述,并且水平或垂直延伸,并且还具有颜色。如果墙壁碰撞,它们会相互链接。墙壁形成的周界由简单的矩形填充。
我的想法是将多个墙的顶点数据存储在一个VBO中。或每个属性有多个,然后放入VAO?插入一个VBO并通过VAO访问?无论如何,一个对象中有许多墙壁。如果我要存储的内容空间不足,请制作另一个VBO(或我正在使用的任何内容)来存储另一组墙。我还想让相交的墙(例如成直角)共享顶点以节省空间。
但是,墙壁是可变的,因此可以随时添加,移动或删除顶点。这将需要跟踪VBO中的空闲块,然后根据需要为其分配墙数据。这也意味着,如果我有多个VBO,则在同一VBO中必须有2个共享顶点的墙,这可能会引起各种麻烦。但是同时,我不想为每个墙都制作一个VBO,这最多不过是一个非常简单的4顶点。
对原始图像进行一些更改的示例:
通常如何处理这种情况?是否需要使用我自己的内存分配方案来与VBO配合使用,还是有一种合适的快速解决方案而不需要太多工作?
最佳答案
您为什么认为VBO可能空间不足?我的意思是,对于大多数GPU,VBO的最大大小约为16-32-64Mb,这很多! (也检查here)
如果您可以将所有数据放在一个VBO中,则问题会简单得多。我只是在需要更改时重新缓冲所有数据(我相信,除非您想在每帧添加/删除墙,否则这种情况不会经常发生)。
如果您认为这种方法不可行,建议您从开源代码中检查一些流行的实现,例如here,其中包含osg的GLBufferObject。
看看GLBufferObject::compileBuffer()
函数;在您的情况下,每个osg::BufferEntry
可以是一组相连的墙。要渲染场景,您将必须查询此类以获取每个数据的偏移量。
希望这可以帮助。
关于c++ - 在处理可能依赖的顶点的创建/销毁时,VBO/VAO内存管理做法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13661921/