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

VAO/VBO management - change all VBO data

本文关键字:VBO 数据 管理 VAO      更新时间:2023-10-16

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

我打算经常更改这些vbo中的所有数据,大约从500ms到20ms的更新频率。下载到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管理有问题吗?

我找到问题了

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