OpenGL,如何设置 GLSL 版本?

Posted

技术标签:

【中文标题】OpenGL,如何设置 GLSL 版本?【英文标题】:OpenGL, how to set up GLSL version? 【发布时间】:2011-11-16 19:37:43 【问题描述】:

我的系统默认使用freeglut的OpenGL和GLSL版本是4.1,同样使用glew,它的初始化、着色器编译和链接、执行都没有问题。

当我没有指定 glutInitContextVersion、glutInitContextFlags 或 glutInitContextProfile 时,会出现此默认版本,然后我的着色器工作正常。

不管我是否支持这个版本,我想提供一个 3.3 的替代方案。当我使用指定 3.3 版本的 glut 上下文时,应用程序启动时没有错误,glew 不会抱怨。我的着色器假设使用 GLSL 3.3 版本,然后我设置行

#version 330

但是当我的着色器被编译时,OpenGL 抱怨一个无效的枚举消息。我尝试删除此行或将其设置为另一个版本,但仍然出现相同的错误。正确完成所有初始化后,我要求 OpenGL 版本,我得到了正确的 3.3,但对于 GLSL 版本,我仍然得到默认的 4.1。

glGetString(GL_SHADING_LANGUAGE_VERSION);

如果正确,请纠正我,我猜这个版本被着色器代码中的版本行覆盖。我想知道是否有机会也初始化指定 GLSL 版本的上下文?

【问题讨论】:

无效枚举错误源自何处?在 gDEBugger 之类的下运行你的程序。 在调用glCreateShader(GL_VERTEX_SHADER); 之后,难道我需要使用宏GL_ARB_vertex_shader or GL_ARB_fragment_shader 吗?但确定 3.3 版本支持 GL_VERTEX_SHADER。同时运行 gDEBugger。 gDEBugger 是一个很棒的工具,还没有找到一个很好的方法来定位问题。但我设法让它在指定以前的 OpenGL 3.1 时工作。这行得通;编译、链接和执行着色器。它拒绝与 3.3 一起工作,为什么会这样? 至少我知道我的显卡支持从 3.0 到 3.3 的版本,我运行 OpenGL Extension Viewer 4.0 并成功测试了这些版本。虽然不确定这个测试是否足以知道我的驱动程序版本是否有问题。很可能是 glut 上下文的初始化问题。 @notNullGothik 而不是“编辑:我解决了它等等”,*** 上的习惯是回答你自己的问题,并接受这个答案。 【参考方案1】:

我终于解决了。如果我将核心配置文件与兼容模式一起设置

glutInitContextProfile(GLUT_CORE_PROFILE | GLUT_COMPATIBILITY_PROFILE);

无法识别 2.1 版本的 OpenGL 命令。这与教程中提供的信息背道而驰。无论如何,只需设置 GLUT_COMPATIBILITY_PROFILE 即可,使用 3.3 或更高版本。

【讨论】:

请注意,在某些系统上,如果您要求提供兼容性配置文件,您将只能使用旧版本的 OpenGL。这不适用于 Windows 或 Linux 上的 AMD 或 Nvidia 驱动程序,但它适用于 Linux 上的 Mesa,它适用于 macOS 上的 OpenGL。

以上是关于OpenGL,如何设置 GLSL 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 glsl 中注册来设置着色器常量?

OpenGL和GLSL中的glTexParameter和过滤?

GLSL 编程思想

openGL之API学习(一七七)opengl gles glsl glsl es版本对应关系

OpenGL与GLSL版本说明

OpenGL 与 GLSL 版本号