C++ 在X11上安装OpenGL

C++ 在X11上安装OpenGL,c++,opengl,x11,C++,Opengl,X11,我有一个X11窗口的标识符。我没有设置这个窗口,我只能获取它的id(我想,visualid)。如何设置此窗口的OpenGL上下文 特别是,我想使用glXMakeCurrent,但此函数接收Display和GLXContext对象。我可以使用glXCreateContext(display,vi,0,GL_TRUE)创建上下文但我需要在中再次显示和XVisualInfo对象。此代码完全创建一个窗口,并初始化opengl上下文 Display *dpy( XOpenDisplay( NULL );

我有一个X11窗口的
标识符。我没有设置这个窗口,我只能获取它的id(我想,
visual
id)。如何设置此窗口的OpenGL上下文


特别是,我想使用
glXMakeCurrent
,但此函数接收
Display
GLXContext
对象。我可以使用
glXCreateContext(display,vi,0,GL_TRUE)创建上下文但我需要在
中再次显示
XVisualInfo
对象。

此代码完全创建一个窗口,并初始化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上下文。

此代码完全创建了一个窗口,并初始化了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上下文。

在X11窗口上设置opengl上下文在我的一个代码示例中介绍(基于FTB/SOURGE的示例),与常规视觉系统相比,使用FBConfig有着显著的区别


只给您一个窗口,而没有显示是一个问题。您不能只是假设窗口在默认显示上,所以无论您从何处获取该窗口,它也必须为您提供相应的显示连接。在X11中,仅仅传递窗口ID是API设计中的一个失败。

在X11窗口上设置OpenGL上下文包含在我的一个代码示例中(基于FTB/SOURG的示例),其中一个显著的区别是使用FBConfig而不是常规的视觉配置

只给您一个窗口,而没有显示是一个问题。您不能只是假设窗口在默认显示上,所以无论您从何处获取该窗口,它也必须为您提供相应的显示连接。对于X11,仅仅传递窗口ID是API设计中的一个失败