Java GLSL#版本给出语法错误(Mac上的LWJGL)

Java GLSL#版本给出语法错误(Mac上的LWJGL),java,opengl,glsl,lwjgl,Java,Opengl,Glsl,Lwjgl,指定GLSL版本会在使用LWJGL时出现语法错误。我没有试图在LWJGL之外复制这个问题。这在运行Lion的多台Mac电脑上发生 我已经让顶点着色器和片段着色器在不使用#version的情况下工作。但是我将要使用纹理函数,它似乎需要一个#version指令 下面是最简单的失败示例: #version 120 void main() { gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0); } 编译此片段着色器并调用glGetShaderInfoLog会出现以下

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

我已经让顶点着色器和片段着色器在不使用
#version
的情况下工作。但是我将要使用
纹理
函数,它似乎需要一个
#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,但当编译器表现得好像不理解版本标记时,显示此错误仍然很奇怪。)

我使用的是Mac电脑上的ATI Radeon HD 4670
GL\U版本
2.1 ATI-7.12.9
GL\U着色语言版本
1.20


考虑到这一点,我不认为GLSL 1.20有任何理由不可用。我觉得很奇怪,它说
#version
是一个语法错误,而不是说不支持的GLSL版本。

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


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

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


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

我尝试在这两个版本中使用相同的版本,但没有成功。由于这是在编译过程中发生的,而不是在链接过程中发生的,因此我认为着色器之间并不相互了解。@Jarrett考虑到您图形卡的不祥供应商,这也可能是一个驱动程序错误。虽然这真的是一个非常简单的功能,支持起来应该没有问题,但它仍然是ATI的。我用GeForce 320M验证了同样的问题。所以我开始怀疑这两个供应商在一个基本功能上有完全相同的bug。你的着色器加载代码在哪里?我可以在我上网后粘贴它。(现在就用我的手机。)thab源代码会有帮助吗?非常感谢,你救了我一个晚上!我在Mac上使用SDL和C++,但是用这个模糊的错误消息OpenGL试图告诉我同样的事情。BufferedReader逐行提取着色器源,丢弃CR/LF字符。然后使用StringBuilder将换行符显式地重新添加到每一行(请参见该页下面的2/3部分)。也非常感谢。这正是我遇到的问题。讨厌的Java IO删除换行符!