我的朋友和我正在使用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(或类似的东西),并且它们对于两个ModelObjects都是相同的列表。
据我所知,问题是glGenVertexArrays是a)使用0作为有效地址,b)在每次调用时生成相同的地址,即使我们从不调用glDeleteVertexArray。为什么它会在我的机器上而不是他的机器上执行此操作,我该如何阻止它?
答案 0 :(得分:4)
您的GPU是否支持OpenGL 3.0? glview对入口点glGenVertexArrays有什么看法?您的GPU /驱动程序可能不支持VAO。
答案 1 :(得分:3)
我在iMac上遇到了同样的问题。事实证明,显然在MacOS上,你需要使用glGenVertexArrayAPPLE和glBindVertexArrayAPPLE。更换呼叫可以提供一致的唯一VAO。
答案 2 :(得分:2)
VAO是在OpenGL 3.0中引入的,因此它们只能在支持3.0或更高版本的上下文中使用。
Mac OS仅支持Core Profile上下文中的OpenGL 3.x和4.x.默认情况下,您将获得支持OpenGL 2.1的上下文,其中包含已弃用的所有旧功能,并且已在Core Profile中删除。 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。