查找支持的 GLSL 版本

Posted

技术标签:

【中文标题】查找支持的 GLSL 版本【英文标题】:Finding supported GLSL version 【发布时间】:2013-09-26 07:06:24 【问题描述】:

如何以一种可以可靠地以编程方式使用的方式找到 OpenGL 实现支持的 GLSL 版本?

是获取GL_SHADING_LANGUAGE_VERSION 字符串并尝试解析它的最佳方式吗?可以依靠它以明确定义的格式返回吗?我的 Intel 驱动程序返回 1.20,这很容易解析,但我的 nVidia 卡返回 4.20 NVIDIA via Cg compiler。可以相信(\d+)\.(\d+)( .*)? 正则表达式匹配吗? This answer 似乎另有说明,返回OpenGL ES GLSL ES 1.0

这些是否正确,和/或有其他方法吗?具体来说,我想检查一下,至少支持 GLSL 1.20。

【问题讨论】:

【参考方案1】:

OpenGL 版本和支持的 GLSL 版本之间存在特定的映射关系:

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

有一个定义良好的 API 用于查询 OpenGL 版本。使用上表映射到 GLSL 版本(在 OpenGL-3.3 之后非常符合逻辑)。

此外,规范定义了 GL_VERSION 和 GL_SHADING_LANGUAGE_VERSION 的格式

以版本号开头。版本号使用以下形式之一:

major_number.minor_number | major_number.minor_number.release_number

【讨论】:

关于OpenGL版本和GLSL版本的映射,是不是真的不仅某个OpenGL版本支持对应的GLSL版本,而且某个GLSL版本only i> 由相应的 OpenGL 版本支持,而以前的版本(作为扩展)从不支持? 至于GL_SHADING_LANGUAGE_VERSION 字符串的格式,这是否意味着我在问题中链接的答案要么报告不准确,要么Apple 不符合要求;还是 GLES 不同? @Dolda2000:自从 OpenGL-3.3 核心以来,所有关于核心元素(如 GLSL)的开发都将产生一个新的 OpenGL 版本。将不再有 GLSL 扩展(当然,供应商特定的扩展除外)。 OpenGL-ES 是一头与 OpenGL 不同规则的野兽。 不过,我对迟到的版本并不真正感兴趣;它们已经包含了我需要和使用的所有功能。我对以更优化的方式支持较旧或功能较少的 OpenGL 实现更感兴趣,例如 OpenGL 2.0/2.1 和现有的各种英特尔 GPU。 @CAMOBAP:虽然理论上您可以通过查询轮询 OpenGL 上下文和 GLSL 编译器支持的版本来获取此信息,但规范的方法是简单地阅读文档。在opengl.org/registry,您可以下载每个 OpenGL 标准和相关规范标准(如 GLSL)的规范,每个标准都定义了它所针对的 OpenGL 版本。例如,第 1 页 上的 GLSL-4.50 规范声明:“本规范中的所有 OpenGL 图形系统规范引用均指向 4.5 版”【参考方案2】:

如果您希望从代码中获取它,请尝试使用 glGetStringGL_SHADING_LANGUAGE_VERSION

http://www.opengl.org/sdk/docs/man/xhtml/glGetString.xml

【讨论】:

【参考方案3】:

初始化 OpenGL 上下文(我使用 SDL2)后,调用 glGetString() 来查询图形卡、渲染器以及 OpenGL 和 GLSL 版本。我在代码下复制我得到的信息。

printf("MESSAGE InceptionGlobals: Creating OpenGL context...\n");
m_contextOpenGL = SDL_GL_CreateContext(m_window);

if (!m_contextOpenGL) 
    printf("ERROR InceptionGlobals: Couldn't create OpenGL context, exiting... %s\n", SDL_GetError());
    SDL_Delay(5000);
    exit(1);


printf("Vendor graphic card: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version GL: %s\n", glGetString(GL_VERSION));
printf("Version GLSL: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));

显卡供应商:NVIDIA Corporation

渲染器:GeForce GT 635/PCIe/SSE2

GL 版本:4.6.0 NVIDIA 388.13

版本 GLSL:4.60 NVIDIA

【讨论】:

以上是关于查找支持的 GLSL 版本的主要内容,如果未能解决你的问题,请参考以下文章

C++ OpenGL 着色版本错误 - 不支持 GLSL x [Ubuntu 16.04]

默认的 GLSL 着色器是啥样的?对于版本 330

错误:不支持 GLSL 3.30。支持的版本有:1.10、1.20、1.30、1.00 ES、3.00 ES、3.10 ES 和 3.20 ES [关闭]

openGL之API学习(一七八)glsl版本功能演变

错误:不支持GLSL 3.30。支持的版本包括:1.10,1.20,1.30,1.00 ES,3.00 ES,3.10 ES和3.20 ES [关闭]

OpenGL 3.+ glsl 兼容性一团糟?