Узнав о 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);
Ваш код не имеет смысла. Вы никогда ничего не связываете с GL_ARRAY_BUFFER
, Так что ваши glVertexAttribPointer()
звонки будут указывать на недействительные VBO — объясняя сбой, когда вы пытаетесь нарисовать эту вещь.
Я не уверен, что вы пытаетесь сделать здесь. Это выглядит как cubeIndex
должен быть массивом элементов для индексированного рендеринга. Но вы, кажется, пытаетесь использовать индексы как атрибуты вершин. Но вы должны использовать это как GL_EMEMENT_ARRAY_BUFFER
(как вы уже делаете) в сочетании с glDrawElements()
(что ты не делаешь). Ваш cubeVBO
должен быть GL_ARRAY_BUFFER
и вы должны использовать это как атрибут вершины.
Размеры вашего массива также кажутся странными. 36 Uints имеют смысл в качестве индексного буфера при рисовании куба с 6 сторонами и 2 треугольниками каждый. Но 21 число с плавающей запятой для данных вершин с 3 компонентами на вектор — всего 7 вершин — странно для куба.
Пожалуйста, посмотрите на Спецификация вершины а также Рендеринг вершин страниц в вики OpenGL, или посмотрите некоторые учебники — код, который вы опубликовали до сих пор, заставляет меня думать, что вы не поняли основополагающих концепций.
Других решений пока нет …