OpenGL 是否始终支持 GLSL 1.30 3.x / 4.x

Is GLSL 1.30 always supported in OpenGL 3.x / 4.x

编辑 2 有人指出,我真正要问的一个问题是:“规范中规定的向上兼容性(关于核心配置文件)是否具有传递性?”我真的很乐意得到这个问题的答案。如果它确实具有传递性,那么如何解释明显的矛盾?

编辑:这不是

的副本

它不是重复的,因为:这个问题是关于一般使用什么版本的 GLSL。这个问题是关于规范中关于何时支持 GLSL 1.30 的矛盾的非常具体的情况。我也更改了标题以澄清。


似乎从 3.1 开始的所有 OpenGL 版本都向后兼容。来自规格:

The OpenGL 4.2 compatibility and core profiles are upward compatible with the OpenGL 4.1 compatibility and core profiles, respectively

The OpenGL 4.1 compatibility and core profiles are upward compatible with the OpenGL 4.0 compatibility and core profiles, respectively

The OpenGL 4.0 compatibility and core profiles are upward compatible with the OpenGL 3.3 compatibility and core profiles, respectively

The OpenGL 3.3 compatibility and core profiles are upward compatible with the OpenGL 3.2 compatibility and core profiles, respectively

The OpenGL 3.2 core profile is upward compatible with OpenGL 3.1, but not with earlier versions

太好了,所以我可以针对 OpenGL 3.1 编写代码,并且它可以在 OpenGL 4.2 实现上运行。

但是 4.2 核心规范还说:

The core profile of OpenGL 4.2 is also guaranteed to support all previous versions of the OpenGL Shading Language back to version 1.40.

3.1 规范说:

OpenGL 3.1 implementations are guaranteed to support at least version 1.30 of the shading language.

那么当 OpenGL 4.2 可能不支持 GLSL 1.30(OpenGL 3.1 支持)时,它怎么能声称与 OpenGL 3.1 向上兼容呢?

