我如何增加缓冲区 OpenGL?
How do I grow a buffer OpenGL?
是否可以在 OpenGL 中增加缓冲区?
假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。
在这种情况下,我有一个包含 3 个浮点数的缓冲区
std::vector<GLfloat> offsets = {0.0f,0.5f,1.0f};
auto offset_buffer = buffer::makeBuffer(BufferDraw::STATIC_DRAW, offsets);
如果我想有 4 个元素怎么办?我必须调用更大尺寸的 glBufferData 吗?但是旧数据会发生什么,它会被复制吗?或者我是否必须完全删除缓冲区并创建一个新缓冲区?
您绝对不会用新尺寸调用 glBufferData (...)
来执行此操作。这将孤立旧缓冲区并为您提供一个具有更大存储空间的新缓冲区(其内容与之前分配的内存无关)。
只要之前需要旧数据的任何 OpenGL 命令仍在管道中排队,旧数据就会继续存在。这些命令完成后,OpenGL 允许回收内存 - 您不必担心泄漏,但就地增长不会自动发生。
GL 3.1 引入了复制缓冲区的概念,这将帮助您更有效地执行此操作。
考虑以下伪代码:
// Bind the old buffer to `GL_COPY_READ_BUFFER`
glBindBuffer (GL_COPY_READ_BUFFER, old_buffer);
// Allocate data for a new buffer
glGenBuffers (1, &new_buffer);
glBindBuffer (GL_COPY_WRITE_BUFFER, new_buffer);
glBufferData (GL_COPY_WRITE_BUFFER, ...);
// Copy `old_buffer_size`-bytes of data from `GL_COPY_READ_BUFFER`
// to `GL_COPY_WRITE_BUFFER` beginning at 0.
glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, old_buffer_size);
在实际情况下,您可以将缓冲区数据从任何绑定位置复制到任何其他绑定位置。新的 GL_COPY_..._BUFFER
绑定点很方便,但不是必需的,因为它们不会干扰任何其他绑定。
是否可以在 OpenGL 中增加缓冲区?
假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。
在这种情况下,我有一个包含 3 个浮点数的缓冲区
std::vector<GLfloat> offsets = {0.0f,0.5f,1.0f};
auto offset_buffer = buffer::makeBuffer(BufferDraw::STATIC_DRAW, offsets);
如果我想有 4 个元素怎么办?我必须调用更大尺寸的 glBufferData 吗?但是旧数据会发生什么,它会被复制吗?或者我是否必须完全删除缓冲区并创建一个新缓冲区?
您绝对不会用新尺寸调用 glBufferData (...)
来执行此操作。这将孤立旧缓冲区并为您提供一个具有更大存储空间的新缓冲区(其内容与之前分配的内存无关)。
只要之前需要旧数据的任何 OpenGL 命令仍在管道中排队,旧数据就会继续存在。这些命令完成后,OpenGL 允许回收内存 - 您不必担心泄漏,但就地增长不会自动发生。
GL 3.1 引入了复制缓冲区的概念,这将帮助您更有效地执行此操作。
考虑以下伪代码:
// Bind the old buffer to `GL_COPY_READ_BUFFER`
glBindBuffer (GL_COPY_READ_BUFFER, old_buffer);
// Allocate data for a new buffer
glGenBuffers (1, &new_buffer);
glBindBuffer (GL_COPY_WRITE_BUFFER, new_buffer);
glBufferData (GL_COPY_WRITE_BUFFER, ...);
// Copy `old_buffer_size`-bytes of data from `GL_COPY_READ_BUFFER`
// to `GL_COPY_WRITE_BUFFER` beginning at 0.
glCopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, old_buffer_size);
在实际情况下,您可以将缓冲区数据从任何绑定位置复制到任何其他绑定位置。新的 GL_COPY_..._BUFFER
绑定点很方便,但不是必需的,因为它们不会干扰任何其他绑定。