2013-06-29 71 views
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()

回答

1

您正在寻找glBufferSubData。这不能调整缓冲区大小,但可以更改现有缓冲区中的数据。只要确保你的缓冲区从一开始就足够大。一种常见模式是用BufferData和一个空指针初始化缓冲区到一定大小,然后用BufferSubData只更改它的一部分。

+0

感谢您的意见,但我已经意识到这一功能。它不适合我的原因是因为我有一个非常动态的系统,并且我有内存限制。我不能调整VBO的大小,然后运行一些碎片算法。我想我最好的选择就是维护一个矢量并动态调整大小。然后在时间到来的时候跟踪哪些对象要绘制。加载所有数据的VBO,然后到glDrawArays使用开始和计数变量。不想要,但如果这是我唯一的选择,那么我会去用它。 –

+0

是的,这是您唯一的选择。处理这样的事情是使游戏引擎有价值的原因。你必须管理你自己的记忆。通常最简单的算法虽然够用了。每个池1MB,像堆栈一样增长并回收空池。 – starmole