在我的代码中,我有一个 Mesh 类,它是基本 VAO 和 VBO 功能的包装器。它的构造函数接受一个顶点和索引数组,并有一个 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 复制到另一个。或者我必须重新调用所有 glVertexAttribPointer() 等函数以获得新的 VAO。