OpenGL向VBO添加更多数据

时间:2013-06-29 05:23:24

标签: opengl vbo

是否可以在不吹走旧内容的情况下向VBO添加更多数据。基本上有一种方法可以在保留旧内容的同时调整VBO的大小吗?

例如,假设我在VBO中交错了一些颜色(CrCgCb)和位置(PxPy)数据以使用两个三角形来表示正方形,这样VBO中的内存的抽象表示看起来像:

 [P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b]

现在有些事件发生了,突然间又出现了另一个方块,我想将它放在同一个VBO中,以便数据现在看起来像:

[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b,P7x,P7y,C7r,C7g,C7b,P8x,P8y,C8r,C8g,C8b,P9x,P9y,C9r,C9g,C9b,P10x,P10y,C10r,C10g,C10b,P11x,P11y,C11r,C11g,C11b,P12x,P12y,C12r,C12g,C12b]

要放置第一批数据,我会这样做:

  GLuint vbo;
  glGenBuffers(1, &vbo);
  float verticies[6 * 2 + 6 * 3] = ...;
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);

现在要获得第二个方格,我通常会做如下的事情:

  glDeleteBuffers(1, &vbo);
  glGenBuffers(1, &vbo);
  float verticies[12 * 2 + 12 * 3] = ...;
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);

如何在不拨打glDeleteBuffers()的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

您正在寻找glBufferSubData。这不能调整缓冲区的大小,但可以更改现有缓冲区中的数据。只需确保您的缓冲区从一开始就足够大。一个常见的模式是使用BufferData初始化缓冲区和指向特定大小的空指针,然后使用BufferSubData仅更改部分缓冲区。