我正在尝试将一个非常基本的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中的状态。目前没有VAO,所以...错误。 glVertexAttribPointer 也是如此。甚至在这些页面的错误列表中。

在兼容性上下文中不需要VAO,但在核心上下文中则需要。你要的。所以...您需要一个:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

将其放在您的设置中的某个位置,您的程序将运行。

关于c++ - glVertexAttribPointer提高GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13403807/

10-10 18:28