Как сделать так, чтобы этот простой код OpenGL (работает в "мягком" профиле 3.3 и 4.2) работал в строгом профиле 3.2 и 4.2 core?


У меня был некоторый 3D-код, который, как я заметил, не будет отображаться в строгом профайле ядра, но прекрасно в "нормальном" (явно не запрашиваемом только как ядро) контексте профиля. Чтобы изолировать проблему, я написал самую маленькую простейшую возможную программу OpenGL, рисуя только треугольник и прямоугольник:

Введите описание изображения здесь

Я разместил эту программу OpenGL в качестве сути здесь.

С переменной useStrictCoreProfile , установленной в false, программа не выводит сообщений об ошибках в консоль и рисует четырехугольник и треугольник согласно приведенному выше скриншоту, как на Intel HD OpenGL 3.3, так и на GeForce с OpenGL 4.2.

Однако , С useStrictCoreProfile , установленным в true, он очищает цвет фона, но не рисует tri & quad, вывод консоли таков:

GLCONN: OpenGL 3.2.0 @ NVIDIA Corporation GeForce GT 640M LE/PCIe/SSE2 (GLSL: 1.50 NVIDIA via Cg compiler)
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.VertexAttribPointer()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step 'render.DrawArrays()': GL_INVALID_OPERATION
LASTERR: OpenGL error at step '(post loop)': GL_INVALID_OPERATION
EXIT

... если вместо 3.2 запрашивается профиль строгого ядра 4.2, то возникает та же проблема. Применяется к 3 различным графическим процессорам nvidia, поэтому я предполагаю, что я не соответствую строгому профилю ядра должным образом. Что я сделал не так, и как я могу это исправить?

Обратите внимание, что вы не найдете вызовglEnableVertexAttribArray в приведенном выше Gist, так как онвнутри пакета glutil , который я импортирую, но он вызывается как последний шаг в функции gistcompileShaders () .

1 7

1 ответ:

Вы не создаете/связываете Объект массива вершин с glGenVertexArrays() и glBindVertexArray(). VAOs инкапсулируют набор состояний атрибутов вершин, включая то, какие атрибуты включены, подробную информацию о каждом атрибуте и т. д. Они были необязательными, когда функция была первоначально введена, но теперь они требуются в строгих контекстах / core в соответствии с разделом 10.4 спецификации ядра OpenGL :

Операция INVALID_OPERATION ошибка генерируется любыми командами, которые изменять, извлекать из или запрашивать состояние массива вершин, когда ни один массив вершин не связан. Это происходит в начальном состоянии GL и может произойти в результате BindVertexArray или побочного эффекта Deletevertexarray.

Вот очень грубый пример того, как используются VAOs:

// At initialization time:
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
// Set up your vertex attribute state:
//  - glBindBuffer(GL_ARRAY_BUFFER,...);
//  - glEnableVertexAttribArray(...);
//  - glVertexAttribPointer(...);
//  - etc. -- Refer to OpenGL docs to see what is/isn't included in the VAO!
glBindVertexArray(0); // unbinds vao

// At draw time:
glBindVertexArray(vao); // automatically sets up previously-bound vertex attribute state
glDrawArrays(...);
glBindVertexArray(0); // unbinds vao