頂点、法線、テクスチャ座標を持つモデルを含む、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管理に何か問題があるのでしょうか?