【发布时间】:2023-03-19 02:02:01
【问题描述】:
我正在将功能正常的 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() 的失败案例有哪些?有没有我之前没有设置的状态?
如果我注释掉绘制代码,则窗口会在每一帧上清除为我的测试颜色(红色)(从代码 sn-p 中未显示的方法调用),其他一切正常,这 意味着 其他一切都是正确的。
建议?
哦,对于一个会告诉我为什么它是“无效操作”的 GL 状态机模拟器。 (或者参考一些描述每个 gl* 调用所需输入状态的神秘、神奇的文档。)
【问题讨论】: