我在OpenGL中设置一个顶点缓冲区,如下所示:
int vboVertexHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
稍后,如果我想向"vertexData"添加或删除顶点,那么执行此操作的正确方法是什么?它甚至可能吗?我假设我不能直接修改数组而不将其重新发送到GPU.
如果我修改了vertexData数组,那么再次调用它:
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
...会用新数据覆盖旧缓冲区吗?或者我还必须删除旧的?有没有更好的办法?
通过glBufferData()更新VBO(特别是它的大小)可能会改变它的物理内存地址,但不是glGenBuffers()设置的缓冲区对象名.VBO通过调用glVertexAttribPointer()链接到VAO,其中有关VBO(缓冲区对象名称?存储器地址?)的信息存储在VAO中.当通过glBindVertexArray()绑定时,VAO可用于更新和绘图.GL当时是否重新计算VBO地址?当链接到的VBO通过glBufferData()更新时,VAO可能会也可能不会被绑定.
根据缓冲区对象名称何时转换为物理内存地址,我可以想象只需在更改VBO后再次绑定VAO,就可以为更改后的VBO更新VAO; 或者,可能需要通过另一次调用glVertexAttribPointer()来更彻底地更新VAO.
因此,这个问题的一部分是:关于VBO的哪些信息存储在VAO中?如果它只是缓冲区对象名称,则在更改VBO内容后不必再次调用glVertexAttribPointer().
也许这些细节不是API规范的一部分,因此唯一安全的做法是在每次更新链接的VBO后通过glVertexAttribPointer()更新VAO.
opengl ×2