1

在我的代码中,我有一个 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。

4

1 回答 1

2

您使用网格作为实际的可绘制类型是否有原因?

通常,网格/三角形汤将是共享资源,您将实例化它们以使用模型/对象进行绘图。当您实例化需要特定网格的模型/对象时,您将增加引用计数并存储指针 - 这就是资源管理 101 的简而言之。

随便称呼他们,我认为您没有正确区分数据的存储位置和呈现数据所需的界面。您不应该为对象的每个实例都需要一个 VAO,并且只有在不再引用顶点数据时才应该删除 VAO/VBO。

于 2013-09-12T22:30:58.343 回答