如何增加OpenGL缓冲区?

迈克·克莱因(Maik Klein)

是否可以在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绑定点很方便,但不是必需的,因为它们不会干扰任何其他绑定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL的缓冲区如何工作?

来自分类Dev

OpenGL FBO不增加深度缓冲区

来自分类Dev

OpenGL缓冲区问题

来自分类Dev

如何增加OUT参数的缓冲区大小

来自分类Dev

如何为离线文件增加VLC RAM缓冲区?

来自分类Dev

如何增加一个缓冲区?

来自分类Dev

如何同步多线程OpenGL缓冲区访问?

来自分类Dev

OpenGL模板缓冲区,它们的支持程度如何?

来自分类Dev

OpenGL更新缓冲区如何影响速度

来自分类Dev

如何更改opengl中放入顶点缓冲区的值?

来自分类Dev

增加Python的标准缓冲区大小

来自分类Dev

每帧OpenGL彩色缓冲区会增加帧时间

来自分类Dev

每帧OpenGL彩色缓冲区会增加帧时间

来自分类Dev

OpenGL中的缓冲区绘图

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

使用OpenCL获取OpenGL缓冲区

来自分类Dev

OpenGL glMultiDrawElementsIndirect与交错缓冲区

来自分类Dev

OpenGL:glLoadMatrix和深度缓冲区

来自分类Dev

OpenGL帧缓冲区+ LibGDX

来自分类Dev

在openGL中多次绑定缓冲区

来自分类Dev

Java LWGJL opengl缓冲区数据

来自分类Dev

OpenGL 16位模板缓冲区?

来自分类Dev

在OpenGL中查看深度缓冲区

来自分类Dev

OpenGL缓冲区,gLFlush和glutSwapBuffers()

来自分类Dev

OpenGL快速回读缓冲区

来自分类Dev

OpenGL绘制顶点缓冲区对象

来自分类Dev

OpenGL帧缓冲区绑定目标

来自分类Dev

如何在Visual Studio中增加``输出窗口''的缓冲区大小

来自分类Dev

如何增加Spring Sock.js WebSocket服务器实现的输出缓冲区