'glGetString(..)' 在虚拟机中的有效 Linux 上下文上返回空值



我正在调用glGetString(GL_VERSION)以获得我请求的上下文支持的OpenGL版本(我尝试请求GL 2和GL 3上下文,核心和兼容性)。 但是,它不断返回 null。 这应该适用于所有类型的上下文(例如,请参阅 GL 4 文档)。 它在Windows上也可以正常工作。

在类似的问题(例如foo,bar,baz,qux)中,我发现问题普遍不是首先设置GL上下文。 为了确保我这样做,我记录了每个相关的 glX 调用以生成以下输出:

1 Created     basic context 0x17dd9d0                      on display 0x17cdcb0.
2 Setting           context 0x17dd9d0 onto window 77594626 on display 0x17cdcb0.
3 Created attribute context 0x1892e60                      on display 0x17cdcb0.
4 Setting           context     (nil) onto window        0 on display 0x17cdcb0.
5 Setting           context 0x1892e60 onto window 77594626 on display 0x17cdcb0.

第 1 项是glXCreateContext。 该上下文在虚拟窗口(项目 2)上设置为当前 (glXMakeCurrent)。 第 3 项是使用该上下文创建具有glXCreateContextAttribsARB 1 的上下文。 第 4 项取消设置基本上下文(不必要的)(再次glXMakeCurrent)。 第 5 项是将属性上下文设置到窗口上(再次glXMakeCurrent)。

在此之后,立即调用 glGetString 并返回 null。 根据文档,这意味着发生了错误。 但是,与glGetError一起检查不会产生错误。 如果我没有得到字符串并继续绘制,一切正常,表明属性上下文确实设置正确且合法。

我能想到的唯一因素可能会影响这一点:

  1. Linux在VirtualBox VM中运行。 我还没有测试过真正的发行版,但目前会这样做。
  2. 设置上下文的窗口是不显示的虚拟窗口。 但是,它使用 XMapWindow/XUnmapWindow 映射/取消映射,以便 X 服务器知道它。

问题:这是怎么回事?

1这种先创建虚拟上下文以加载属性上下文扩展函数的间接方式在 Windows 上是必需的。 为了代码简单起见,我在 Linux 上执行相同的过程。

创建 OpenGL 上下文后,您必须使其在正在运行的线程中具有当前状态并使用可绘制对象。使用 glXMakeCurrent 或 glXMakeContextCurrent。

最新更新