在Linux上创建当前的OpenGL上下文

时间:2013-07-21 21:56:45

标签: linux qt opengl

在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上下文属性。关键是我需要能够使它成为最新的。

2 个答案:

答案 0 :(得分:0)

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

如果您正在使用qt,我会假设它会提供一个'myWindow.makeCurrent()'函数,或其他效果。

您可以使用XCreateWindow创建一个窗口(还有一个用于创建具有较少选项的基本窗口的功能)。在此之前,您需要使用XOpenDisplay与显示器建立连接。

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

答案 1 :(得分:0)

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

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

-

更新

  

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

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