Как настроить атрибуты вершин в OpenGL?

Я пытаюсь создать VBO для простого прямоугольника. GL настроен на использование основного профиля (GL: 3.2, GLSL: 1.5, внутри NSView в Cocoa).

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

Я адаптировал его под свои нужды и получил следующий код:

GLfloat vertices[] = { 1.0, -1.0, 1.0,
                       1.0,  1.0, 1.0,
                      -1.0,  1.0, -1.0,
                      -1.0, -1.0, -1.0 };
glGenBuffers(1, &vertexVBO);
glBindBuffer(GL_ARRAY_BUFFER, vertexVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*4, vertices, GL_STATIC_DRAW);
glVertexAttribPointer(VERTEX_POS, 3, GL_FLOAT, GL_FALSE, 0, 0); // VERTEX_POS = 0
glEnableVertexAttribArray(VERTEX_POS); // fails

Однако это вызывает ошибку при вызове glEnableVertexAttribArray: INVALID_OPERATION. Документация предполагает, что эта ошибка возникает, если вышеупомянутый вызов сделано между glBegin и glEnd. Это не вариант. Я имею в виду, насколько я знаю, glBegin и glEnd даже не поддерживаются в профиле ядра.

Таким образом, я в убытке. Как я могу нарисовать этот дурацкий прямоугольник (или хотя бы инициализировать его)?


person bastibe    schedule 16.11.2011    source источник


Ответы (1)


Вам необходимо привязать VAO перед установкой указателей атрибутов.

GLuint vao_name;
glGenVertexArrays(1, &vao_name);
glBindVertexArray(vao_name);
// ...
glVertexAttribPointer(...);
glEnableVertexAttribArray(...);

Кроме того, документация, на которую вы ссылаетесь, устарела — вместо этого используйте эту.

person Cat Plus Plus    schedule 16.11.2011
comment
Я думаю, вы сегодня спасли мой рассудок, намекнув на правильную документацию. Благодарю вас! - person bastibe; 16.11.2011