1

私のコードには、基本的な 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() などの関数を再呼び出しする必要があります。

4

1 に答える 1