2014-01-05 139 views
8

我正在关注“OpenGL编程指南第8版”一书。我只想在我的Mac上运行本书中介绍的第一个程序。着色器无法编译

它是Mavericks + Xcode 4.6.1 + Intel HD graphics 4000.所以问题是,着色器无法编译。

的Shader代码:

#version 410 core 

layout(location = 0) in vec4 vPosition; 

void 
main() 
{ 
    gl_Position = vPosition; 
} 

和错误消息是:

Shader compilation failed: ERROR: 0:1: '' : version '410' is not supported 
ERROR: 0:1: '' : syntax error #version 
ERROR: 0:3: 'layout' : syntax error syntax error 

我试过版本420/400/330,他们没有工作。

顺便说一句,该程序使用最新的glew 1.10(http://glew.sourceforge.net),我发现我必须设置“glewExperimental = GL_TRUE;”在调用glewInit之前。否则“glGenVertexArray”是一个NULL指针。所以我想知道也许小牛队不支持小牛?

+2

您是否选择了渲染的核心配置文件?我不使用glew,我只使用glfw创建渲染上下文和窗口,以及标准头文件。在MacOS上,我并不需要笨拙,因为macos具有系统/驱动程序支持的所有功能和常量。 –

+0

因为我忘了提及,MacOS只有'legacy'和'3_2Core'配置文件可以选择。但对于'3_2Core',它返回系统/ gpu支持的最高配置文件,它向后兼容'3_2Core'。 –

+0

谢谢,但是如何“为您的渲染选择核心配置文件”? –

回答

21

的MacOS使用Legacy Profile为默认创建的所有OpenGL上下文。因此,默认情况下只支持最高2.1的OpenGL和最高1.20的GLSL。

要使用OpenGL 3.2+,您需要切换到Core Profile。这里的命名有点混乱,因为它仅统计3.2Core配置文件,但实际上是3.2或更高版本(系统/驱动程序支持的每个OpenGL配置文件向后兼容到3.2)

For glut(取决于过剩的版本,如果它的工作原理)在MacOS的命令是:

glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | ... ) 

| ...是你想传递给glutInitDisplayMode其他选项。

关于glew,通常您不需要MacOS上的glew,因为OpenGL图层在MacOS中的实现方式。您仅限于MacOS提供/公开的OpenGL功能。所以这些功能都可以通过MacOS的头文件获得。这里的标题是#include <OpenGL/gl3.h>,这里的命名也是有误导性的,它并不意味着只有OpenGL 3,它和上下文一样。

我会推荐使用GLFW这是一个很棒的跨平台库,类似于GLUT但我认为使用更好。 在那里您可以切换上下文,如下所示:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); 
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); 
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 
+0

这对于OpenGL新手来说相当不错。有时候我们可以很容易地理解opengl的功能,但如果你想在你的平台上运行它,这是另一回事,因为你必须像glut/glew一样处理一些其他的框架/库。 –

+0

t.niese是正确的。这解决了我的问题,就像一个魅力。我正在使用SDL 2进行窗口管理。我已经在下面列出了SDL 2所需的代码。 'SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,3);'' SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,2);'' SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE);' –

+0

嗨,大家好,由于某种原因,我无法得到'glutInitDisplayMode(GLUT_3_2_CORE_PROFILE); '工作。你能告诉我我做错了什么吗?这是我的代码。 https://gist.github.com/dhirajbodicherla/11238004 – Dhiraj

5

可能是因为您的驱动程序不支持您需要的GLSL版本。半年前,我在一台装有英特尔高清卡的笔记本电脑上安装了全新的Ubuntu系统。

使用glGetString找出哪个版本可用: http://www.opengl.org/sdk/docs/man/xhtml/glGetString.xml。 例如,

printf("Supported GLSL version is %s.\n", (char *)glGetString(GL_SHADING_LANGUAGE_VERSION)); 

在这里您可以找到有关glewExperimental: http://www.opengl.org/wiki/Extension_Loading_Library

+0

谢谢。这是我得到的:“支持的GLSL版本是:1.20”。为什么我的系统只支持这样一个旧的GLSL版本?我的小牛队有什么问题吗? –

+0

@标记默认情况下,MacOS使用仅支持2.1以及GLSL 1.20的OpenGL的[** Legacy Profile **](https://developer.apple.com/graphicsimaging/opengl/capabilities/GLInfo_1090.html)。您需要告诉MacOS使用[**核心配置文件**](https://developer.apple.com/graphicsimaging/opengl/capabilities/),如何做到这一点取决于您创建渲染上下文的方式。 –

+0

@ t.niese酷。我使用Xcode附带的GLUT。我猜这是openglut?实际上,在该书的示例程序中,有两行被我删除(因为这两个函数未在MacOSX的glut库中定义):“glutInitContextVersion(4,3)”和“glutInitContextProfile”。我掠过了“glut.h”,但没有找到类似的功能,所以现在我不知道该怎么做... –