GLSL #version提供语法错误(Mac上的LWJGL)

时间:2011-12-16 21:40:15

标签: java opengl glsl lwjgl

使用LWJGL时,指定GLSL版本会出现语法错误。我没有尝试在LWJGL之外重现这个问题。这是在运行Lion的多台Mac上发生的。

我已经使顶点和片段着色器无需使用#version即可工作。但我即将使用texture函数,它似乎需要#version指令。

这是最简单的失败示例:

#version 120

void main() {
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

编译此片段着色器并调用glGetShaderInfoLog会出现此错误:

ERROR: 0:1: '' : syntax error #version

120替换为其他任何内容,例如110,也会出错。但奇怪的是,如果我使用130或更高,它会给出相同的错误以及对不支持的版本的抱怨。 (我知道我的系统没有GLSL 1.3,但是当编译器表现得像它不理解版本标签时,显示此错误仍然很奇怪。)

我在使用ATI Radeon HD 4670的Mac上。GL_VERSION2.1 ATI-7.12.9GL_SHADING_LANGUAGE_VERSION1.20

鉴于此,我认为没有任何理由说明为什么GLSL 1.20不可用。我觉得#version是一个语法错误,而不是说一个不支持的GLSL版本,这真的很奇怪。

2 个答案:

答案 0 :(得分:17)

解决!它与OpenGL无关。我的文件阅读器代码丢弃了所有换行符。这在着色器的主体中很好,它有分号。但预处理器指令没有分号来保护它免受此错误的影响。

因此对于遇到此问题的任何人,请确保您实际传递给glShaderSource的代码仍然有其换行符。

答案 1 :(得分:1)

顶点和片段着色器都需要具有相同的版本。因此,如果向片段着色器添加#version 120,则还应将其添加到顶点着色器中。但是有点奇怪的是,这被报告为语法错误。也许还有另一个错误,但两者肯定都必须有相同的版本标签。

编辑:还要记住,版本标记需要是着色器源代码中的第一行(换行符和注释应该是规范,但是谁知道驱动程序的想法)。