0

我有一个带有 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 管理有问题吗?

4

1 回答 1

0

好的,我发现了问题

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

于 2014-06-19T07:12:54.207 回答