我一直对发现的规格不一致感到困惑,并试图进行一些研究。我个人的结论是,确实,OpenGL 规范在这方面使用了 ambiguous/bad wording,这是自 OpenGL 3.2+ 以来引入的(引用的片段从 OpenGL 4.2 Core 开始在 OpenGL 3.2 Core 中引入并保持不变。

OpenGL 3.2 要求实现仅支持 GLSL 1.40 (OpenGL 3.1) 和 GLSL 1.50 (OpenGL 3.2),同时指定它与 OpenGL 3.1 兼容,但不删除已弃用的功能。

OpenGL 3.2 implementations are guaranteed to support versions 1.40 and 1.50 of the OpenGL Shading Language. All references to sections of that specification refer to version 1.50.
...
The core profile of OpenGL 4.6 is also guaranteed to support all previous versions of the OpenGL Shading Language back to version 1.40
...
The OpenGL 3.2 core profile is upward compatible with OpenGL 3.1, but not with earlier versions.

同时,OpenGL 3.0 和 3.1 明确将 GLSL 1.10 (OpenGL 2.0) 和 GLSL 1.20 (OpenGL 2.1) 标记为已弃用(并在 OpenGL 3.1 中删除):

OpenGL 3.1 implementations are guaranteed to support at least version 1.30 of the shading language.
...
The features deprecated in OpenGL 3.0: ... OpenGL Shading Language versions 1.10 and 1.20. These versions of the shading language depend on many API features that have also been deprecated.

但规范并未在弃用上下文中提及 GLSL 1.30 (OpenGL 3.0),因此没有明显的理由考虑弃用 GLSL 1.30(因为专用 GLSL 1.30 规范本身详细说明了弃用的功能)。

您可能还注意到,OpenGL 3.1 不需要支持 GLSL 1.40(尽管本规范引入了它)!因此,在没有 GLSL 1.30 支持(OpenGL 3.1 规范必须支持的唯一版本)的情况下,声明 OpenGL 3.2 与 OpenGL 3.1 是“向上兼容”的,这让我感到困惑。

我猜 “向上兼容” 部分中的 OpenGL 规范作者隐含地引用了非 GLSL 功能,并且设计了专用部分 “实现是有保证的。 .. 着色语言 以阐明对 GLSL 版本的要求,以便后者 支配 超过第一个。

我已经尝试检查手头的 OpenGL 实现,以查看它们对核心配置文件中的不同 GLSL 版本(110、120、130、140、150)、记录的 GLSL 编译警告和启用的调试上下文的说明:

  • NVIDIA (456.71), 英特尔Mesa (20.2.6)
    • GLSL 1.10+ - 对任何已知的 GLSL 版本一言不发
  • AMD
    • GLSL 1.10/GLSL 1.20 - 着色器编译器生成警告
      WARNING: warning(#271) Explicit version number 120 not supported by GL3 forward compatible context;
    • GLSL 1.30+ - 无警告;
  • Apple(金属 71.0.7)
    • GLSL 1.10/1.20/1.30 - 生成着色器编译错误
      ERROR: 0:1: '' : version '130' is not supported
    • GLSL 1.40+ - 没有问题。

因此,似乎 OpenGL 供应商在阅读这部分规范方面尚无定论

NVIDIA 不在乎(他们的 GLSL -> Cg 转换器众所周知会跳过大部分 GLSL 验证),Intel 也不在乎(但他们的 OpenGL 驱动程序从来都不好),还有 Mesa。但这 不违反 OpenGL 规范,因为他们说 OpenGL 实现可能支持除强制性版本之外的任何其他 GLSL 版本。

AMD 众所周知有一个很好的 GLSL 验证器,显然他们的工程师阅读了规范的部分说明 “OpenGL 3.2 Core Profile 应该支持相同的与 OpenGL 3.1 相同,但不推荐使用的功能除外。但是要轻柔地进行 - 没有编译错误,因为只有着色器编译日志表明不应使用 GLSL 1.20(但 GLSL 1.30 可以!)。

众所周知,

Apple 偏执地遵循 OpenGL 规范,并且通常会在每次偏离规范时产生错误。在这里我们看到 Apple 工程师阅读了 OpenGL 3.2 规范的其他部分,将支持的 GLSL 版本列为 1.40 和 1.50 - 因此它不接受 GLSL 1.30。

需要注意的是,大多数厂商在实现了OpenGL 3.0和3.1之后才实现了OpenGL 3.2,所以从1.10开始支持所有GLSL版本对他们来说真的不是什么大问题。

相比之下,Apple 从来没有 OpenGL 3.0/3.1,而是直接实现了 OpenGL 3.2 核心配置文件(对实现兼容配置文件没有任何兴趣)。这就是为什么,我猜,他们更喜欢阅读不支持 GLSL 1.30 (OpenGL 3.1) 的规范。

OpenGL 规范中的一般措辞表明支持的 GLSL 版本范围可能更广,建议查询 GL_SHADING_LANGUAGE_VERSION,但显然,此查询对于检索最小 GLSL 版本或支持版本的完整列表是无用的,并且没有为此目的提供其他 API。因此,人们只能“探测”着色器编译器以查看是否支持特定版本(在强制性版本列表之外)。

从另一方面来看,独立于 OpenGL 的单独 GLSL 版本控制看起来是多余的,因为较新的 GLSL 修订版也与较早的版本兼容(保留已弃用的功能)- 因此没有太多理由在使用 OpenGL 时不强制使用 GLSL 4.20 4.2,只要您不只是尝试验证 GLSL 与旧 OpenGL 版本的兼容性。

实际上,OpenGL 3.2 及其 GLSL 1.50 看起来是更合理的开发基准,因为我真的不知道支持 OpenGL 3.1 但不支持 OpenGL 3.2 Core Profile 的最新实现。