Подтвердить что ты не робот

GlVertexAttribPointer повышение GL_INVALID_OPERATION

Я пытаюсь собрать очень базовое приложение OpenGL 3.2 (основной профиль). В следующем коде, который должен создать VBO, содержащий позиции вершин для треугольника, вызов glVertexAttribPointer завершается с ошибкой и вызывает ошибку OpenGL GL_INVALID_OPERATION. Что это значит и как я могу его исправить?

GLuint vbo, attribLocation = glGetAttribLocation(...);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
GLfloat vertices[] = { 0, 1, 0, 1, 0, 0, -1, 0, 0 };
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(attribLocation);
// At this point, glGetError() returns GL_NO_ERROR.
glVertexAttribPointer(attribLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
// At this point, glGetError() returns GL_INVALID_OPERATION.
4b9b3361

Ответ 1

Во-первых, позвольте получить некоторые предварительные замечания:

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

Прекратите делать это. Вы уже запросили основной контекст OpenGL. Вам не нужна передовая совместимость, и она ничего не делает для вас. Это был старый флаг, когда 3.0 устарели, но не удалили их. Вам это не нужно.

Это не вызывает вашей проблемы. Это:

glEnableVertexAttribArray(program.getAttrib("in_Position"));
// A call to getGLError() at this point prints nothing.
glVertexAttribPointer(program.getAttrib("in_Position"), 3, GL_FLOAT, GL_FALSE, 0, 0);
// A call to getGLError() at this point prints "OpenGL error 1282".

Во-первых, здесь очевидная ошибка драйвера, потому что glEnableVertexAttribArray также должен был выпустить ошибку GL_INVALID_OPERATION. Или вы допустили ошибку, когда вы ее проверили.

Почему обе функции должны ошибаться? Поскольку вы не использовали Объект вершинного массива. glEnableVertexAttribArray устанавливает состояние в текущем VAO. В настоящее время нет VAO, поэтому... ошибка. То же самое касается glVertexAttribPointer. Это даже в списке ошибок для обоих страниц.

Вам не нужен VAO в контексте совместимости, но вы делаете это в основном контексте. Который вы просили. Итак... вам нужно одно:

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

Поместите это где-нибудь в вашу настройку, и ваша программа будет работать.