美文网首页
高级数据

高级数据

作者: 不决书 | 来源:发表于2023-09-18 06:43 被阅读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));
    

    相关文章

      网友评论

          本文标题:高级数据

          本文链接:https://www.haomeiwen.com/subject/gfqgvdtx.html