在我的代码中,我有一个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复制到另一个VAO。或者我必须为新的VAO重新调用所有glVertexAttribPointer()等函数。
答案 0 :(得分:2)
您是否有理由将网格物体用作实际的可绘制类型?
通常,网格/三角形汤将是共享资源,您可以使用模型/对象将它们实例化以进行绘制。当您实例化需要特定网格的模型/对象时,您将增加引用计数并存储指针 - 这是坚果壳中的资源管理101.
按照你的意愿调用它们,我认为你没有正确区分存储数据的位置和渲染数据所需的界面。您不应该为对象的每个实例都需要VAO,并且只有在没有任何内容引用顶点数据时才会删除VAO / VBO。