【问题标题】:Query highest supported OpenGL version before context initialization?在上下文初始化之前查询支持的最高 OpenGL 版本?
【发布时间】:2018-09-26 11:39:09
【问题描述】:

我想知道是否有办法(理想情况下是跨平台,但如果不只是兼容 POSIX 或至少在 Linux 中)查询当前系统中支持的最高 OpenGL 版本。

我希望能够将 GLFW 窗口实例化为支持的最高版本,而不是盲目地尝试不同的版本,直到允许有效的上下文初始化。

编辑:

假设我没有创建上下文。想象一下,我想复制 glxinfo 所做的事情。换句话说,我希望能够在不创建上下文的情况下查询已安装的 OpenGL 版本。

【问题讨论】:

标签: c++ linux opengl glfw


【解决方案1】:

当您要求 X.Y 版本时,您并不是在要求 X.Y 版本;您要求至少版本 X.Y。允许实现为您提供向后兼容 X.Y 的最高版本。

因此,如果您要求 3.3 核心配置文件,您可能会得到 4.6 核心配置文件。返回较低版本的实现没有意义。

因此,只需针对最低 OpenGL 版本编写代码,然后提出要求。你会得到实现给你的任何东西,你可以在以后查询你得到的东西。


想象一下,我想复制 glxinfo 的功能。

glxinfo 通过创建上下文来完成它的工作。只需look at its source code

但是,GLX_MESA_query_renderer extension 确实允许询问将为特定显示/屏幕/渲染器组合创建的上下文。当然,这只适用于 MESA;未通过 MESA 系统的驱动程序将无法通过此查看。

【讨论】:

  • 如果我查询 3.3 版本并且最高版本是旧版 OpenGL 会怎样?
  • @Makogan:那你没有得到有效的上下文; GLFW 产生错误。如果您要求的东西无法提供,那么它不会提供。
【解决方案2】:

您是否尝试过在不查询特定版本的情况下创建 OpenGL 上下文?

当我使用原生 OpenGL 函数(glxCreateContext() 或 wglCreateContext())创建新的 OpenGL 上下文时,它们总是创建一个具有我的显卡支持的最高 OpenGL 版本 (4.6) 的上下文。

我不知道 GLFW 是否有同样的行为......

回答问题编辑: 在不创建上下文的情况下查询任何 OpenGL 信息是不可能的,因为您无法在不创建上下文的情况下调用任何glXXX() 函数。您可以改为创建一个 dummy 上下文(不向用户显示,但保留在内存中的某个位置)来查询您想要的所有 OpenGL 信息,并在完成后将其删除(不用担心关于它,许多软件、库和游戏引擎都这样做,甚至我的own)

【讨论】:

  • "他们总是使用我的显卡 (4.6) 支持的最高 OpenGL 版本创建上下文。“当然。如果您想要兼容性配置文件。
  • @NicolBolas,然后有可能首先在兼容性配置文件中创建一个上下文以获得最高版本,然后通过在核心配置文件中查询这个最高版本来创建一个新上下文。
  • @na2axl:或者您可以只要求您编写代码的版本并继续您的生活;)
  • @na2axl 我应该在源代码中的哪个文件中查找 opengl 上下文创建?
  • 当然@Makogan,here 你会发现我是如何在删除之前创建一个用于查询信息的虚拟 GL 上下文,希望这会有所帮助......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2013-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多