高级数据

2023-09-18  本文已影响0人  不决书

分批顶点属性

glBufferSubData: 我们也可以使用glBufferSubData,填充缓冲的特定区域。这个函数需要一个缓冲目标、一个偏移量、数据的大小和数据本身作为它的参数。这个函数不同的地方在于,我们可以提供一个偏移量,指定从何处开始填充这个缓冲。这能够让我们插入或者更新缓冲内存的某一部分。要注意的是,缓冲需要有足够的已分配内存,所以对一个缓冲调用glBufferSubData之前必须要先调用glBufferData。

  glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); // 范围: [24, 24 + sizeof(data)]

glMapBufferglUnmapBuffer: 通过调用glMapBuffer函数,OpenGL会返回当前绑定缓冲的内存指针,供我们操作,使用glUnmapBuffer函数,告诉OpenGL我们已经完成指针操作之后,OpenGL就会知道你已经完成了。在解除映射(Unmapping)之后,指针将会不再可用,并且如果OpenGL能够成功将您的数据映射到缓冲中,这个函数将会返回GL_TRUE。

  float data[] = {
  0.5f, 1.0f, -0.35f
  ...
  };
  glBindBuffer(GL_ARRAY_BUFFER, buffer);
  // 获取指针
  void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
  // 复制数据到内存
  memcpy(ptr, data, sizeof(data));
  // 记得告诉OpenGL我们不再需要这个指针了
  glUnmapBuffer(GL_ARRAY_BUFFER);

复制缓存

glCopyBufferSubData:能够让我们相对容易地从一个缓冲中复制数据到另一个缓冲中。这个函数的原型如下:

  void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset,
                         GLintptr writeoffset, GLsizeiptr size);

readtargetwritetarget参数需要填入复制源和复制目标的缓冲目标。比如说,我们可以将VERTEX_ARRAY_BUFFER缓冲复制到VERTEX_ELEMENT_ARRAY_BUFFER缓冲,分别将这些缓冲目标设置为读和写的目标。当前绑定到这些缓冲目标的缓冲将会被影响到。
面这个例子展示了如何复制两个顶点数组缓冲:

  float vertexData[] = { ... };
  glBindBuffer(GL_COPY_READ_BUFFER, vbo1);
  glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
  glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0,   
  sizeof(vertexData));
  float vertexData[] = { ... };
  glBindBuffer(GL_ARRAY_BUFFER, vbo1);
  glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
  glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));
上一篇 下一篇

猜你喜欢

热点阅读