【发布时间】:2021-07-05 21:18:03
【问题描述】:
更新 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 可移植?
为什么规范在这方面没有帮助?
【问题讨论】:
-
使用兼容性配置文件。例如:OpenGL 4.6 Compatibility Profile Specification - 1.6.1 OpenGL Shading Language:“OpenGL 4.6 的兼容性配置文件也保证支持所有以前版本的 OpenGL 着色语言回到 1.10 版本。”
-
这适用于所有兼容性配置文件。 (我只以4.6为例)
-
您指的是核心配置文件规范。见OpenGL specification - Khronos OpenGL registry
-
OpenGL 2.0 没有核心配置文件。每个兼容性配置文件都支持来自 OpenGL 2.0 的所有指令和着色器。
-
@AILien:我所知道的唯一支持 OpenGL 4.* 但不支持 2.0 的系统是 Mac。在这种情况下,您必须使用核心配置文件,这会自动使代码无法在不支持核心配置文件的机器上运行。除非您为特定目标编写特定的渲染后端,否则无法得到您想要的。