OpenGL学习21——数据操作

2021-07-22  本文已影响0人  蓬篙人
// 范围:[24, 24 + sizeof(data)]
glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data);
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);

1. 批处理顶点属性

float positions[] = { ... };
float normals[] = { ... };
float tex[] = { ... };
// 填充缓冲区
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(position), &positions);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(position), sizeof(normals), &normals);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(position) + sizeof(normals), sizeof(tex), &tex);

// 更新顶点属性指针以反应内存布局
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions)));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) + sizeof(normals)));

2. 拷贝缓冲区

glCopyBufferSubData(
   GLenum readTarget,     // 源缓冲区目标,如VERTEX_ARRAY_BUFFER
   GLenum writeTarget,    // 目标缓冲区目标,如VERTEX_ELEMENT_ARRAY_BUFFER
   GLintptr readoffset,
   GLintptr writeoffset,
   GLsizeiptr size
);
glBindBuffer(GL_COPY_READ_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 8 * sizeof(float));
float vertexData[] = { ... };
glBindBuffer(GL_ARRAY_BUFFER, vbo1);
glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2);
glCopyBufferSubData(GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, 8 * sizeof(float));
上一篇下一篇

猜你喜欢

热点阅读