VAO / VBO管理 - 更改所有VBO数据

时间:2014-06-18 10:50:02

标签: c++ opengl vbo vao

我有一个带有3个VBO的VAO,包含一个带有顶点,法线和纹理坐标的模型。

我打算经常更改这些VBO中的所有数据,大致从500毫秒更新到20毫秒更新频率。下载到VBO的新模型可以具有比前一个更少或更多的三角形。所以缓冲区大小也会改变。

我不是OpenGL的专家,所以如果可能的话,我想了解如何改进我的代码。 目前,该计划实施如下:

glBindVertexArray(*vao);

if (mesh->HasPositions()) {
    glBindBuffer(GL_ARRAY_BUFFER, vbo_pos);
    glBufferData(
        GL_ARRAY_BUFFER,
        3 * *point_count * sizeof (GLfloat),
        points,
        GL_DYNAMIC_DRAW
        );
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(0);
    free(points); // free our temporary memory
}
if (mesh->HasNormals()) {
    glBindBuffer(GL_ARRAY_BUFFER, vbo_norm);
    glBufferData(
        GL_ARRAY_BUFFER,
        3 * *point_count * sizeof (GLfloat),
        normals,
        GL_DYNAMIC_DRAW
        );
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(2);
    free(normals); // free our temporary memory
}
if (mesh->HasTextureCoords(0)) {
    glBindBuffer(GL_ARRAY_BUFFER, vbo_tex);
    glBufferData(
        GL_ARRAY_BUFFER,
        2 * *point_count * sizeof (GLfloat),
        texcoords,
        GL_DYNAMIC_DRAW
        );
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, NULL);
    glEnableVertexAttribArray(1);
    free(texcoords); // free our temporary memory
}

编辑:

这个当前的解决方案存在绘图不是应该的问题。

如果我的第一个模型是一个大型(50Mb)而我加载另一个较小的模型(25Mb),那么仍然会绘制前一个模型的一部分。

如果第一个模型是小模型(25Mb),然后我将其更改为大模型(50Mb),则不会更改图形(或者至少它似乎没有变化)。如果我在更小的一个(216kb)之后充电,则图形会发生变化(但仍有一部分存在)。

所以我认为我的VBO管理存在问题?

1 个答案:

答案 0 :(得分:0)

好的,我发现了这个问题

我正在更新线程中的vbo数据。我不知道它不起作用:/