【问题标题】:Which GLSL versions to use for maximum compatibility使用哪些 GLSL 版本以获得最大的兼容性
【发布时间】: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。在这种情况下,您必须使用核心配置文件,这会自动使代码无法在不支持核心配置文件的机器上运行。除非您为特定目标编写特定的渲染后端,否则无法得到您想要的。

标签: opengl glsl


【解决方案1】:

难道我还要编写三个不同版本的 GLSL 着色器吗?

没有。

为了使用核心 3.3 配置文件,您必须要求创建 OpenGL 的 WGL/GLX/EGL 系统为您提供您所要求的。也就是说,它必须为您提供核心 3.3 或与核心 3.3 兼容的任何更高版本。

为了使实现与 3.3 兼容,它必须接受 3.30 版本的 GLSL。因此,如果您请求核心 3.3 上下文,并且获得更高版本的有效上下文,则该实现支持 3.30 着色器。

也就是说,仅仅因为特定标准版本不强制要求与旧着色器版本兼容并不意味着实现不会提供它。

如何编写可在任何至少支持 OpenGL 2.0 的机器上运行的 OpenGL 代码?

你不能。至少,不是没有不同的代码路径。

某些实现根本不支持兼容性配置文件。因此,如果您不针对至少 GL 3.2(或任何其最低核心实现版本)进行编码,您的代码将无法在其实现上工作。这是不可能的。

某些实现将 GL 2.x 实现作为后备,但具有更高的核心配置文件实现,但没有兼容性配置文件。您可以使用 2.0 代码访问回退,但不能使用新代码的扩展或核心功能。

还应该注意的是,大多数仅限于 OpenGL 2.0 的实现都非常陈旧,而且很容易出错。您必须非常广泛地测试您的代码才能知道它是否适用于其中的一堆。因此,除非您有足够的资源购买和测试数十种过时的英特尔集成芯片组,否则最好选择更新的版本。

【讨论】:

  • 这很有帮助。您能否澄清一下这句话:“因此,如果您不针对至少 GL 3.2 编写代码,则无法在此类实现上运行针对 GL 2.0 编写的代码。”这似乎自相矛盾。
  • @AILien:已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多