着色器无法编译

Mar*_*ang 9 opengl shader glut osx-mavericks

我正在阅读"OpenGL编程指南第8版"一书.我只想在Mac上运行本书中介绍的第一个程序.

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

着色器代码:

#version 410 core

layout(location = 0) in vec4 vPosition;

void
main()
{
    gl_Position = vPosition;
}
Run Code Online (Sandbox Code Playgroud)

并且错误消息是:

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
Run Code Online (Sandbox Code Playgroud)

我试过版本420/400/330,它们都不起作用.

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

t.n*_*ese 24

对于所有创建的OpenGL上下文,MacOS都使用Legacy Profile作为默认值.因此,默认情况下仅支持OpenGL高达2.1和GLSL高达1.20.

要使用OpenGL 3.2+,您需要切换到核心配置文件.命名有点令人困惑,因为它只统计3.2Core配置文件,但实际上是3.2或更高版本(系统/驱动程序支持的每个OpenGL配置文件向后兼容3.2)

对于过剩(取决于过剩的版本,如果它工作),MacOS上的命令是:

glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | ...  )
Run Code Online (Sandbox Code Playgroud)

| ...您要传递给的其他选项在哪里glutInitDisplayMode

关于glew,通常你不需要glewMacOS,因为在MacOS中如何实现OpenGL层.您仅限于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);
Run Code Online (Sandbox Code Playgroud)


小智 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));
Run Code Online (Sandbox Code Playgroud)

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