在Mac Mavericks上无法使用GLSL 330。

4
我正在尝试学习OpenGL,但是教材中在着色器中使用了#version 330。我可以成功编译它,但是当我尝试运行它时,它会报错“不支持版本330”。
在我的源代码中,我使用Xcode中的free glut和OpenGL框架。如果我还包括以下两行代码:
glutInitContextVersion(3,1); glutInitContextFlags(GLUT_CORE_PROFILE);
则无法编译。
我的MacBook Pro Mid 2012应该支持OpenGL4.1。
那么我该如何编译版本330的着色器呢?

当您尝试添加gluInitContextVersion和gluInitContextFlags时,您遇到了哪些编译器错误? - Michael Morris
似乎可以成功编译。但是当我运行它时,它抱怨不支持#version 330。 - Negelis
在OpenGL 3.1中,不存在核心配置文件(或任何配置文件)。您需要使用3.2 Core。 - Andon M. Coleman
1个回答

1

在OS X中,如果你想获取一个3.3或更高版本的上下文,则需要请求 3.2核心配置文件。这是因为3.2最终移除了在3.0中弃用的功能。

因此,如果您想使用#version 330着色器,则代码应如下所示:

glutInitContextVersion(3,2);
glutInitContextFlags(GLUT_CORE_PROFILE);

编辑 显然,X11在OS X上不支持高于2.1的OpenGL。因此,我建议您切换到GLFW


1
我已经将它添加到我的源代码中,但它仍然无法正常工作。源代码可以成功编译,但当我运行它时,它会报错:X Error of failed request: BadRequest (invalid request code or no such operation) Major opcode of failed request: 34 (X_UngrabKey) Serial number of failed request: 29 Current serial number in output stream: 29我不知道这个问题的原因。 - Negelis
1
@Negelis:这也是你的问题之一……在OS X上获取3.2+核心配置文件上下文,你必须使用本地的CGL或NSOpenGL API。如果你的软件通过传统的X服务器,你将永远被限制在OS X上的OpenGL 2.1。我不禁想知道为什么它配置为使用X服务器而不是Quartz;无论你从哪里获得FreeGLUT的端口,他们都是使用X而不是OS X的本地API构建的。顺便说一句,那个X OpCode是错误的。GLX Major OpCode 34是glXCreateContextAttribsARB,这是其他平台用来请求GLX_CONTEXT_MAJOR_VERSION_ARB的。 - Andon M. Coleman
1
@Negelis:虽然它报告了错误的OpCode,但这并不奇怪,因为它对于GLX_ARB_create_contextGLX_ARB_create_context_profile扩展一无所知。重要的是在OS X上找到一个没有基于X构建的FreeGLUT端口,或者更好的选择是使用类似于GLFW3或SDL2的东西。苹果公司不支持X,只提供了一个兼容的X服务器,以便在Quartz之上层叠现有的UNIX应用程序,该X服务器公开的GL功能被冻结在GL 2.1,并且它也不理解新的GLX扩展。 - Andon M. Coleman
1
@Coleman:非常感谢!我现在对这里出了什么问题更加清楚了。 - Negelis
1
@MichaelMorris:我一直在提到XQuartz :) 这是苹果的X服务器,它是建立在Quartz之上的。它不实现GLX中的新功能,而在OS X上获取3.2+核心上下文的唯一方法是使用CGL或NSOpenGL。GLX和AGL不能使用,因为它们在OS X 10.7中添加GL配置文件时从未更新。在底层,FreeGLUT通常在UX平台上使用GLX,但如果它是OS X本地的,则可能会使用NSOpenGL,因为这是OS X上唯一允许您执行窗口化和全屏渲染的本机API。 - Andon M. Coleman
1
@MichaelMorris:从技术上讲,苹果并没有编写XQuartz,它是开源的...实际上,很多OS X也是开源的。但重要的是,它的GLX实现不支持GLX_ARB_create_context_profile,因此无法获得比2.1上下文更新的任何内容。由于XQuartz是开源的,这可能会在未来发生变化,但据我所知,苹果分发的XQuartz版本仍然不支持它。 - Andon M. Coleman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接