GLFW打开OpenGL 3.2上下文,但Freeglut不能 - 为什么?

时间:2013-02-26 15:50:59

标签: macos opengl glut freeglut glfw

我正在使用Mac,我已经编译并安装了FreeGlut,但我似乎无法使用它来获取OpenGL 3.2上下文。但是,在使用GLFW时,我可以毫无问题地获得它。 所以在GLFW中,这段代码非常合适:

    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 2);
    glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwOpenWindow(500, 500, 8, 8, 8, 8, 24, 8, GLFW_WINDOW)

但是使用FreeGlut,此代码失败(在glutCreateWindow上):

glutInitContextVersion (3, 2);
glutInitContextProfile(GLUT_CORE_PROFILE);  
glutInitWindowSize (width, height); 
glutInitWindowPosition (300, 200);
int window = glutCreateWindow (argv[0]);

失败的错误是:

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

我在MacOS X 10.8 Mountain Lion上运行,使用Intel HD4000显卡,安装了XQuartz作为我的X11服务器,并从源代码编译和安装了FreeGlut 2.8。

有谁知道可能是什么问题?

3 个答案:

答案 0 :(得分:1)

在10.8和10.7中,如果在设置GL上下文时明确要求GL 3.2,则可以使用GL 3.2。 Apple将其称为“核心配置文件”,以区别于GL 2.1的“Legacy Profile”。

我在OSX上使用Wine遇到了这个问题,它不支持OpenGL 3.2。我的理解是X11服务器(Apple X11或XQuartz)目前没有实现3.2支持,也没有一个开关可以在某处翻转以启用它。这可能是兼容性问题,因为3.2配置文件会破坏一些existing GL applications

This post suggests使用GLFW(如果还有这样的东西,可能是Apple的GLUT.framework)

This page解释了OSX上的GL堆栈并确认了GLX的2.1问题。

答案 1 :(得分:0)

Freeglut是SGI GLUT工具包的扩展实现,并且(除了过时硬件之外的一些例外)实现了相同的功能。

不幸的是,这包括许多在严格的CORE / FORWARD COMPATIBLE实现中会破坏的功能。

通常,如果您请求上下文而不指定版本或配置文件,您将获得驱动程序和GL工具包的组合可以提供的最佳功能,这通常是兼容性配置文件,而不是核心配置文件。

请注意,通过使用兼容性配置文件,您唯一丢失的是假定检查已弃用的函数。所有新的核心功能都应该没有问题。

freeglut的这个问题不仅限于Apple,它也在Linux下使用一些Gallium驱动程序。目前尚不清楚是否存在纠正此问题的短期意图,因此如果您需要使用CORE / FORWARD COMPATIBLE,您应该切换到GLFW或SDL。

答案 2 :(得分:0)

您需要包含该标志。通常在版本下。看起来应该是这样的:

glutInitContextFlag(GLUT_FOWARD_COMPATIBLE);