2

我和我的朋友正在开发一个使用 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。为什么它会在我的机器上而不是他的机器上执行此操作,我该如何阻止它?

4

3 回答 3

4

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

于 2012-12-13T18:08:52.543 回答
3

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

于 2014-09-16T10:32:34.023 回答
2

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()(有关详细信息,请参阅Mac OSX 10.9 中的 Glut 弃用,IDE:QT Creator)。

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

    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
    

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

于 2014-09-16T13:20:59.007 回答