相关疑难解决方法(0)

修改OpenGL顶点缓冲区的正确方法是什么?

我在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)

...会用新数据覆盖旧缓冲区吗?或者我还必须删除旧的?有没有更好的办法?

opengl

25
推荐指数
2
解决办法
2万
查看次数

更新它使用的顶点缓冲区对象时,如何更新顶点数组对象?

通过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

6
推荐指数
1
解决办法
2520
查看次数

标签 统计

opengl ×2