我在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)
...会用新数据覆盖旧缓冲区吗?或者我还必须删除旧的?有没有更好的办法?
rad*_*al7 28
调用时设置任何OpenGL缓冲区对象的大小glBufferData.也就是说,OpenGL将在第二个参数glBufferData(未在OP中列出)中分配您指定的内存量.实际上,如果你调用,例如glBufferData( GL_ARRAY_BUFFER, bufferSize, NULL, GL_DYNAMIC_DRAW );OpenGL将创建一个未初始化数据bufferSize字节的缓冲区.
可以装载任何数量的数据使用(最多到缓冲器的大小)glBufferSubData,glMapBuffer或任何其他例程用于传递数据的.调整缓冲区大小的唯一方法是glBufferData使用新大小调用相同的缓冲区ID(从中返回的值glGenBuffers).
也就是说,您始终可以使用缓冲区中的数据子集(类似于删除顶点),如果使用渲染glDrawElements,则可以随机访问缓冲区中的元素.将顶点添加到缓冲区需要分配更大的缓冲区,然后您需要重新加载缓冲区中的所有数据.
http://www.opengl.org/wiki/GLAPI/glBufferData
glBufferData 为当前绑定到 target? 的缓冲区对象创建一个新的数据存储。任何预先存在的数据存储都将被删除。
这解释了调用glBufferData将“重新分配”数据,缓冲区将具有新大小。所有旧数据都将丢失。如果您只想写入缓冲区的一部分,请glBufferSubData改用。
http://www.opengl.org/wiki/GLAPI/glBufferSubData
编辑:glBufferSubData仅当您要替换数据时;要调整缓冲区大小,您必须调用glBufferData.
此外,您不必先销毁缓冲区并生成一个新缓冲区。请记住,GLuint 只是 OpenGL 的某种“指针”。它不是实际的存储,因此重用相同的“指针”是完全没问题的(当然,如果您还没有删除它)。
| 归档时间: |
|
| 查看次数: |
24281 次 |
| 最近记录: |