Я пытаюсь собрать очень простое приложение 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.
Во-первых, давайте уберем некоторые предварительные замечания:
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
ошибка. Или вы сделали ошибку, когда проверили это.
Почему обе функции должны быть ошибочными? Потому что вы не использовали Vertex Array Object. glEnableVertexAttribArray
устанавливает состояние в текущем ВАО. Там нет текущего VAO, так что … ошибка. То же самое касается glVertexAttribPointer
. Это даже в списке ошибок для обоих на этих страницах.
Вам не нужен VAO в контексте совместимости, но вы делаете это в основном контексте. Который вы просили. Итак … вам нужен один:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
Поместите это где-нибудь в настройках, и ваша программа будет работать.
Других решений пока нет …