【问题标题】:Issue with glGenVertexArrays and glGenVertexBuffers when drawing several cubes绘制多个立方体时出现 glGenVertexArrays 和 glGenVertexBuffers 的问题
【发布时间】:2015-11-11 14:36:24
【问题描述】:

我编写了一个小程序,它应该使用 OpenGL 4.3 显示多个立方体。我使用 SDL 2.0 创建上下文,但我不认为我的问题来自那里。

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

为了显示几个立方体,我用不同的坐标创建了这个类的几个实例。我在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_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);
    }
}

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

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

【问题讨论】:

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


【解决方案1】:

我假设您在析构函数中调用 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
} 

【讨论】:

  • 感谢您的回答。我确实在析构函数中调用 glDeleteBuffers 。但是,我之前尝试过不使用 temp 变量并将新立方体直接推入向量中。它仍然无法正常工作。这也是范围的问题吗?
  • 是的。临时变量是否有名称并不重要。当它在范围内创建时,它将在超出范围时被销毁。 @RetoKoradi 的回答对如何处理这种情况有更多解释。
  • 谢谢。我查看了@RetoKoradi 链接,它有我正在寻找的答案。
猜你喜欢
  • 2021-03-06
  • 1970-01-01
  • 2020-04-15
  • 2011-03-15
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多