Рисование VBO с помощью glDrawArrays работает в OpenGL 2.1, но не в OpenGL 3.x - PullRequest
8 голосов
/ 20 июня 2011

Ядро кода (отображается красным прямоугольником):

//bind program, set uniforms, bind vbo
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0);
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
//unbind vbo, unbind program

Когда я переключаю контекст на OpenGL 3.x, этот код перестает работать (я вижу только цвет фона), но когда я инициализирую VAO так же, как код выше, а затем связываю VAO и вызывая glDrawArrays, тогда он работает.

В чем может быть проблема? Как я могу нарисовать VBO без использования VAO?

(шейдеры действительно просты, против матриц с несколькими множителями и ps выводит красный цвет)

1 Ответ

7 голосов
/ 20 июня 2011

Давайте посмотрим в спецификации ядра OpenGL-3:

Раздел 2.10

Первый абзац:

Буферные объекты, которые должны использоваться на стадии вершины GL собраны вместе, чтобы сформировать вершину массив объектов. Все государства, связанные с определение данных, используемых вершиной процессор заключен в вершину массив объектов.

Последний абзац:

Ошибка недопустимой операции генерируется, если какой-либо из * Pointer команды, указывающие местоположение и организация данных массива вершин называется в то время как ноль связан с ARRAY BUFFER привязка объекта буфера точка, и аргумент указателя не NULL³.

А в ³ сноске:

Эта ошибка делает невозможным создание объекта массива вершин, содержащего указатели на клиентские массивы, все еще позволяя буферным объектам быть свободными.

Или другими словами: в OpenGL-3-core вы должны использовать VAO

...