34

我正在尝试组合一个非常基本的 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.
4

1 回答 1

62

首先,让我们先做一些准备工作:

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 ObjectglEnableVertexAttribArray在当前 VAO 中设置状态。没有当前的 VAO,所以......错误。也一样glVertexAttribPointer。它甚至在这些页面上的错误列表中。

在兼容性上下文中不需要 VAO,但在核心上下文中需要。你要求的。所以......你需要一个:

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

把它放在你的设置中的某个地方,你的程序就会工作。

于 2012-11-15T20:00:41.577 回答