1

我写了一个小程序,它应该用 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属性的立方体(1 个用于 c,2 个用于 c2,3 个用于 c3,4 个用于 c4)。

但是,当我像这样创建我的多维数据集时:

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);
    }
}

my 中的所有立方体vector都具有相同的m_vaom_vbo属性,在这种情况下,它们都具有 1m_vaom_vbo。如果我在手动创建立方体 c、c2、c3 和 c4 后执行此操作,它们都会得到 4。当然,由于它们都使用相同的 VBO,它们都具有相同的坐标,最后只出现了一个立方体。

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

4

1 回答 1

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
} 
于 2015-08-18T15:15:07.250 回答