Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glgenvertexarray不提供唯一的VAO 我和我的朋友正在用C++和OpenGL做一个项目。我们为一个“MultObjor”创建了一个C++类,每个MODEM对象都有一个GULTENT VAO作为成员变量。然后在初始化ModelObject时,调用 glGenVertexArrays( 1, &vao ); glBindVertexArray( vao );_Opengl_Graphics_Cross Platform_Vertex Array - Fatal编程技术网

Glgenvertexarray不提供唯一的VAO 我和我的朋友正在用C++和OpenGL做一个项目。我们为一个“MultObjor”创建了一个C++类,每个MODEM对象都有一个GULTENT VAO作为成员变量。然后在初始化ModelObject时,调用 glGenVertexArrays( 1, &vao ); glBindVertexArray( vao );

Glgenvertexarray不提供唯一的VAO 我和我的朋友正在用C++和OpenGL做一个项目。我们为一个“MultObjor”创建了一个C++类,每个MODEM对象都有一个GULTENT VAO作为成员变量。然后在初始化ModelObject时,调用 glGenVertexArrays( 1, &vao ); glBindVertexArray( vao );,opengl,graphics,cross-platform,vertex-array,Opengl,Graphics,Cross Platform,Vertex Array,在初始化函数的末尾,我们调用 glBindVertexArray(0); 脱离上下文。现在我们尝试渲染两个对象,一个火车车厢和一个立方体。在他的机器(LinuxMint)上,它们都使用自己的纹理进行精细渲染,查询对象的VAO分别返回1和2 然而,在我的机器(MacBookPro)上,两个对象都渲染为立方体(尽管一个具有火车的纹理,另一个具有立方体的纹理)。查询他们的VAO将返回0和0 作为一个实验,我们告诉GlgenVertexArray为每个ModelObject创建5个VAO。这导致了列表

在初始化函数的末尾,我们调用

glBindVertexArray(0);
脱离上下文。现在我们尝试渲染两个对象,一个火车车厢和一个立方体。在他的机器(LinuxMint)上,它们都使用自己的纹理进行精细渲染,查询对象的VAO分别返回1和2

然而,在我的机器(MacBookPro)上,两个对象都渲染为立方体(尽管一个具有火车的纹理,另一个具有立方体的纹理)。查询他们的VAO将返回0和0

作为一个实验,我们告诉GlgenVertexArray为每个ModelObject创建5个VAO。这导致了列表0、1、918273、8、7(或类似的内容),这两个模型对象的列表是相同的


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

您的GPU支持OpenGL 3.0吗?关于入口点GlgenVertexArray怎么说?您的GPU/驱动程序可能不支持VAOs。

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

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

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

如何创建核心配置文件上下文取决于所使用的窗口系统界面。对于其中两个常见问题:

  • 使用GLUT(它本身被标记为已弃用,但目前仍然有效):将
    GLUT\u 3\u 2\u CORE\u配置文件添加到传递给
    glutInitDisplayMode()
    的标志中(有关详细信息,请参阅)

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

    NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
    

一旦有了核心概要文件上下文,
glgenvertexarray()
glbinvertexarray()
就可以正常工作了。这显然需要一台至少支持OpenGL 3.x的机器。此页上的表格列出了每台机器的版本支持:。

在gen/bind VAO调用后,
glGetError()是否提供了任何信息?glGetError()返回1282,根据我的Googlingglxinfo说,这是“无效操作”,我已经获得了OpenGL版本2.1。我搭档的电脑版本比那早。我在glview中找不到GLGEnVertexArray,在OpenGL2.1上,您可以使用VBOs。你的搭档有什么GPU?他的glxInfo报告了什么?有时,即使驱动程序报告较低版本,也可能存在入口点。我们使用4个VBO来实际存储数据(顶点、颜色、法线、UV),我的印象是VBO被打包成VAO发送到GPU。我不知道我的合作伙伴的硬件的细节,他今天不在,不幸的是AOS封装了有关VBO的数据,而无需每次重复发出glVertexAttribPointer调用,这样更快。请参阅OpenTK论坛上的这个()线程,该论坛对此主题进行了广泛的讨论,并链接到OpenGL 3.1规范以实现此功能。由于您的GPU不支持VAOs,因此您应该直接使用VBOs并设置VertexAttributePointer,每次都是我想要的。如果您使用的是2.1上下文,这可能是正确的,自从VAOs在OpenGL 3.0中引入以来。如果您使用的是3.x上下文,
glgenvertexarray()
可以正常工作。