gpt4 book ai didi

c++ - OpenGL:在 glEnableVertexAttribArray 之后的 INVALID_OPERATION

转载 作者:太空狗 更新时间:2023-10-29 23:24:40 34 4
gpt4 key购买 nike

我正在将一个正常运行的 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 下运行良好。但是,正如我正在快速学习的那样,这并不一定意味着它是正确的。我已验证所有先前绑定(bind)的对象(程序、顶点缓冲区、索引缓冲区)都是有效的句柄。 glGetAttribLocation() 返回 Position 属性的有效位置(在本例中为 0)。

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

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

建议?

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

最佳答案

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

具体来说,Core Profile 需要为所有与顶点相关的调用绑定(bind)一个顶点数组对象 (VAO)。因此,在调用 glEnableVertexAttribArray() 或其他类似函数之前,您需要创建并绑定(bind)一个 VAO:

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

关于如何找出错误条件:在这种情况下,它并不像应该的那么容易。假设您使用 GL3 级别的功能集。在一个理想的世界里,你会去 www.opengl.org ,下拉靠近左上角的“Documentation”菜单,选择“OpenGL 3.3 Reference Pages”,点击左 Pane 中的glEnableVertexAttribArray,然后查看页面上的“Errors”部分.然后您会看到...GL_INVALID_OPERATION 未列为可能的错误。

接下来,您可能想检查最新版本中是否有更好的东西。您也这样做,但选择“OpenGL 4 Reference Pages”。错误情况仍未列出。

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

不得已,检查最新的规范文档,即 4.4。再次寻找“EnableVertexAttribArray”,是时候了:

An INVALID_OPERATION error is generated if no vertex array object is bound.

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

关于c++ - OpenGL:在 glEnableVertexAttribArray 之后的 INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24643027/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com