我有一个Window
的X11窗口标识符。 我没有设置这个窗口,我可以得到它的ID(我猜想, visual
ID)。 哪有这个窗口,我设置OpenGL上下文?
我特别想用glXMakeCurrent
,但这个函数接收Display
和GLXContext
对象。 余可使用创建上下文glXCreateContext(display, vi, 0, GL_TRUE);
而我又需要在Display
和XVisualInfo
对象。
我有一个Window
的X11窗口标识符。 我没有设置这个窗口,我可以得到它的ID(我猜想, visual
ID)。 哪有这个窗口,我设置OpenGL上下文?
我特别想用glXMakeCurrent
,但这个函数接收Display
和GLXContext
对象。 余可使用创建上下文glXCreateContext(display, vi, 0, GL_TRUE);
而我又需要在Display
和XVisualInfo
对象。
一个X11窗口上设置一个OpenGL上下文是通过我的代码的例子之一(基于由FTB /真菌的例子)覆盖,与所述显着的区别是使用运行fbconfig通过常规的视觉。
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c
你是只给出一个窗口,而不是显示是个问题。 你不能只是到处去承担窗口是默认的显示,所以等。无论您从拿到窗口,它也必须给你相应的显示连接为好。 只是绕过窗口的ID是在API的设计失败,当它涉及到X11。
这充分代码创建一个窗口,并初始化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 );
其实这是建立一个p缓冲器,而不是一个窗口,但在你的情况下,因为你有创建的窗口,和视觉效果设置,你可以跳过第一部分,并与OpenGL上下文创建下去。