c++ 如果我想调整缓冲区的大小,是否需要glDeleteBuffers/glGenBuffers?

xdnvmnnf  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(131)

首先,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,在某些计算机上,这些点可能会消失...

b91juud3

b91juud31#

glGenBuffers不生成对象,只是生成相应的保留缓冲区对象名。
glBufferData创建并初始化缓冲区对象的数据存储。当创建新的数据存储时,将删除任何预先存在的数据存储。
glDeleteBuffers删除缓冲区对象并使其名称再次未使用。
要回答您的问题,只要不删除glDeleteBuffers的缓冲区,就不需要用glGenBuffers创建新的缓冲区名称。您可以使用现有的缓冲区名称创建具有glBufferData的新缓冲区对象数据存储。如果已经存在数据存储,则将其删除。
但是,您应该尽量不要重新创建数据存储,因为这是一个非常耗时的过程。您应该更喜欢创建具有所需最大大小的数据存储,并使用glBufferSubData仅更新现有数据存储中的数据。更新现有数据存储中的数据比创建全新的数据存储要快。

相关问题