1

我有一个WindowX11 窗口的标识符。我没有设置这个窗口,我只是可以获得它的 id(我想是visualid)。如何为此窗口设置 OpenGL 上下文?

特别是,我想使用glXMakeCurrent,但是这个函数接收DisplayGLXContext对象。我可以使用创建上下文,glXCreateContext(display, vi, 0, GL_TRUE);但我再次需要 inDisplayXVisualInfo对象。

4

2 回答 2

3

这段代码完全创建了一个窗口,并初始化了 opengl 上下文。

Display *dpy( XOpenDisplay( NULL );
int screen = XDefaultScreen( dpy );
const int fbCfgAttribslist[] =
        {
            GLX_RENDER_TYPE, GLX_RGBA_BIT,
            GLX_DRAWABLE_TYPE, GLX_PBUFFER_BIT,
            None
        };
int nElements = 0;
GLXFBConfig * glxfbCfg = glXChooseFBConfig( dpy,
                                      screen,
                                      fbCfgAttribslist,
                                      & nElements );

const int pfbCfg[] =
        {
            GLX_PBUFFER_WIDTH, WINDOW_WIDTH,
            GLX_PBUFFER_HEIGHT, WINDOW_HEIGHT,
            GLX_PRESERVED_CONTENTS, True,
            GLX_LARGEST_PBUFFER, False,
            None
        };
GLXPbuffer pBufferId = glXCreatePbuffer( dpy, glxfbCfg[ 0 ], pfbCfg );


XVisualInfo * visInfo = glXGetVisualFromFBConfig( dpy, glxfbCfg[ 0 ] );

GLXContext  glCtx = glXCreateContext( dpy, visInfo, NULL, True );


glXMakeContextCurrent( dpy,
                       pBufferId,
                       pBufferId,
                       glCtx );

实际上,这是设置一个 pbuffer,而不是一个窗口,但在您的情况下,由于您创建了窗口并设置了视觉效果,您可以跳过第一部分,继续创建 opengl 上下文。

于 2012-10-12T11:27:01.877 回答
2

我的一个代码示例(基于 FTB/fungus 的示例)涵盖了在 X11 窗口上设置 OpenGL 上下文,显着的区别在于使用 FBConfig 而不是常规的 Visual。

https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c

你只得到一个窗口,而不是一个显示是一个问题。你不能只是假设窗口在默认显示上,所以无论你从哪里得到那个窗口,它也必须给你相应的显示连接。对于 X11,仅仅传递窗口 ID 是 API 设计的失败。

于 2012-10-12T13:25:07.943 回答