0
是否可以在不浪费旧内容的情况下向VBO添加更多数据?基本上有一种方法可以在保留旧内容的同时调整VBO的大小?OpenGL将更多数据添加到VBO
例如,可以说我交织一些颜色(CrCgCb)和位置(PxPy)数据在VBO使用两个三角形,使得在VBO存储器的抽象表示看起来像表示的正方形:
[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b]
现在一些事件蒸腾作用和突然的另一个方出生,我希望把它放在同一个VBO使得数据现在看起来像:
[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b,P7x,P7y,C7r,C7g,C7b,P8x,P8y,C8r,C8g,C8b,P9x,P9y,C9r,C9g,C9b,P10x,P10y,C10r,C10g,C10b,P11x,P11y,C11r,C11g,C11b,P12x,P12y,C12r,C12g,C12b]
为了将第一批数据的我这样做:
GLuint vbo;
glGenBuffers(1, &vbo);
float verticies[6 * 2 + 6 * 3] = ...;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
我们在那里得到第二平方我如下通常会做一些事情:
glDeleteBuffers(1, &vbo);
glGenBuffers(1, &vbo);
float verticies[12 * 2 + 12 * 3] = ...;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);
你如何做到这一点,而不必调用glDeleteBuffers()
?
感谢您的意见,但我已经意识到这一功能。它不适合我的原因是因为我有一个非常动态的系统,并且我有内存限制。我不能调整VBO的大小,然后运行一些碎片算法。我想我最好的选择就是维护一个矢量并动态调整大小。然后在时间到来的时候跟踪哪些对象要绘制。加载所有数据的VBO,然后到glDrawArays使用开始和计数变量。不想要,但如果这是我唯一的选择,那么我会去用它。 –
是的,这是您唯一的选择。处理这样的事情是使游戏引擎有价值的原因。你必须管理你自己的记忆。通常最简单的算法虽然够用了。每个池1MB,像堆栈一样增长并回收空池。 – starmole