glGenVertexArrays 没有给出唯一的 vaos

Posted

技术标签:

【中文标题】glGenVertexArrays 没有给出唯一的 vaos【英文标题】:glGenVertexArrays not giving unique vaos 【发布时间】:2012-12-01 16:37:20 【问题描述】:

我和我的朋友正在开发一个使用 C++ 和 OpenGL 的项目。我们为“ModelObject”创建了一个 C++ 类,每个 ModelObject 都有一个 GLuint vao 作为成员变量。然后在初始化 ModelObject 时,我们调用

glGenVertexArrays( 1, &vao );
glBindVertexArray( vao );

在我们调用的初始化函数结束时

glBindVertexArray(0);

脱离上下文。现在我们正在尝试渲染 2 个对象,一个火车车厢和一个立方体。在他的机器(Linux Mint)上,它们都渲染得很好,有自己的纹理,查询对象的 vaos 分别返回 1 和 2。

然而,在我的机器(MacBook Pro)上,两个对象都呈现为立方体(尽管一个具有火车的纹理,另一个具有立方体的纹理)。查询他们的 vaos 返回 0 和 0。

作为一个实验,我们告诉 glGenVertexArrays 为每个 ModelObject 创建 5 个 vaos。这产生了列表 0、1、918273、8、7(或类似的东西),并且对于两个 ModelObject 来说它是相同的列表。

据我所知,问题在于 glGenVertexArrays 既 a) 使用 0 作为有效地址,b) 在每次调用时生成相同的地址,即使我们从未调用 glDeleteVertexArray。为什么它会在我的机器上而不是他的机器上执行此操作,我该如何阻止它?

【问题讨论】:

在 gen/bind VAO 调用之后,glGetError() 会给你什么吗? glGetError() 返回 1282,根据我的谷歌搜索,这是“无效操作” 【参考方案1】:

您的 GPU 是否支持 OpenGL 3.0? glview 对入口点 glGenVertexArrays 有什么看法?您的 GPU/驱动程序可能不支持 VAO。

【讨论】:

glxinfo 说我有 OpenGL 2.1 版。我搭档的电脑有比这更早的版本。我在 glview 的任何地方都找不到 glGenVertexArrays 在 OpenGL 2.1 上 - 您可以改用 VBO。并且 - 您的合作伙伴有什么 GPU?他的 glxInfo 报告了什么?即使驱动程序报告较低版本,有时也可能存在入口点。 我们使用 4 个 VBO 来实际存储数据(顶点、颜色、法线、UV),我的印象是 VBO 被打包成一个 VAO 发送到 GPU。我不知道我搭档的硬件细节,可惜他今天不在 VAO 封装有关 VBO 的数据,而不必每次都重复发出 glVertexAttribPointer 调用——这样更快。请参阅 OpenTK 论坛上的此 (opentk.com/node/1619) 线程,其中对该主题进行了广泛的讨论,并提供了指向此功能的 OpenGL 3.1 规范的链接。 由于您的 GPU 不支持 VAO - 您应该直接使用 VBO 并设置 VertexAttribPointer 每次都是我想要的。【参考方案2】:

我在 iMac 上遇到了同样的问题。事实证明,显然在 MacOS 上,您需要使用 glGenVertexArrayAPPLE 和 glBindVertexArrayAPPLE。替换调用可提供一致的唯一 VAO。

【讨论】:

如果您使用的是 2.1 上下文,这可能是正确的,因为在 OpenGL 3.0 中引入了 VAO。如果您使用的是 3.x 上下文,glGenVertexArrays() 可以正常工作。【参考方案3】:

VAO 是在 OpenGL 3.0 中引入的,因此它们只能在支持 3.0 或更高版本的上下文中工作。

Mac OS 仅在 Core Profile 上下文中支持 OpenGL 3.x 和 4.x。默认情况下,您将获得一个支持 OpenGL 2.1 的上下文,其中包含所有已弃用且已在核心配置文件中删除的旧功能。 Mac OS支持兼容性配置文件,其中 3.0 及更高版本的功能可以与旧功能结合使用。

如何创建 Core Profile 上下文取决于您使用的窗口系统界面。对于两个常见的:

使用 GLUT(它本身被标记为已弃用,但目前仍然有效):将 GLUT_3_2_CORE_PROFILE 添加到传递给 glutInitDisplayMode() 的标志中(有关详细信息,请参阅 Glut deprecation in Mac OSX 10.9, IDE: QT Creator)。

使用 Cocoa,将此属性/值对添加到像素格式属性中:

NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,

一旦您有了核心配置文件上下文,glGenVertexArrays()glBindVertexArray() 就可以正常工作。这显然需要一台至少可以支持 OpenGL 3.x 的机器。本页表格列出了每台机器的版本支持:http://support.apple.com/kb/HT5942。

【讨论】:

以上是关于glGenVertexArrays 没有给出唯一的 vaos的主要内容,如果未能解决你的问题,请参考以下文章

了解顶点数组对象(glGenVertexArrays)

为啥使用 GTKGLArea 时在 PyOpenGL 中未定义 glGenVertexArrays

未处理的异常,glGenVertexArrays 调用上的访问冲突

LWJGL OpenGL glGenVertexArrays() 错误:此函数不可用

为啥为 C 程序定义 glGenVertexArrays 而不是 Linux 上的 C++ 程序?

OpenGL glGenVertexArray() 异常