у меня есть Window
идентификатор для окна X11. Я не настраивал это окно, я просто могу получить его идентификатор (и я полагаю, visual
Я бы). Как я могу настроить контекст OpenGL для этого окна?
В частности, я хочу использовать glXMakeCurrent
, но эта функция получает Display
а также GLXContext
объекты. Я могу создать контекст, используя glXCreateContext(display, vi, 0, GL_TRUE);
но опять мне нужно в Display
а также XVisualInfo
объекты.
Настройка контекста OpenGL в окне X11 покрыта одним из моих примеров кода (основанных на примере FTB / fungus), с заметным отличием, которое использует FBConfig над обычным Visual.
https://github.com/datenwolf/codesamples/blob/master/samples/OpenGL/x11argb_opengl/x11argb_opengl.c
То, что вам дают только окно, а не дисплей, является проблемой. Вы не можете просто обойтись, если окно находится на дисплее по умолчанию, поэтому, где бы вы ни получили это окно, оно также должен дать вам соответствующее подключение дисплея. Простая передача идентификаторов окон — это ошибка в дизайне 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 );
На самом деле это настройка pbuffer, а не окна, но в вашем случае, поскольку вы создали окно и настроили визуальные элементы, вы можете просто пропустить первую часть и продолжить создание контекста opengl.