使用glMapBuffer使用一个缓冲区渲染多个对象
Render multiple objects with one buffer using glMapBuffer?
我对缓冲区的概念感到困惑。我了解glBufferData和glBufferSubDatalBufferSubData,可以使用偏移和大小参数将多个模型对象存储在顶点缓冲区和索引缓冲区中。然后在渲染时绑定单个顶点缓冲区,并使用正确的偏移和大小调用glDrawElements来渲染多个对象。
glMapBuffer就是这种情况吗?或者我应该调用glMapBuffer在渲染时链接顶点和索引数据,然后绘制?
GLuint vertexArrayId;
GLuint verticesBufferId;
GLuint indicesBufferId;
void setupBuffers() {
glGenVertexArrays(1, &vertexArrayId);
glBindVertexArray(vertexArrayId);
glGenBuffers(1, &verticesBufferId);
glGenBuffers(1, &indicesBufferId);
glBindBuffer(GL_ARRAY_BUFFER, verticesBufferId);
glBufferData(GL_ARRAY_BUFFER, VERTICES_SIZE, NULL, GL_STATIC_DRAW);
// glMapBuffer stuff here
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBufferId);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, INDICES_SIZE, NULL, GL_STATIC_DRAW);
// glMapBuffer stuff here
}
void render() {
glBindBuffer(GL_ARRAY_BUFFER, verticesBufferId);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)((sizeof(GLfloat) * 0)));
glEnableVertexAttribArray(0);
// glDrawElements stuff here
glDisableVertexAttribArray(0);
// Model, View, Projection transformations here
// glUniformMatrix4fv
}
您可以使用glMapBuffer将数据从ram上传到GPU:
glBindBuffer(GL_ARRAY_BUFFER, verticesBufferId);
void *data = glMapBuffer( GL_ARRAY_BUFFER, ... );
// copy vertex data from instance
::memcpy( data, vertices, vertexSize );
...
glUnmapBuffer( ... );
例如,当您想要从模型上传顶点和索引数据时。您可以像使用原始指针一样使用glMapBuffer返回的指针(只是为了方便)
请记住:glMapBuffer速度不快,因此尽量避免在渲染循环中使用它。调用glUnMap后,数据将被传输到GPU。
当你必须像使用统一块一样定期将数据从CPU上传到GPU时,有更好的方法。我发现了这篇博客文章,其中很好地解释了映射(及其所有缺点):OpenGL 中的映射
相关文章:
- Opengl 3/4 : 我可以将相同的缓冲区对象绑定到不同的目标吗?
- 使用 OpengGLES2(角度)从帧缓冲区对象读取
- 如何将统一缓冲区对象数组加载到着色器中?
- 将矩阵建模为单个统一缓冲区对象
- 如何使用 new 和 delete 与 OpenGL 的缓冲区对象一起使用?
- OpenGL:缓冲区对象/着色器超出范围
- 为什么我的顶点缓冲区对象出现访问冲突错误?
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 在缓冲区对象上运行并通过着色器更改其数据?
- 使用统一缓冲区对象进行批处理渲染
- 为什么我的 openGL 顶点缓冲区对象不会绘制任何内容?
- 通过帧缓冲区对象渲染到纹理
- 使用索引缓冲区对象时出现奇怪的分段错误
- 帧缓冲区对象错误
- 为什么在调用 glDrawArray 之前不需要绑定顶点缓冲区对象?
- 通过统一缓冲区对象发送到 GLSL 的数据会泄漏到其他绘制调用中 (OpenGL 3.2)
- Boost.Asio如何创建一个大小等于数组大小的缓冲区对象
- 动态打包 OpenGL 顶点缓冲区对象的数据
- Opengl 通过使用顶点缓冲区对象