在LWJGL中更改OpenGL版本

Gre*_*n28 0 java opengl lwjgl

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

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

der*_*ass 5

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

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

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

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

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

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

  • 在Windows上,使用现代GPU和驱动程序,当您使用旧版上下文创建/不请求特定版本/请求版本<GL3时,您仍然通常会获得GPU支持的最高兼容性配置文件.所以当你在那里要求1.0时,最终可以得到4.4.

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

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

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

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

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

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