我正在尝试整合一个非常基本的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.
答案 0 :(得分:50)
首先,让我们先做一些预备工作:
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中设置状态。目前没有VAO,所以......错误。同样适用于glVertexAttribPointer
。它甚至出现在这些页面上的错误列表中。
在兼容性上下文中不需要VAO,但是在核心上下文中也是如此。你要求的。所以...你需要一个:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
将它放在您的设置中的某个位置,您的程序就能正常运行。