OpenGL:glEnableVertexAttribArray之后的INVALID_OPERATION

3Da*_*ave 2 c++ opengl macos xcode5

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

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();
Run Code Online (Sandbox Code Playgroud)

check_gl_error() 只是得到最后一个GL错误并返回一个有点可读的描述.

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

失败的情况是glEnableVertexAttribArray()什么?我之前没有设置一些州吗?

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

建议?

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

Ret*_*adi 18

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

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

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
Run Code Online (Sandbox Code Playgroud)

关于如何找出错误条件:在这种情况下,它不是那么容易.假设您使用的是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中记录了此错误情况.

  • 另外,我非常感谢您完成文档搜索过程.很有帮助.写得很好. (2认同)