绘制多个立方体时,glGenVertexArrays和glGenVertexBuffers会出现问题

时间:2015-08-18 15:06:33

标签: c++ opengl 3d vertex-array-object

我写了一个小程序,应该用OpenGL 4.3显示几个多维数据集。我使用SDL 2.0来创建一个上下文,但我不认为我的问题来自那里。

我有一个类Cube,它有几个属性,包括顶点数组的GLuint m_vao和顶点缓冲区的GLuint m_vbo

要显示多个立方体,我使用不同的坐标创建此类的多个实例。我在glGenVertexArrays(1, &m_vao)的构造函数中使用glGenBuffers(1, &m_vbo)Cube

创建像这样的立方体时没有问题:

Cube c(-4, 0, -4, "texture.jpg");
Cube c2(4, 0, 2, "texture.jpg");
Cube c3(2, 1, 2, "texture.jpg");
Cube c4(-2, 1, 2, "texture.jpg");

这会创建四个具有唯一m_vaom_vbo属性的多维数据集(c表示1,c2表示2,c3表示3,c4表示4)。

然而,当我像这样创建我的立方体时:

std::vector<std::vector<Cube>> cubes;
for (int i = 0; i < 9; i++) {
    cubes.push_back(std::vector<Cube>());
    for (int j = 0; j < 9; j++) {
        Cube temp = Cube(i, 0, j, "texture.jpg");
        cubes[i].push_back(temp);
    }
}

vector中的所有多维数据集都具有相同的m_vaom_vbo属性,在这种情况下,它们都有m_vaom_vbo。如果我在手动创建立方体c,c2,c3和c4之后这样做,它们都会得到4。 当然,由于它们都使用相同的VBO,它们都具有相同的坐标,最后只出现一个立方体。

所以我的问题是:手动创建多维数据集(工作正常)和在带有std::vector循环的for内创建多维数据集之间有什么不同(它为所有人生成相同的VAO和VBO)立方体) ?

1 个答案:

答案 0 :(得分:1)

我假设你在析构函数中调用glDeleteBuffers?将临时立方体推入向量时,当temp离开上下文时会调用temp :: ~Cube(),从而释放缓冲区。然后,下一个多维数据集将获得已释放的id。

for (int j = 0; j < 9; j++)
{

    // Calls Cube(...)
    Cube temp = Cube(i, 0, j, "texture.jpg");

    // Copies or movies temp into the vector
    // In cases where cubes has to resize, also Cube::~Cube() is called
    cubes[i].push_back(temp);

    // temp goes here out of scope so temp::~Cube() is called
}