1

我遇到了一个奇怪的崩溃,在尝试绑定 VAO 时随机出现。

VAO 本身之前已由 glGenVertexArrays 生成,它不会返回任何错误。

glGenVertexArrays(NUM_VAO,vao);
glGenBuffers(NUM_VAO,vbo);

glBindVertexArray(vao[2]);
glBindBuffer(GL_ARRAY_BUFFER,vbo[2]);
glBufferData(GL_ARRAY_BUFFER,1024*sizeof(GLfloat),NULL,GL_DYNAMIC_DRAW);
glVertexAttribPointer(...);
glEnableVertexAttribArray(...);

在执行期间,调用:

glBindVertexArray(vao[2])

可能会也可能不会生成 INVALID_OPERATION。请注意,vao[2] 的内容与 glGenVertexArrays 返回的内容相同,并且该数组在执行期间永远不会被删除。

根据规范,只有在传递了一个非零名称并且 glGenVertexArrays 没有返回名称本身时才会发出 INVALID_OPERATION,这显然不是这种情况。

该问题偶尔会出现,大约只有 15% 的应用程序运行时间,否则一切都按预期工作。在调试模式下问题仍然存在。

我刚刚升级了我的工作站,我曾经在 OpenSUSE 12.1 上使用 NVidia 驱动程序 290.10 和 Qt 4.7.1 进行开发,但从未遇到过这个问题。

我刚刚使用 NVidia 驱动程序 304.43 和 Qt 4.8.1 迁移到 OpenSUSE 12.2,我遇到了这个问题。

以前有人遇到过这种情况吗?我错过了什么吗?

4

1 回答 1

1

好吧好吧我的错,有一个 glDeleteVertexArrays() 疯了..但它真的很难被发现。

假设在旧的操作系统和驱动程序上返回的名称、初始内存布局或其他任何不同的东西,它只是删除了一个不存在的 VAO,而这里它指向一个有效的..

更改 linux 版本/发行版或使用 BSD 确实对我编写真正可移植的代码有很大帮助。

于 2012-09-18T11:58:16.677 回答