获得支持的GLSL版本

Joa*_*cho 13 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
Run Code Online (Sandbox Code Playgroud)

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

glGetString ( GL_SHADING_LANGUAGE_VERSION )
Run Code Online (Sandbox Code Playgroud)

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

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

der*_*ass 21

在桌面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
...
Run Code Online (Sandbox Code Playgroud)

因此,从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实现保证支持OpenGL着色语言的4.50版.对该规范各部分的所有引用均指该版本.可以按照第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
Run Code Online (Sandbox Code Playgroud)

GLES 3.1规范说明

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

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

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

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

现在您的实现可能只提供GL 3.0并仍然支持ES兼容性扩展.

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

  • 所以基本上,我必须根据该表“假设”哪些 GLSL 版本可用,即使可能有一些更新的版本......(如何在此评论中输入换行符???)所以,如果我在 GL >=4.3 上,有一个简单的方法,但否则,我将不得不对表进行硬编码?啊! (3认同)