为啥 OSX Mavericks 不能编译我的 GLSL 着色器?

Posted

技术标签:

【中文标题】为啥 OSX Mavericks 不能编译我的 GLSL 着色器?【英文标题】:Why won't OSX Mavericks compile my GLSL Shader?为什么 OSX Mavericks 不能编译我的 GLSL 着色器? 【发布时间】:2014-01-07 19:34:16 【问题描述】:

这个着色器程序编译得很好

#version 120
void main()

gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();

但是当我尝试切换到版本 330 或 400 时,它会引发“不支持”错误

#version 400
void main()

gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();

我需要使用“输入”和“输出”功能来配合我用来学习 OpenGL 的书,并且最新的 Mac 应该支持最高 4.1。我什至下载了苹果图形开发工具来使用 OpenGL Shader Builder 寻求帮助,它也不会编译超过 1.2 的任何东西。

【问题讨论】:

很确定 gl_FontColorgl_TexCoord 在 GL 4.0 中不需要/删除,而是您想使用顶点属性。 你用那个着色器击中了三重奏。 3.30 / 4.00 着色器中没有一行代码是有效的。这是因为在 OS X 上,任何版本的 GLSL > 1.20 都是隐含的 core。您不能使用像gl_MultiTexCoord0ftransform (...) 这样的兼容性配置文件结构。您不妨养成将针对 OS X 的着色器编写为#version 330 core 的习惯。这将帮助您记住您的功能集是有限的,并且还可以防止您对其他平台上的着色器进行更改,最终导致它们与 OS X 不兼容。 好的,忘记着色器的其余部分,一个衬垫甚至不会编译,一行'#version 120'编译并且'#version 330'返回ERROR:0:1:version '330'不支持。我错过了什么?我需要更新这台 Mac 吗?不到一个月。 就像我说的,如果你想使用 GLSL > 1.20 的版本,你需要一个核心配置文件上下文。我不相信你已经采取了必要的步骤来获得一个。默认情况下,在 OS X 上,您会获得 OpenGL 2.1 (GLSL 1.20) 实现。除非您要求提供核心配置文件,否则任何比此更新的 GLSL 着色器都将拒绝编译。这就是为什么你应该养成写#version 330 core 的习惯。但是仅在着色器中更改版本指令是不够的,当您使用所使用的任何框架/API 创建窗口时,您需要获得 3.2+ 核心配置文件。 好吧,我想我开始明白了。尝试使用 Apple Developer Tools 提供的 OpenGL Shader Builder 我也无法编译 #version 330 core。所以你说当我使用 GLEW 时,我需要以某种方式获得 3.2+ 的配置文件和窗口。我想我在想,使用 Apple 提供的构建着色器的工具会支持我。 【参考方案1】:

我假设您使用的是NSOpenGLView。在将 OpenGL 配置文件配置为使用 3.2 内核之前,我无法编译任何 > V1.20 着色器。 NSOpenGLView(或其子类,如果您是子类)上的 pixelFormat 属性必须设置为正确的属性。

如果您正在继承 NSOpenGLView 并已将其添加到 Interface Builder 中的视图中,您可以将以下代码添加到子类的 -awakeFromNib 方法中:

- (void) awakeFromNib

    NSOpenGLPixelFormatAttribute attributes [] = 
        NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)24,
        NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core,
        (NSOpenGLPixelFormatAttribute)0
    ;

    NSOpenGLPixelFormat *pf = [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
    [self setPixelFormat:pf];

如果您以编程方式创建视图,还有其他方法可以设置像素格式(例如-initWithFrame:pixelFormat:)。

另外,请参阅 Apple 的 GLEssentials 示例代码,其中有很多内容,但它确实使用了更新版本的 OpenGL,并且其中包含上面的确切代码 sn-p。

【讨论】:

以上是关于为啥 OSX Mavericks 不能编译我的 GLSL 着色器?的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM

在 OSx 10.9 Mavericks 上安装 Cantera 2.1

Apache PHP/OSX Mavericks: - 无法打开流:打开的文件太多

是否可以提交到不包括 OsX Mavericks 的 Mac App Store 下载

OSX 10.9 Mavericks 钥匙串 API 坏了?

sh OSX for Hackers(Mavericks / Yosemite)