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 に答える