C++/OpenGL — проблемы с VAO

Узнав о VBO, друг посоветовал мне попробовать использовать VAO для связывания индексов куба с вершинами. Я следил за каждым учебником, который мог найти, но безрезультатно. Похоже, буферы привязываются правильно, и все работает до тех пор, пока я не попытаюсь их отрисовать.

Вот как я генерирую VAO -

glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);

glEnableVertexAttribArray(0);

glGenBuffers(1, &cubeIndex);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeIndex);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), cubeIndices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_UNSIGNED_INT, GL_FALSE, sizeof(GLuint)*3, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glEnableVertexAttribArray(1);

glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 21 * sizeof(GLfloat), cubeVertPoints, GL_STATIC_DRAW);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat)*3, 0);

glBindVertexArray(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Рендеринг -

glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, size);//Runtime exception here if anything larger that '2' is provided?

glBindVertexArray(0);

person tcoy    schedule 16.02.2014    source источник


Ответы (1)


Ваш код не имеет смысла. Вы никогда ничего не привязываете к GL_ARRAY_BUFFER, поэтому ваши вызовы glVertexAttribPointer() будут указывать на недопустимые VBO, что объясняет сбой при попытке нарисовать эту вещь.

Я не уверен, что вы пытаетесь сделать здесь. Похоже, что cubeIndex должен быть массивом элементов для индексированного рендеринга. Но вы, похоже, пытаетесь использовать индексы в качестве атрибутов вершин. Но вы должны использовать это как GL_EMEMENT_ARRAY_BUFFER (как вы уже делаете) в сочетании с glDrawElements() (чего вы не делаете). Ваш cubeVBO должен быть GL_ARRAY_BUFFER, и вы должны использовать его как атрибут вершины.

Размеры вашего массива также кажутся странными. 36 Uints имеют смысл в качестве индексного буфера при рисовании куба с 6 сторонами и 2 треугольниками на каждой. Но 21 число с плавающей запятой для данных вершин с 3 компонентами на вектор — это всего лишь 7 вершин — странно для куба.

Ознакомьтесь с спецификацией вершин и Vertex Rendering в вики OpenGL или просмотрите некоторые учебные пособия - код, который вы разместили до сих пор, заставляет меня думать, что вы не поняли основных концепций.

person derhass    schedule 16.02.2014
comment
Нужно ли вызывать glEnableVertexAttribArray(1); вообще? - person tcoy; 17.02.2014
comment
@tcoy: Зависит от атрибута 1. В вашем случае вам, похоже, нужен только один атрибут, который обычно привязывается к индексу 0. - person derhass; 17.02.2014
comment
Я прочитал статьи в вики и справочные страницы OpenGL и исправил свой код. Всякий раз, когда я вызываю glEnableVertexAttribArray(), это вызывает ошибку времени выполнения, однако, когда я удаляю ее, программа запускается, но ничего не рисует - person tcoy; 17.02.2014
comment
@tcoy: Хорошо. Если вы не активируете какой-либо массив, ваши VBO на самом деле не используются. Если он вылетает, когда вы его включаете, ваши указатели атрибутов настроены неправильно. Трудно сказать, что может происходить, не видя фактического кода... - person derhass; 17.02.2014
comment
Спасибо. Оказывается, мне не хватило двух запятых в массиве вершин /facepalm. У меня он сейчас работает, он похож на куб, но мои индексы неверны. - person tcoy; 17.02.2014