绘制多个立方体时 glGenVertexArrays 和 glGenVertexBuffers 出现问题
Issue with glGenVertexArrays and glGenVertexBuffers when drawing several cubes
我写了一个小程序,应该用 OpenGL 4.3 显示几个立方体。我使用 SDL 2.0 创建上下文,但我认为我的问题不在于此。
我有一个 class Cube
,它有几个属性,包括顶点数组的 GLuint m_vao
和顶点缓冲区的 GLuint m_vbo
。
为了显示多个立方体,我创建了多个具有不同坐标的 class 实例。我在 Cube
的构造函数中使用 glGenVertexArrays(1, &m_vao)
和 glGenBuffers(1, &m_vbo)
。
我在创建这样的多维数据集时没有问题:
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_vao
和 m_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);
}
}
我的 vector
中的所有立方体都具有相同的 m_vao
和 m_vbo
属性,在本例中它们都具有 1 作为 m_vao
和 m_vbo
.如果我在手动创建立方体 c、c2、c3 和 c4 之后执行此操作,它们都会得到 4。
当然,由于都是用同一个VBO,所以坐标都一样,最后只出现一个立方体
所以我的问题是:手动创建多维数据集(效果很好)和在 std::vector
中使用 for
循环创建它们(生成相同的 VAO 和 VBO)之间有什么不同所有的立方体)?
我假设您在析构函数中调用了 glDeleteBuffers?将临时立方体推入向量时,temp::~Cube() 会在 temp 脱离上下文时调用,从而释放缓冲区。下一个立方体将获得已经释放的 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
}
我写了一个小程序,应该用 OpenGL 4.3 显示几个立方体。我使用 SDL 2.0 创建上下文,但我认为我的问题不在于此。
我有一个 class Cube
,它有几个属性,包括顶点数组的 GLuint m_vao
和顶点缓冲区的 GLuint m_vbo
。
为了显示多个立方体,我创建了多个具有不同坐标的 class 实例。我在 Cube
的构造函数中使用 glGenVertexArrays(1, &m_vao)
和 glGenBuffers(1, &m_vbo)
。
我在创建这样的多维数据集时没有问题:
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_vao
和 m_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);
}
}
我的 vector
中的所有立方体都具有相同的 m_vao
和 m_vbo
属性,在本例中它们都具有 1 作为 m_vao
和 m_vbo
.如果我在手动创建立方体 c、c2、c3 和 c4 之后执行此操作,它们都会得到 4。
当然,由于都是用同一个VBO,所以坐标都一样,最后只出现一个立方体
所以我的问题是:手动创建多维数据集(效果很好)和在 std::vector
中使用 for
循环创建它们(生成相同的 VAO 和 VBO)之间有什么不同所有的立方体)?
我假设您在析构函数中调用了 glDeleteBuffers?将临时立方体推入向量时,temp::~Cube() 会在 temp 脱离上下文时调用,从而释放缓冲区。下一个立方体将获得已经释放的 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
}