10

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

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

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

4

3 回答 3

17

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
于 2013-09-26T07:53:28.003 回答
0

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

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

于 2013-09-26T07:53:05.670 回答
0

初始化 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 英伟达

于 2019-05-03T00:23:48.990 回答