当前位置: 首页 > 知识库问答 >
问题:

使用哪些GLSL版本以实现最大兼容性

隆扬
2023-03-14

更新2

我想我的问题可能真的是,“我如何编写在任何至少支持OpenGL 2.0的机器上运行的OpenGL代码?请记住,兼容性配置文件不保证可用。

更新 1:

Rabbid76 建议使用特定的核心配置文件或使用兼容性配置文件。

兼容性配置文件不保证可用,所以假设我选择使用OpenGL 3.3核心配置文件作为最低要求。难道我还需要写三个不同版本的GLSL着色器吗?

  • 适用于OpenGL 3.3的3.30
  • 适用于OpenGL 4.0的4.00
  • 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

请注意,在 OpenGL 4.2 之前,向后兼容性的保证非常罕见!

因此,如果我想将支持所有OpenGL版本的应用程序返回到2.0,我需要在以下版本中编写每个着色器:

  • 1.10 对于 OpenGL 2.0
  • 1.20 对于 OpenGL 2.2

每个着色器有六个版本!有没有更简单的方法让GLSL便于携带?

为什么规格在这方面如此无益?

共有1个答案

祁正浩
2023-03-14

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

不。

为了使用core 3.3配置文件,您必须要求创建OpenGL的WGL/GLX/EGL系统为您提供您所要求的内容。也就是说,它必须为您提供与core 3.3兼容的core 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的实现都是非常陈旧的,很可能很容易出错。你必须对你的代码进行非常广泛的测试,以便知道它是否能在一堆代码上工作。因此,除非您有足够的资源来购买和测试几十个过时的英特尔集成芯片组,否则最好选择一个更新的版本。

 类似资料:
  • junit-vintage engine是否意味着与JUnit4.12.x之前的版本兼容? 我将异常的来源缩小到VintageTestDescriptor.java中的几行(盯着第86行看) Category在JUnit4.12的实验包中,但似乎在JUnit4.7中没有。我找不到doc上的junit版本的复古引擎是兼容的。

  • 我一直在我的笔记本电脑上使用lwjgl和GLSL 1.3进行一个项目。我的着色器在我的笔记本电脑上编译得很好,但是,当尝试在我的桌面上编译相同的着色器时,它有一个更新的显卡,我收到一个错误,说明着色器无法编译,因为着色器中存在错误。但是,着色器日志不会输出任何错误。我认为GLSL向后兼容它自己。 返回 我假设它与标准的GLSL 3.30相同。这是一个示例vertandfrag着色器,它适用于我的笔

  • 这本书讲述的是 Swift 5.1,它是 Xcode 11 中包含的默认版本。你可以使用 Xcode 11 来编译用 Swift 5.1、Swift 4.2 或 Swift 4 写的代码。 当你使用 Xcode 11 编译 Swift 4 和 Swift 4.2 代码时,大部分 Swift 5.1 的功能是可用的。也就是说,下面的变更仅对 Swift 5.1 或后续版本生效: 返回不透明类型的函数

  • 我正在詹金斯建立一个新的多模块梯度项目,并试图让sonarqube分析它,但我遇到了几个不兼容的问题,我还没有能够解决。 我正在考虑使用 null

  • 问题内容: 其实我有点困惑。尽管我阅读了一些有关此的资源。 要使用 ChromeBrowser 测试 Selenium 3, 我们需要一个名为 ChromeDriver 的附加应用。 我从GitHub找到了这段文字: ChromeDriver仅与Chrome 12.0.712.0版或更高版本兼容。如果您需要测试旧版的Chrome,请使用Selenium RC和Selenium支持的WebDrive

  • 最后,我在Hibernate的发布说明中搜索了。0版本,也没有成功:似乎发布说明只描述了自上一个RC或beta发布以来的变化...我尝试跟踪4.3.0.final和4.2.0.final的所有RC和beta版本,但没有找到这样的提及。 我们目前使用的是Hibernate 4.2.12.final,我想知道我们是否可以开始使用java8,或者是否需要升级到Hibernate的新版本(大概是4.3.x