0

在 Windows 上我做

HGLRC glContext       = wglGetCurrentContext();
HDC   deviceGLContext = wglGetCurrentDC();
wglMakeCurrent(glContext, deviceGLContext);

在 Linux 上,有类似的函数分别用于获取当前 GL 上下文和当前设备上下文glXGetCurrentContextglXGetCurrentDisplay。但我坚持

Bool glXMakeCurrent( Display *dpy,
  GLXDrawable drawable,
  GLXContext ctx )

我不知道如何处理第二个参数。我使用Qt做 GUI,但我仍然需要几个 Windows API 函数,其中包括上面提到的三个。

如何以glXMakeCurrent文章开头描述的相同方式进行调用?问题是我不知道如何获得GLXDrawable.

我需要获取一个 GLXContext,然后创建另一个共享显示列表,并使其在另一个线程中成为当前的,将其添加到 OpenCL 上下文属性中。关键是我需要能够使它成为最新的。

4

2 回答 2

0

与 Windows 不同,在 X11 中,您处理的是客户端服务器模型。“显示”表示与 X11 服务器的连接。X11中有Drawables,可以互换使用。一种 Drawable 是 Windows。

您可能想查看 https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/x11argb_opengl 以获取有关如何使用普通 X11/GLX 创建具有透明背景的 OpenGL 窗口的示例,这可以用于合成。

--

更新

我需要获取一个 GLXContext,然后创建另一个共享显示列表,并使其在另一个线程中成为当前的,将其添加到 OpenCL 上下文属性中。关键是我需要能够使它成为最新的。

熟悉的问题。我对此的解决方案是将 QGLWidget 视为上下文。在您的另一个线程中创建另一个 QGLWidget,它将永远不会显示并将可见的 QGLWidget 实例传递给构造函数的共享参数。然后,您可以像使用上下文一样使用 QGLWidget。这很脏,不是很重要,但 Qt 的内部 OpenGL 系统就是这样。

于 2013-07-21T22:28:18.267 回答
0

'GLXDrawable' 是您获得上下文的 X11 窗口。

如果您使用的是 qt,我会假设它会提供一个 'myWindow.makeCurrent()' 函数,或者类似的东西。

您可以使用制作窗口XCreateWindow(还有一个功能可以制作带有较少选项的基本窗口)。在此之前,您需要使用 连接到显示器XOpenDisplay

我在这里的细节很短,因为在 X11 窗口中获取 OpenGL 上下文有很多步骤,虽然不难,但确实涉及很多错误检查。我建议您使用为您处理此问题的库。

于 2013-07-21T22:23:14.903 回答