不能在 mac 小牛上使用 GLSL 330
Posted
技术标签:
【中文标题】不能在 mac 小牛上使用 GLSL 330【英文标题】:cannot use GLSL 330 on mac mavericks 【发布时间】:2014-04-08 03:03:54 【问题描述】:我正在尝试学习 OpenGL,并且材质在着色器中使用 #version 330。我可以编译成功,但是当我尝试运行它时,它会抱怨不支持版本 330。
在我的源代码中,我在 Xcode 中使用了免费的 glut 和 OpenGL 框架。如果我也包括这两行代码
glutInitContextVersion(3,1); glutInitContextFlags(GLUT_CORE_PROFILE);
无法编译。
我的mac是MacBook Pro Mid 2012。根据应用应该支持OpenGL4.1。
那么如何编译 330 版着色器?
【问题讨论】:
当您尝试添加 gluInitContextVersion 和 gluInitContextFlags 时遇到什么编译器错误? 看来可以编译成功了。但是当我运行它时,它抱怨不支持#version 330。 在 OpenGL 3.1 中没有核心配置文件(或任何相关配置文件)上下文这样的东西。你需要3,2,Core。 【参考方案1】:OS X 要求您请求 3.2 core profile 以接收 3.3 或更高版本的上下文。这是因为 3.2 最终删除了 3.0 中已弃用的功能。
因此,如果您想使用#version 330 着色器,那么您的代码应如下所示:
glutInitContextVersion(3,2);
glutInitContextFlags(GLUT_CORE_PROFILE);
EDIT显然X11在OS X上不支持高于2.1的OpenGL。因此,我建议你切换到GLFW。
【讨论】:
我已将它添加到我的源代码中。但它仍然不起作用。源代码可以编译成功。但是当我运行它时,它会抱怨: 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:这也是您的问题的一部分……要在 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
的。
@Negelis:尽管它报告了错误的 OpCode 并不奇怪,因为它对 GLX_ARB_create_context
或 GLX_ARB_create_context_profile
扩展一无所知。同样,这里重要的是找到一个用于 OS X 的 FreeGLUT 端口,该端口不是基于 X 构建的,或者更好的是尚未使用 GLFW3 或 SDL2 之类的东西。 Apple 不支持 X,只是在 Quartz 之上提供了一个兼容的 X 服务器,以使移植现有的 UNIX 应用程序更容易。此 X 服务器公开的 GL 功能在 GL 2.1 中被冻结,它也不支持新的 GLX 扩展。
@Coleman:非常感谢!我想我现在更清楚这里出了什么问题。
@MichaelMorris:我一直指的是XQuartz :) 那是Apple 的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 .以上是关于不能在 mac 小牛上使用 GLSL 330的主要内容,如果未能解决你的问题,请参考以下文章