OpenGL:glEnableVertexAttribArray之后的INVALID_OPERATION

时间:2014-07-08 23:19:10

标签: c++ macos opengl xcode5

我将一个正常运行的OpenGL应用程序从Windows移植到OSX,并继续进行无效操作"调用glEnableVertexAttribArray()后出现(代码1282)错误。这是渲染方法:

gl::Disable(gl::DEPTH_TEST);    
gl::Disable(gl::CULL_FACE);
gl::PolygonMode(gl::FRONT_AND_BACK,gl::FILL);

/// render full-screen quad
gl::UseProgram(m_program);

check_gl_error();

gl::BindBuffer(gl::ARRAY_BUFFER, m_vertexBuffer);
gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER, m_indexBuffer);

check_gl_error();
GLint positionLocation = -1;

positionLocation = gl::GetAttribLocation(m_program,"Position");
check_gl_error();

/// positionLocation now == 0

gl::EnableVertexAttribArray(positionLocation);
//// ************ ERROR RETURNED HERE **********************
//// ************ ERROR RETURNED HERE **********************
check_gl_error();

gl::VertexAttribPointer(positionLocation,3,gl::FLOAT,false,3 * sizeof(GLfloat),(const GLvoid*)0);
check_gl_error();

gl::DrawElements(gl::TRIANGLES,m_indexCount,gl::UNSIGNED_SHORT,0);

check_gl_error();

gl::BindBuffer(gl::ARRAY_BUFFER,0);
check_gl_error();

gl::BindBuffer(gl::ELEMENT_ARRAY_BUFFER,0);
check_gl_error();

check_gl_error()只是获取最后一个GL错误并返回一个有点可读的描述。

此代码在Windows下正常运行。但是,当我快速学习时,这并不一定意味着它是正确的。我已经验证所有以前绑定的对象(程序,顶点缓冲区,索引缓冲区)都是有效的句柄。 glGetAttribLocation()Position属性返回有效位置(在本例中为0)。

glEnableVertexAttribArray()的失败案例是什么?在此之前我是否有某些州没有设置?

如果我注释掉绘制代码,那么窗口将被清除为我的测试颜色(红色)(从代码片段中未显示的方法调用)在每个帧上,其他一切正常,暗示其他一切都是正确的。

建议?

哦,对于GL状态机模拟器,它会告诉我为什么它是一个"无效的操作。" (或者参考一些神秘的,神奇的文档,描述每个gl *调用所需的输入状态。)

1 个答案:

答案 0 :(得分:15)

您在OS X上看到此错误,因为如果您使用的是OpenGL 3.x或更高版本,它只支持OpenGL核心配置文件。您的代码不符合Core Profile。您最有可能在Windows上使用兼容性配置文件。

具体而言,核心配置文件需要绑定所有与顶点相关的调用的顶点数组对象(VAO)。因此,在调用glEnableVertexAttribArray()或其他类似函数之前,您需要创建并绑定VAO:

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);

关于如何找出错误条件:在这种情况下,它不是那么容易。假设您使用的是GL3级功能集。在理想的世界中,您可以转到www.opengl.org,在左上角附近的“文档”菜单中选择“OpenGL 3.3参考页面”,单击左侧窗格中的glEnableVertexAttribArray,并查看页面上的“错误”部分。然后您会看到... GL_INVALID_OPERATION未列为可能的错误。

接下来,您可能想要检查最新版本中是否有更好的内容。您也这样做,但选择“OpenGL 4参考页面”。错误情况仍未列出。

到目前为止,您已经意识到,与您之前的许多人一样,这些手册通常都是错误的。所以你去了最终的来源:规格。这次您在Documentation菜单中选择“OpenGL Registry”。这将为您提供PDF格式的所有规范文档的链接。再次,让我们先尝试3.3。在文档中搜索“EnableVertexAttribArray”,但仍然没有GL_INVALID_OPERATION被记录为可能的错误。

最后,检查最新的规格文件,即4.4。再次寻找“EnableVertexAttribArray”,现在是heureka的时候了:

  

如果没有绑定顶点数组对象,则会生成INVALID_OPERATION错误。

我很确定该错误也适用于GL3。虽然手册页不完整是相当普遍的,但是规范文档丢失的情况却更为罕见。非常密切相关的glVertexAttribPointer()调用已经在GL3中记录了此错误情况。