首先,VBO初始化如下:
GLuint vertex_buffer;
glGenBuffers(1, &vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, data_size_in_bytes, data_vertices, GL_STATIC_DRAW);
data_vertices
存储一些点数据,然后我将另一个点推回其中,data_vertices
将调整大小(更大)。
如果需要再次调用glDeleteBuffers
/glGenBuffers
,还是只调用glBindBuffer
新数据?
GLuint vertex_buffer;
glDeleteBuffers(1, &vertex_buffer); // is this necessary?
glGenBuffers(1, &vertex_buffer); // is this necessary?
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glBufferData(GL_ARRAY_BUFFER, new_data_size_in_bytes, new_data_vertices, GL_STATIC_DRAW);
现在我没有在每个更新帧中都调用glDeleteBuffers
/glGenBuffers
,在某些计算机上,这些点可能会消失...
1条答案
按热度按时间b91juud31#
glGenBuffers
不生成对象,只是生成相应的保留缓冲区对象名。glBufferData
创建并初始化缓冲区对象的数据存储。当创建新的数据存储时,将删除任何预先存在的数据存储。glDeleteBuffers
删除缓冲区对象并使其名称再次未使用。要回答您的问题,只要不删除
glDeleteBuffers
的缓冲区,就不需要用glGenBuffers
创建新的缓冲区名称。您可以使用现有的缓冲区名称创建具有glBufferData
的新缓冲区对象数据存储。如果已经存在数据存储,则将其删除。但是,您应该尽量不要重新创建数据存储,因为这是一个非常耗时的过程。您应该更喜欢创建具有所需最大大小的数据存储,并使用
glBufferSubData
仅更新现有数据存储中的数据。更新现有数据存储中的数据比创建全新的数据存储要快。