0

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

在我发现的类似问题(例如foobarbazqux)中,问题普遍不在于首先设置 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 项是使用该上下文创建一个带有glXCreateContextAttribsARB1的上下文。第 4 项取消设置基本上下文(不必要)(glXMakeCurrent再次)。第 5 项是在窗口上设置属性上下文(glXMakeCurrent再次)。

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

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

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

问题:发生了什么事?

1这种间接创建一个虚拟上下文首先加载属性上下文扩展功能在 Windows 上是必要的。为简化代码,我在 Linux 上执行相同的过程。

4

1 回答 1

0

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

于 2015-01-24T22:02:41.223 回答