OpenGL ES 2.0中可以使用哪些GLSL版本?

29

尽管我搜索了几个小时,似乎找不到一个清晰的答案。有人能告诉我到底发生了什么吗?我遇到了错误消息,例如“不支持版本140”。这是我的设备(Kindle Fire)还是GL ES 2.0的问题?我需要添加库或其他东西吗?

4个回答

33

OpenGL ES 2.0规范提到了GLSL ES,它与GLSL不同。

GLSL ES规范如下:

该语言的版本基于桌面GLSL的1.10版本。但是,它包括一些在1.10版本中没有但在1.20版本中有的功能。

请查阅规范以了解支持哪些功能。


4
显然我很不擅长使用谷歌搜索。好的。 - Kyle Emmerich
值得一提的是,OpenGL ES 2.0规范指出,最低支持GLSL ES 1.0。 - Joseph Mansfield
链接已失效,我认为这是正确的链接:https://www.khronos.org/files/opengles_shading_language.pdf - nmr
更新了链接,谢谢。 - Thomas

15

OpenGL ES 不是 OpenGL,因此 OpenGL ES 的着色器语言也不同于 OpenGL 的着色器语言。它们是相似的,但并不完全相同。因此,没有任何桌面 GLSL 版本与 GLSL ES 版本匹配。


12

实际上你不需要添加任何库,140 对于 Kindle Fire 来说是太新了。要么删除版本规范,要么将其递减直到着色器编译通过。由于语言的各个版本确实存在一些差异,您可能需要修复着色器中的其他错误。

您还可以使用 glGetString() 查询 GL_SHADING_LANGUAGE_VERSION 以获取设备支持的 GLSL 版本(至少保证为100—ES 2.0 是第一个具有着色语言的版本)。

另外,正如其他人所提到的,OpenGL ES GLSL 不是与 OpenGL ES 相同的语言(我认为这是相当明显的,OpenGL ES 不是 OpenGL),因此版本号不会匹配。然而,有 GL_ARB_ES2_compatibility 及其扩展到 ES3、ES3.1 和 ES3.2,其中描述了 ES / 非 ES GLSL 语言的映射,并且使用这些技术可以在非 ES 上下文中获得类似 ES 的功能。


3
我觉得140岁已经很老了。:( - Kyle Emmerich
6
没有真正回答这个问题。如果某个东西支持OpenGL ES 2.0,那么它支持哪个版本的GLSL呢?(至少,我指的是最低标准)。 - BrainSlugs83
1
@BrainSlugs83: 如果某个东西支持OpenGL ES 2.0,则保证它支持GLSL ES 100。遗憾的是,在比较这些数字时存在很多混淆,因为人们看到#version ...指令就立刻认为苹果(桌面GLSL)与橙子(嵌入式GLSL)是可以相互比较的。它们在许多方面相似,但在更多方面不同(版本编号是其中一个明显的不同之处)。请参阅:http://www.opengl.org/registry/gles/ - 如果您查看“OpenGL ES 2.0 Specific”下面的内容,那将告诉您关联的GLSL ES版本。 - Andon M. Coleman
2
这是一个有效的观点,然而问题是关于GLSL ES的,而且被采纳的答案没有提到版本号与桌面GLSL不一致的事实。这里需要注意的重点是,在GLSL ES中没有版本140;我们在ES 2.0中有100,而ES 3.0的草案规范提供了300。在2.0和3.0之间没有发布新的语言规范版本。 - Andon M. Coleman

0

首先你需要明确:

  • OpenGL 和 GLSL 适用于桌面应用
  • OpenGL ES 和 GLSL ES 适用于嵌入式系统

如果你的系统使用的是 OpenGL ES 2.0,则必须使用 GLSL ES 1.0(着色器预处理器:#version 100)

这里有一个技巧,如果你使用 #version 110 或 #version 120,那么机器会理解你想要使用 GLSL 而不是 GLSL ES。以下来自 Wikipedia 的表格将帮助你明确。

OpenGL ES and WebGL use OpenGL ES Shading Language

enter image description here

在OpenGL 3.3之前,版本命名对它们两个都很混乱,但从OpenGL 3.3开始,命名开始变得清晰


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接