获取受支持的 GLSL 版本



在带有英特尔显卡的笔记本电脑上进行开发时,在编译顶点着色器时,我得到了这个:

0:1(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES

好的,所以我调整着色器以使用版本 300 ES。同时,我想检查当前驱动程序/卡支持的 GLSL 版本,所以我使用它:

glGetString ( GL_SHADING_LANGUAGE_VERSION )

令我沮丧的是,它只返回"1.30"。

如何获取完整列表?或者即使它不是完整列表,我如何获得标准 GL 支持的版本和 GLES 支持的版本?

在桌面 GL 中,GL 版本和 GLSL 版本之间的映射如下所示:

GL version                     GLSL version
2.0                            1.10
2.1                            1.20
3.0                            1.30
3.1                            1.40
3.2                            1.50
3.3                            3.30
4.0                            4.00
4.1                            4.10
4.2                            4.20
4.3                            4.30
4.4                            4.40
4.5                            4.50
...

因此,从GL 3.3开始,版本号被"同步"以使生活更轻松。另请注意,没有明确的版本 1.00。当着色器作为GL 1.x的扩展开发时,这是可用的。但是,这从来都不是 OpenGL 的核心功能,因此此处的版本从 1.10 开始(如果您的着色器中没有 #version 指令,这也是默认值(。如果您请求#version 100,您将获得 GLSL 1.00 ES。

请注意,除了需要支持列出的 GLSL 版本外,还需要 GL 实现来支持旧版本。例如,在 OpenGL 4.5 核心配置文件规范中,声明了以下内容(强调我的(:

OpenGL 4.5 实现保证支持 4.50 版 OpenGL 着色语言。对其中各节的所有引用 规范参考该版本。最新支持的版本 可以按照第 22.2 节中的说明查询着色语言。这 OpenGL 4.5 的核心配置文件也保证支持所有以前的 OpenGL 着色语言的版本回到 1.40 版。在一些 实现 核心配置文件也可能支持早期版本的 着色语言,可能支持兼容性配置文件版本 版本的着色语言 1.40 及更早版本。在这种情况下,当使用语言功能(如兼容性配置文件内置不 受核心配置文件 API 支持。

对于OpenGL ES,类似的事情也适用:

GLES version                  GLSL version
2.0                            1.00 ES
3.0                            3.00 ES
3.1                            3.10 ES

GLES 3.1 规范声明

OpenGL ES 3.1 实现保证支持版本 3.10, OpenGL ES 着色语言的 3.00 和 1.00。

现在您可能仍然想知道可以在桌面 GL 中使用哪些 GLSL ES 版本。所以,对于现代GL,这很简单。再次引用 GL 4.5 规范:

OpenGL 4.5 实现保证支持版本 1.00, OpenGL ES 着色语言的 3.00 和 3.10。

对桌面GL中特定于GLES的功能(如GLSL的ES变体(的支持通常通过"兼容性"扩展来处理:

  • GL_ARB_ES2_compatibility ,自 GL 4.1 以来的核心
  • GL_ARB_ES3_compatibility ,自 GL 4.3 起在核心
  • GL_ARB_ES3_1_compatibility , 自 GL 4.5 以来的核心

现在,您的实现可能仅提供 GL 3.0,并且仍支持 ES 兼容性扩展。

从 GL 4.3 开始,您只需通过 glGetStringi(GL_SHADING_LANGUAGE_VERSION,...) 查询所有受支持的 GLSL 版本的列表即可。对于在此之前的版本,您必须检查 GL 版本号和扩展字符串,以推断保证支持哪些版本(但实现可能仍支持更多版本(。

最新更新