私のコードには、基本的な VAO および VBO 機能のラッパーである Mesh クラスがあります。そのコンストラクターは、頂点とインデックスの配列を取り、draw() 関数を持っています。
インスタンス化中に glGen* 関数を呼び出し、デストラクタで glDelete* 関数を呼び出します。
明らかに、これは割り当て/コピーの構築中に問題を残します:
Mesh A;
{
Mesh B( myVerts, myIndices );
A = B;
A.draw(); // this works because the VAO and VBOs of B are still around
}
A.draw(); // fails because the destructor of B calls glDelete
これを改善するために、代入およびコピー コンストラクターで、glMapBuffer を使用して VBO データを再バッファーします。
Mesh& Mesh::operator = ( const Mesh &otherMesh )
{
glGenBuffers( 1, &_vertexBufferObject );
otherMesh.bind();
void *data = glMapBuffer( GL_ARRAY_BUFFER, GL_READ_WRITE );
bind();
glBufferData(GL_ARRAY_BUFFER, _numBytes, data, GL_STREAM_DRAW);
otherMesh.bind();
glUnmapBuffer(GL_ARRAY_BUFFER);
}
VAO の状態をある VAO から別の VAO にコピーする方法はありますか。または、新鮮な VAO のためにすべての glVertexAttribPointer() などの関数を再呼び出しする必要があります。