【问题标题】:GLSL #version gives syntax error (LWJGL on Mac)GLSL #version 给出语法错误(Mac 上的 LWJGL)
【发布时间】:2012-01-22 08:28:22
【问题描述】:

在使用 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 版本。

【问题讨论】:

  • 你的着色器加载代码在哪里?
  • 一旦我有互联网,我就可以把它粘贴进去。 (现在使用我的手机。)thab 源代码会有帮助吗?

标签: java opengl glsl lwjgl


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,你拯救了我的夜晚!我在使用 SDL 和 C++ 的 Mac 上,但是通过这个模糊的错误消息 OpenGL 试图告诉我同样的事情。
  • 可以找到解决此问题的方法here。 BufferedReader 逐行拉取着色器源,丢弃 CR/LF 字符。然后,您使用 StringBuilder 将换行符显式地重新附加到每一行(参见该页面下方的大约 2/3)。
  • 也非常感谢。这是我遇到的确切问题。讨厌的 Java IO 删除换行符!
【解决方案2】:

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

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

【讨论】:

  • 我尝试在两者中使用相同的版本,但没有运气。由于这发生在编译而不是链接中,我认为着色器无论如何都不知道彼此。
  • @Jarrett 考虑到您的显卡供应商不祥,也可能是驱动程序错误。虽然这确实是一个非常简单的功能,支持应该没问题,但话又说回来,它仍然是 ATI。
  • 我用 GeForce 320M 验证了同样的问题。所以我开始怀疑两家供应商的基本功能是否存在完全相同的错误。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多