使用哪个 GLSL 版本以获得最大兼容性
Which GLSL versions to use for maximum compatibility
更新 2
我想我的问题可能真的是,“我如何编写可以在任何至少支持 OpenGL 2.0 的机器上运行的 OpenGL 代码?”请记住,不保证兼容性配置文件可用。
更新 1:
Rabbid76 建议使用特定的核心配置文件或使用兼容性配置文件。
不保证兼容性配置文件可用,所以假设我选择使用 OpenGL 3.3 核心配置文件作为最低要求。难道我仍然需要编写三个不同版本的 GLSL 着色器吗?
- 3.30 对于 OpenGL 3.3
- 4.00 对于 OpenGL 4.0
- 4.10 适用于 OpenGL 4.1 及更高版本
从周围的人看来,人们似乎假设 GLSL 3.30 可以在 OpenGL 3.3 和所有更高版本上运行,但似乎没有任何规范在 OpenGL 4.2 之前保证这一点。
这样对吗?
原题:
我已经阅读了各种版本的 OpenGL 规范,但我看不到任何关于 GLSL 支持的向后兼容性的有用保证。
这是我从规格中推断出来的:
- OpenGL 2.0 支持 GLSL 1.10
- OpenGL 2.2 支持 GLSL 1.20
- OpenGL 3.0 支持 GLSL 1.10、1.20 和 1.30
- OpenGL 3.1 支持 GLSL 1.30 和 1.40
- OpenGL 3.2 支持 GLSL 1.40 和 1.50
- OpenGL 3.3 支持 GLSL 3.30
- OpenGL 4.0 支持 GLSL 4.00
- OpenGL 4.1 支持 GLSL 4.10
- OpenGL 4.2 支持 GLSL 4.20 和所有回到 1.40 的版本
- 从 OpenGL 4.2 开始,似乎可以保证对 GLSL 1.40 版的支持。
请注意,在 OpenGL 4.2 之前,向后兼容性的保证非常少见!
因此,如果我想将支持所有 OpenGL 版本的应用程序发布回 2.0,我将需要在以下版本中编写每个着色器:
- 1.10 对于 OpenGL 2.0
- 1.20 对于 OpenGL 2.2 和 3.0
- 1.40 适用于 OpenGL 3.1、3.2 和 4.2 以上版本
- 3.30 对于 OpenGL 3.3
- 4.00 对于 OpenGL 4.0
- 4.10 对于 OpenGL 4.1
这是每个着色器的六个版本!有没有更简单的方法使 GLSL 可移植?
为什么规格在这方面毫无帮助?
Wouldn't it still be the case that I would have to write three different versions of the GLSL shaders?
没有
为了使用核心 3.3 配置文件,您必须请求创建 OpenGL 的 WGL/GLX/EGL 系统为您提供所需的内容。也就是说,它必须为您提供核心 3.3 或与核心 3.3 兼容的任何更高版本的实现。
为了与 3.3 兼容,它必须接受 3.30 版的 GLSL。因此,如果您请求核心 3.3 上下文,并且获得更高版本的有效上下文,则该实现 将 支持 3.30 着色器。
也就是说,仅仅因为特定的标准版本不要求与旧着色器版本兼容并不意味着实现不会提供它。
How do I write OpenGL code that will work on any machine that supports at least OpenGL 2.0?
你不能。至少,并非没有不同的代码路径。
有些实现根本不支持兼容性配置文件。因此,如果您至少不针对 GL 3.2(或他们的最低核心实现版本)进行编码,您的代码将无法在他们的实现上工作。这是不可能的。
一些实现有一个 GL 2.x 实现作为后备,但有一个没有兼容性配置文件的更高核心配置文件实现。您可以使用 2.0 代码访问回退,但没有针对更新内容的扩展或核心功能。
还应注意,大多数仅限于 OpenGL 2.0 的实现都非常陈旧并且很可能很容易出错。您将不得不非常广泛地测试您的代码,以便了解它是否适用于其中的一堆。因此,除非您有资源购买和测试数十种过时的英特尔集成芯片组,否则最好选择更新的版本。
更新 2
我想我的问题可能真的是,“我如何编写可以在任何至少支持 OpenGL 2.0 的机器上运行的 OpenGL 代码?”请记住,不保证兼容性配置文件可用。
更新 1:
Rabbid76 建议使用特定的核心配置文件或使用兼容性配置文件。
不保证兼容性配置文件可用,所以假设我选择使用 OpenGL 3.3 核心配置文件作为最低要求。难道我仍然需要编写三个不同版本的 GLSL 着色器吗?
- 3.30 对于 OpenGL 3.3
- 4.00 对于 OpenGL 4.0
- 4.10 适用于 OpenGL 4.1 及更高版本
从周围的人看来,人们似乎假设 GLSL 3.30 可以在 OpenGL 3.3 和所有更高版本上运行,但似乎没有任何规范在 OpenGL 4.2 之前保证这一点。
这样对吗?
原题:
我已经阅读了各种版本的 OpenGL 规范,但我看不到任何关于 GLSL 支持的向后兼容性的有用保证。
这是我从规格中推断出来的:
- OpenGL 2.0 支持 GLSL 1.10
- OpenGL 2.2 支持 GLSL 1.20
- OpenGL 3.0 支持 GLSL 1.10、1.20 和 1.30
- OpenGL 3.1 支持 GLSL 1.30 和 1.40
- OpenGL 3.2 支持 GLSL 1.40 和 1.50
- OpenGL 3.3 支持 GLSL 3.30
- OpenGL 4.0 支持 GLSL 4.00
- OpenGL 4.1 支持 GLSL 4.10
- OpenGL 4.2 支持 GLSL 4.20 和所有回到 1.40 的版本
- 从 OpenGL 4.2 开始,似乎可以保证对 GLSL 1.40 版的支持。
请注意,在 OpenGL 4.2 之前,向后兼容性的保证非常少见!
因此,如果我想将支持所有 OpenGL 版本的应用程序发布回 2.0,我将需要在以下版本中编写每个着色器:
- 1.10 对于 OpenGL 2.0
- 1.20 对于 OpenGL 2.2 和 3.0
- 1.40 适用于 OpenGL 3.1、3.2 和 4.2 以上版本
- 3.30 对于 OpenGL 3.3
- 4.00 对于 OpenGL 4.0
- 4.10 对于 OpenGL 4.1
这是每个着色器的六个版本!有没有更简单的方法使 GLSL 可移植?
为什么规格在这方面毫无帮助?
Wouldn't it still be the case that I would have to write three different versions of the GLSL shaders?
没有
为了使用核心 3.3 配置文件,您必须请求创建 OpenGL 的 WGL/GLX/EGL 系统为您提供所需的内容。也就是说,它必须为您提供核心 3.3 或与核心 3.3 兼容的任何更高版本的实现。
为了与 3.3 兼容,它必须接受 3.30 版的 GLSL。因此,如果您请求核心 3.3 上下文,并且获得更高版本的有效上下文,则该实现 将 支持 3.30 着色器。
也就是说,仅仅因为特定的标准版本不要求与旧着色器版本兼容并不意味着实现不会提供它。
How do I write OpenGL code that will work on any machine that supports at least OpenGL 2.0?
你不能。至少,并非没有不同的代码路径。
有些实现根本不支持兼容性配置文件。因此,如果您至少不针对 GL 3.2(或他们的最低核心实现版本)进行编码,您的代码将无法在他们的实现上工作。这是不可能的。
一些实现有一个 GL 2.x 实现作为后备,但有一个没有兼容性配置文件的更高核心配置文件实现。您可以使用 2.0 代码访问回退,但没有针对更新内容的扩展或核心功能。
还应注意,大多数仅限于 OpenGL 2.0 的实现都非常陈旧并且很可能很容易出错。您将不得不非常广泛地测试您的代码,以便了解它是否适用于其中的一堆。因此,除非您有资源购买和测试数十种过时的英特尔集成芯片组,否则最好选择更新的版本。