glVertexAttribPointer 提高 GL_INVALID_OPERATION

Posted

技术标签:

【中文标题】glVertexAttribPointer 提高 GL_INVALID_OPERATION【英文标题】:glVertexAttribPointer raising GL_INVALID_OPERATION 【发布时间】:2012-11-04 10:10:24 【问题描述】:

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

【问题讨论】:

这都是在同一个函数里面吗? 是的。当它真正起作用时我会重构它:P 您确定GL_INVALID_OPERATION 错误来自glVertexAttribPointer?请记住:OpenGL 存储错误并仅在您调用glGetError 时返回它们。所以如果你不经常purging the error queue,你可能会遇到更老的错误。 它肯定来自 glVertexAttribPointer - 当我将错误检查移到上面的行时,没有报告错误。 @robinjam:请在问题中添加具体的错误检查代码,包括您看到错误的最新点和出现错误的最早点。因为我认为您的错误来自glEnableVertexAttribArray 【参考方案1】:

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

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);

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

【讨论】:

非常感谢您的帮助。我仍然没有在屏幕上看到任何输出,但至少我现在没有收到任何错误! 关于glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 声明-这个项目需要支持多个平台,根据GLFW documentation,如果您要求向前兼容,OS X 只会为您提供核心上下文. +1 我不知道它在 OpenGL 3.3(我之前一直在使用)中是如何工作的,但就是这样 - 我从未生成和绑定顶点数组对象。谢谢,尼科尔! 在 OS X 上需要 GLFW_OPENGL_FORWARD_COMPAT 提示。我不断在输出中得到这个:65543: NSGL: The targeted version of OS X only supports OpenGL 3.2 and later versions if they are forward-compatible 应该从这个答案中删除提到停止使用 GLFW_OPENGL_FORWARD_COMPAT 的行,因为 macOS 上的 OpenGL 3.2 核心配置文件支持显然是必要的,正如 GLFW 文档和官方 OpenGL 文档的 API 中所述警告。

以上是关于glVertexAttribPointer 提高 GL_INVALID_OPERATION的主要内容,如果未能解决你的问题,请参考以下文章

缓冲区和 glVertexAttribPointer 之间的关系

如何使用 glVertexAttribPointer() 添加非数组值

Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)

glVertexAttribPointer 出现 JOGL 错误

glVertexAttribPointer 返回 GL_INVALID_OPERATION

OpenGL glVertexAttribPointer 正常