获得支持的GLSL版本

时间:2014-12-10 17:59:37

标签: opengl opengl-es opengl-es-2.0

在使用intel显卡的笔记本电脑上进行开发时,在编译顶点着色器时,我得到了这个:

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支持的版本?

1 个答案:

答案 0 :(得分:20)

在桌面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 core profile specification中,陈述了以下内容(强调我的):

  

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 spec陈述

  

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 3.0,并且仍然支持ES兼容性扩展。

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