glVertexAttribPointer raising GL_INVALID_OPERATION

守給你的承諾、 提交于 2019-12-03 09:26:57

First, let's get some preliminaries out of the way:

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);

Stop doing this. You already asked for a core OpenGL context. You don't need forward compatibility, and it does nothing for you. This was an old flag when 3.0 had deprecated things but didn't remove them. You don't need it.

That's not causing your problem, though. This is:

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".

First, there's an obvious driver bug here, because glEnableVertexAttribArray should also have issued a GL_INVALID_OPERATION error. Or you made a mistake when you checked it.

Why should both functions error? Because you didn't use a Vertex Array Object. glEnableVertexAttribArray sets state in the current VAO. There is no current VAO, so... error. Same goes for glVertexAttribPointer. It's even in the list of errors for both on those pages.

You don't need a VAO in a compatibility context, but you do in a core context. Which you asked for. So... you need one:

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

Put that somewhere in your setup and your program will work.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!