C++ 多顶点阵列对象:显示多个基本体的正确方法?

C++ 多顶点阵列对象:显示多个基本体的正确方法?,c++,qt,opengl,opengl-4,qtopengl,C++,Qt,Opengl,Opengl 4,Qtopengl,我很难让多个顶点数组对象渲染多个基本体。我在网上找到的几乎所有OpenGL教程都只使用一个VAO,所以我不确定我可能做错了什么 我正在使用Qt OpenGL并尝试渲染一个正方形和一个立方体(在多个VAO上) 使用下面的代码,我只在屏幕上显示一个原语(以第二个原语为准)。当我关闭另一个原语的初始化时,我可以看到其中一个原语,但不能同时看到 数据结构: struct VBO : public QOpenGLBuffer { }; struct VAO : public QOpenGLVertex

我很难让多个顶点数组对象渲染多个基本体。我在网上找到的几乎所有OpenGL教程都只使用一个VAO,所以我不确定我可能做错了什么

我正在使用Qt OpenGL并尝试渲染一个正方形和一个立方体(在多个VAO上)

使用下面的代码,我只在屏幕上显示一个原语(以第二个原语为准)。当我关闭另一个原语的初始化时,我可以看到其中一个原语,但不能同时看到

数据结构:

struct VBO : public QOpenGLBuffer {

};

struct VAO : public QOpenGLVertexArrayObject {
  VBO vbo[1];
};
enum { CIRCLE, RECT, NUM_VAOs };
enum { POS, NUM_VBOs };

VAO vao[NUM_VAOs];
初始化:

static void init_objects() {
  for(int i = 0; i < NUM_VAOs; ++i) {
    vao[i].create();
  }

  vao[CIRCLE].bind();

  for(int i = 0; i < NUM_VBOs; ++i) {
    vao[CIRCLE].vbo[i].create();
    vao[CIRCLE].vbo[i].setUsagePattern( QOpenGLBuffer::StaticDraw );
  }

  vao[CIRCLE].vbo[POS].bind();

  vao[CIRCLE].vbo[POS].allocate(circle.getVertexData(), circle.getNumVertices()*3*sizeof(float));

  vao[CIRCLE].release();

  // repeat for RECTANGLE instead of CIRCLE

  vao[RECT].bind();

  for(int i = 0; i < NUM_VBOs; ++i) {
    vao[RECT].vbo[i].create();
    vao[RECT].vbo[i].setUsagePattern( QOpenGLBuffer::StaticDraw );
  }

  vao[RECT].vbo[POS].bind();

  vao[RECT].vbo[POS].allocate(circle.getVertexData(), circle.getNumVertices()*3*sizeof(float));

}

在渲染之前,我尝试从缓冲区读取数据(它们是不同的,并且是我对每个原语的预期),因此我知道写操作是正确的。我猜现在可能是绑定缓冲区错误,或者渲染时遗漏了一个步骤。

在哪里设置顶点属性?对于纯OpenGL,这将是像
glVertexAttribPointer()
glEnableVertexAttribArray()
这样的调用。不确定这是否以某种方式包装在Qt中。我怀疑您的问题可能与最近的问题类似:。您是对的,这就是问题所在。我只为这对VAO设置了一次。非常感谢。
void game::paintGL() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  vao[RECT].bind();
  vao[RECT].vbo[POS].bind();

  QMatrix4x4 id;
  Game.setMVP( id );

  Game.setColor( Colour(0.0, 1.0, 0.0) );

  glDrawElements(GL_TRIANGLES, rect.getSolidIndices().size()*sizeof(unsigned int),
    GL_UNSIGNED_INT, &(rect.getSolidIndices()[0]));

  glFinish();

  vao[RECT].release();

  // Now for circle:
  vao[CIRCLE].bind();
  vao[CIRCLE].vbo[POS].bind();

  Game.setMVP( id );

  Game.setColor( Colour(1.0, 0.0, 0.0) );

  glDrawElements(GL_TRIANGLES, circle.getSolidIndices().size()*sizeof(unsigned int),
    GL_UNSIGNED_INT, &(circle.getSolidIndices()[0]));
  glFlush();
}