在Mavericks下的OpenGL 4.1(?)

use*_*282 22 opengl macos glsl osx-mavericks

我刚刚将MacBook Pro升级为Mavericks(MacOS 10.9),包括Xcode.根据Apple的"OpenGL功能表",这个版本支持OpenGL 4.1,但是对glGetString(GL_VERSION)的调用返回"1.2",我的GLSL 3.30着色器以"#version 330"开头拒绝加载,说版本不受支持.

我需要为Mavericks做些什么来启用4.1支持吗?

And*_*man 22

当您使用OS X上的某个较低级别API请求像素格式时,需要将以下内容添加到属性列表中以使用核心配置文件:

CGL:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core
Run Code Online (Sandbox Code Playgroud)

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core
Run Code Online (Sandbox Code Playgroud)

现在,虽然特定常量被命名为......3_2Core,但它实际上意味着请求一个上下文删除所有已弃用的功能并至少支持OpenGL 3.2(换句话说,核心配置文件).您可以使用相同的常量获得4.1或3.3上下文; 老实说,包括常数中的实际版本号可能是一个糟糕的选择.

如果不指定此当你请求的像素格式,OS X将会给你kCGLOGLPVersion_LegacyNSOpenGLProfileVersionLegacy分别.这将限制您使用OpenGL 2.1功能.

如果您使用的是更高级别的框架,那么您需要查阅API参考.但是,请注意,在OS X上,您必须具有核心配置文件上下文才能访问比OpenGL 2.1更新的任何内容.

  • @ user2507282:当我想到Xcode时,我想到了Apple希望你用来为OS X/iOS编写软件的GUI的怪异性......这真的与它无关,CGL和NSOpenGL是OS X中的两个接口创建和管理渲染上下文.无论如何,如果你想要现代的OpenGL,同时仍然隐藏低级操作系统特定的东西,不要使用GLUT; 我建议你使用类似glfw3的东西,你必须有一个核心的配置文件上下文才能在OS X上使用GL 3.2+,而像GLUT这样的古老框架就不会削减它. (6认同)

小智 13

在初始化glfw init之后立即使用OpenGL库GLFW,最新版本是3.0.4

if (!glfwInit())
{
    printf("glfwInit() fail to initualize. \n");
    glfwTerminate();
    exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

在初始化glfwInit()之后包含这4行代码.这四行代码将使您能够使用操作系统支持的最高版本.在Mac上它的opengl 4.1

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
Run Code Online (Sandbox Code Playgroud)

然后创建你的窗口.

_Window = glfwCreateWindow(width, height, title, 0, 0);
Run Code Online (Sandbox Code Playgroud)

检查以确保它已创建.

if (!_Window) {
    printf("Display window fail to create. \n");
    glfwTerminate();
    exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

然后使用以下内容将其设为当前窗口.

glfwMakeContextCurrent(_Window);
Run Code Online (Sandbox Code Playgroud)

在你成为你的实用窗口后,剩下要做的就是创建你的主循环.

while (!glfwWindowShouldClose(_Window))
{
    ........
    glfwSwapBuffers(_Window);
    glfwPollEvents();
}
Run Code Online (Sandbox Code Playgroud)

确保你包括glfwPollEvents(); 在循环中,这使得可以使用关闭按钮退出窗口.如果您在xcode中编译库时遇到问题,请在此处给我发消息,我将向您发送该库的副本.