gpt4 book ai didi

c++ - 使用 glMapBuffer 用一个缓冲区渲染多个对象?

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:51 25 4
gpt4 key购买 nike

我对缓冲区的概念感到困惑。我了解 glBufferDataglBufferSubData 的基础知识。在主循环中的渲染函数之前使用 glBufferSubData,您可以使用 offsetsize 参数将多个模型对象存储在顶点缓冲区和索引缓冲区。然后在渲染时绑定(bind)单个顶点缓冲区并使用正确的偏移量和大小调用 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( ... );

例如,当您要从模型上传顶点和索引数据时。您可以像原始 c 指针一样使用从 glMapBuffer 返回的指针(只是为了方便)

请记住:glMapBuffer 并不快,所以尽量避免在渲染循环中使用它。调用 glUnMap 后,数据将传输到 GPU。

当您必须定期将数据从 CPU 上传到 GPU 时,有很多更好的方法,例如使用 Uniform-Blocks。我找到了这篇博文,其中对映射的解释非常好(具有所有缺点):Mapping in OpenGL

关于c++ - 使用 glMapBuffer 用一个缓冲区渲染多个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36469450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com