在LWJGL中更改OpenGL版本

所以我一直想知道如何在lwjgl中更改openGL版本..我知道我可以用维基上的PixelFormat和ContextAttribs更改版本http://lwjgl.org/wiki/index.php?title=Version_selection

但是如果我想把它降到更低的话,那只能把我降到最低3.2? 喜欢2.1甚至1.1? 有没有办法做到这一点?

嗯,OpenGL上下文版本背后的逻辑可能有点令人困惑。 但在历史背景下看到它确实有意义:

回到当天,没有特别的“上下文版本”提示。 只有一种方法可以创建上下文,并且您将获得运行它的特定实现支持的最高版本。 您可以查询版本字符串和扩展字符串,并检查代码实际需要的所有function是否可用。 获得比您真正需要的版本更高的版本从来都不是问题,因为每个新的GL版本都与以前的版本100%向后兼容。 (嗯,理论上,至少)。 它一直保持这种方式直到OpenGL 2.1。

但是,使用OpenGL 3.0,引入了“弃用模型”。 这是第一次将function标记为“已弃用”并计划实际删除。 而且在OpenGL历史上第一次不再保证向后兼容性。 随后,引入了新的上下文创建机制: ARB_create_contextfunction(请参阅wgl版本或glX版本的扩展规范),其中包括请求“上下文版本”的可能性。 现在您遇到的情况是,对GL3和新上下文创建机制一无所知的旧应用程序仍应像以前一样运行。 所以旧方法提供的是与GL 2.1 兼容的东西(或者,如果你有一个非常古老或有限的实现,它只给你一些GL 1.x版本,当更现代的GL 2.xfunction不是支持的)。

使用OpenGL 3.2,引入了上下文配置文件 。 这基本上是ARB最终提出的解决方案,以解决这些兼容性问题。 从GL3.2开始,定义了两个配置文件: 核心兼容性 。 在核心配置文件中,已弃用的东西被删除,而在兼容性配置文件中,您可以获得一些东西,这些内容可以回溯到支持GL中的所有内容。

事情可能很简单,但事实并非如此。 实现者只需要支持核心配置文件,兼容性配置文件是可选的。 这导致了我们现在的情况:根据实现平台,GL上下文的选项会有所不同:

  • 所有主要的桌面平台(Windows,Unix / Linux,OSX)都支持使用旧的上下文创建方法的“遗留”GL。

  • 在Windows上,使用现代GPU和驱动程序,当您使用旧版上下文创建/不请求特定版本/请求版本兼容性配置文件 。 所以当你在那里要求1.0时,你最终会得到4.4。

  • 在OSX上,有一个急剧下降。 Legacy GL创建最多只能为您提供GL2.1。 如果您需要现代GL,您必须要求3.2 核心配置文件。

  • 在Linux上,它取决于您使用的GPU驱动程序。 AMD和NVidia的专有驱动程序的行为类似于Windows案例。 但是,开源mesa3D实现(官方英特尔GPU驱动程序也使用它)确实像OSX那样处理它:只支持核心配置文件。

对于GL开发人员,有几点需要考虑:

  • 您无法在同一应用程序中可靠地混合现代(GL> = 3)和已弃用的旧function,因为这不会在所有平台上都可用(并且规范不要求)。 如果你想进入“现代”路线,请为某些人提供核心资料> = GL 3.2。

  • 如果要使用“遗留”GL,则应限制自己使用GL2.1function集。 您仍然可能最终得到更高版本的一些兼容性配置文件,但您永远不能依赖它 – 至少,如果您不针对特定平台。 但由于GL规范根本不需要实现兼容性配置文件,因此我不建议这样做。 这也意味着在实践中请求兼容性配置文件是非常无用的。

您可以依赖的是:如果您请求了特定的GL版本(可能是配置文件)并且您实际上获得了上下文,它可能不是您要求的版本,但它将是支持您的版本的每个function的版本要求。 (但反过来的结论在一般情况下无效。)