Ответ 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);
Поместите это где-нибудь в вашу настройку, и ваша программа будет работать.