使用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_VERSION
是2.1 ATI-7.12.9
而GL_SHADING_LANGUAGE_VERSION
是1.20
。
鉴于此,我认为没有任何理由说明为什么GLSL 1.20不可用。我觉得#version
是一个语法错误,而不是说一个不支持的GLSL版本,这真的很奇怪。
答案 0 :(得分:17)
解决!它与OpenGL无关。我的文件阅读器代码丢弃了所有换行符。这在着色器的主体中很好,它有分号。但预处理器指令没有分号来保护它免受此错误的影响。
因此对于遇到此问题的任何人,请确保您实际传递给glShaderSource的代码仍然有其换行符。
答案 1 :(得分:1)
顶点和片段着色器都需要具有相同的版本。因此,如果向片段着色器添加#version 120
,则还应将其添加到顶点着色器中。但是有点奇怪的是,这被报告为语法错误。也许还有另一个错误,但两者肯定都必须有相同的版本标签。
编辑:还要记住,版本标记需要是着色器源代码中的第一行(换行符和注释应该是规范,但是谁知道驱动程序的想法)。