C++ OpenGL:GlenableVertexAttributeArray之后的\u操作无效

C++ OpenGL:GlenableVertexAttributeArray之后的\u操作无效,c++,macos,opengl,xcode5,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

我正在将一个运行正常的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\u gl\u error()
只获取最后一个gl错误,并返回一个可读的描述

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

glEnableVertexAttribArray()的故障案例有哪些?在这之前有没有我没有设定过的状态

如果我注释掉绘制代码,那么窗口在每一帧上都会被清除为我的测试颜色(红色)(从代码段中未显示的方法调用),其他所有内容都可以正常工作,这意味着其他所有内容都是正确的

建议


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

您在OS X上看到了这个错误,因为如果您使用的是OpenGL 3.X或更高版本,它只支持OpenGL核心配置文件。您的代码与核心配置文件不兼容。您很可能在Windows上使用了兼容性配置文件

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

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
关于如何找出错误条件:在这种情况下,这并不像应该的那么容易。假设您使用的是GL3级别的功能集。在理想情况下,您可以转到,下拉左上角附近的“文档”菜单,选择“OpenGL 3.3参考页面”,单击左窗格中的
GlenableVertexAttributeArray
,然后查看页面上的“错误”部分。然后你看到<代码>总账无效操作
未列为可能的错误

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

到现在为止,您已经意识到,像之前的许多人一样,这些手册页经常是错误的。因此,您可以找到最终的来源:规格。这次您在文档菜单中选择“OpenGL注册表”。这将为您提供PDF格式的所有规范文档的链接。再一次,让我们先试试3.3。在文档中搜索“EnableVertexAttributeArray”时,会发现。。。仍然没有
GL\u无效\u操作
记录为可能的错误

最后,检查最新的规范文档,即4.4。再次寻找“EnableVertexAttributeArray”,是时候使用heureka了:

如果未绑定顶点数组对象,将生成无效的_操作错误


我很确定这个错误也适用于GL3。虽然手册页不完整是相当常见的,但规范文档缺少内容的情况要少见得多。非常密切相关的
glVertexAttribPointer()
调用已经在GL3中记录了此错误条件。

。谢谢我使用的是4.1向前兼容的上下文,但vao绑定是问题所在。干杯。另外,我真的很感谢您完成文档搜索过程。非常有用。而且写得很好。