我有一个X11 Window的Window
标识符。我没有设置这个窗口,我只能得到它的id(我想,visual
id)。如何为此窗口设置OpenGL上下文?
特别是,我想使用glXMakeCurrent
,但此函数会收到Display
和GLXContext
个对象。我可以使用glXCreateContext(display, vi, 0, GL_TRUE);
创建上下文,但我需要Display
和XVisualInfo
个对象。
答案 0 :(得分: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上下文。
答案 1 :(得分:2)
在X11窗口上设置OpenGL上下文由我的一个代码示例(基于FTB / fungus的示例)所涵盖,与常规Visual使用FBConfig的显着区别。
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c
您只有一个窗口,但不是显示器是一个问题。你不能只是假设窗口在默认显示上,所以无论你从哪个窗口获得,它也必须给你相应的显示连接。当谈到X11时,仅仅传递窗口ID是API设计的失败。