glVertexAttribPointer提升GL_INVALID_OPERATION

rob*_*jam 30 c++ opengl opengl-3

我正在尝试整合一个非常基本的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.
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 56

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

glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
Run Code Online (Sandbox Code Playgroud)

停止这样做.您已经要求提供核心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".
Run Code Online (Sandbox Code Playgroud)

首先,这里有一个明显的驱动程序的bug,因为glEnableVertexAttribArray应该都发布了GL_INVALID_OPERATION错误.或者你检查时犯了一个错误.

为什么两个函数都会出错?因为您没有使用顶点数组对象.glEnableVertexAttribArray在当前VAO中设置状态.目前没有VAO,所以......错误.同样如此glVertexAttribPointer.它甚至出现在这两个页面上的错误列表中.

在兼容性上下文中不需要VAO,但是在核心上下文中也是如此.你要求的.那么......你需要一个:

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
Run Code Online (Sandbox Code Playgroud)

把它放在你的设置的某个地方,你的程序就可以了.

  • 关于`glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);`语句 - 该项目需要支持多个平台,并根据[GLFW文档](http://www.glfw.org/faq.html#4_2),OS如果您要求前向兼容的X,X仅为您提供核心上下文. (6认同)
  • 非常感谢您的帮助.我仍然没有在屏幕上获得任何输出,但至少我现在没有收到任何错误! (2认同)