Несколько объектов Vertex Array: правильный способ отображения нескольких примитивов?

Мне трудно получить несколько объектов массива вершин для рендеринга нескольких примитивов. Почти все учебные пособия по 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));

}

Код рендеринга:

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

Я попытался прочитать данные из буферов перед рендерингом (они различны и того, что я ожидал бы для каждого примитива), поэтому я знаю, что запись произошла правильно. Я предполагаю, что теперь я могу неправильно связать буферы или пропустить шаг при рендеринге.

0 ответов

Другие вопросы по тегам