Огляд

OpenGL (інколи до неї відносяться GL) являється високоефективною 3D-орієнтованою системою для створення зображень. Вона доступна у віконній системі X через розширення GLX. Для визначеня чи підтримується розширення GLX у X-сервері, і якщо так, яка його версія, викликайте функції glXQueryExtension і glXQueryVersion.

X-сервери розширені з GLX створюють підмножину їх візуальних компонентів доступних для малювання за допомогою OpenGL. Мальовані елементи, які створені за допомогою цих візуальних компонентів можуть також малюватися за допомогою рендера з ядра X-сервера або будь-якого іншого розширення системи X, яке підтримує візуальні компоненти з ядра системи X.

Розширення GLX додає додаткові буфери до стандартного колірного буферу мальованого. Дані буфери включають задні і допоміжні колірні буфери, буфер глибини, буфер трафарету, і буфер накопичення кольору. Деякі або усі згадані буфери включаються у кожен візуальний компонет X системи, яка підтримує OpenGL.

GLX підтримує малювання у три типи мальованих: вікна, карти пікселів і піксельні буфери. Вікна GLX і карти пікселів являються X-ресурсами, і можуть використовувати малювання за допомогою ядра X, так само як і за допомогою OpenGL. Буфери пікселів GLX являються єдиними ресурсами GLX і можуть не допускати малювання за допомогою ядра X.

Для малювання з використанням OpenGL у мальоване GLX, ви повинні визначити відповідний GLXFBConfig, який підтримує функції малювання, які вимагає ваша програма. Функція glXChooseFBConfig повертає GLXFBConfig, який співпадає з необхідними атрибутами або NULL, якщо знайдено жодне співставлення. Повний список підтримуваних GLXFBConfig у сервері можна отримати за допомогою виклику функції glXGetFBConfigs. Атрибути певного GLXFBConfig можуть опитуватися за допомогою виклику функції glXGetFBConfigAttrib.

Необхідно спочатку створити мальоване з візуальним компонентом, який відповідає потребам (використовуючи XCreateWindow або XCreatePixmap, відповідно). Викличте функцію glXGetVisualFromFBConfig для отримання потрібної структури XVisualInfo для створення мальованого системи X. Для піксельних буферів не потребується нижчестояче мальоване.

Щоб створити вікно GLX з X-вікна, викликайте glXCreateWindow. Аналогічно, для створення карти пікселів GLX, викличте glXCreatePixmap. Піксельні буфери створюються за допомогою виклику glXCreatePbuffer. Використовуйте glXDestroyWindow, glXDestroyPixmap, і glXDestroyPbuffer для вивільнення попередньо зайнятих ресурсів.

Контекст GLX необхідний для зв'язування рендера OpenGL з ресурсами GLX. Ресурси GLX і контекст малювання повинні мати сумісні конфігурації GLXFBConfig. Для створення контексту GLX, викличте функцію glXCreateNewContext. Контекст може бути зв'язаний до мальованого GLX, використовуючи glXMakeContextCurrent. Ця пара контекст/мальоване стає поточним контекстом і поточним мальованим, і використовується усіма командами малювання OpenGL поки не викличеться функція glXMakeContextCurrent.

Команди ядра X системи і системи OpenGL можуть використовуватися для оперування над мальованим; однак, потоки команд X і OpenGL не синхронізуються. Синхронізація може безпосередньо вказуватися використовуючи функції glXWaitGL, glXWaitX, XSync і XFlush.

Приклади

Нижче представлений мінімальний приклад створення X-вікна формату RGBA, яке сумісне з OpenGL використовуючи команди GLX 1.3. Вікно очищується жовтим кольором під час запуску програми. Програма виконує мінімальну перевірку на помилки; усі повернені значення повинні бути перевіреними.

#include <stdio.h>
#include <stdlib.h>
#include <GL/gl.h>
#include <GL/glx.h>

int singleBufferAttributess[] = 
{
    GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
    GLX_RENDER_TYPE,   GLX_RGBA_BIT,
	/* Запитати однобуферний колірний буфер */
    GLX_RED_SIZE,      1,
	/* з максимальним числом колірних бітів */
    GLX_GREEN_SIZE,    1,
	/* для кожного компоненту */
    GLX_BLUE_SIZE,     1,
    None
} ;

int doubleBufferAttributes[] = 
{
    GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
    GLX_RENDER_TYPE,   GLX_RGBA_BIT,
	/* Опитати подвійний колірний буфер */
    GLX_DOUBLEBUFFER,  True,
	/* з максимальним числом бітів на компонент */
    GLX_RED_SIZE,      1,
    GLX_GREEN_SIZE,    1, 
    GLX_BLUE_SIZE,     1,
    None
} ;


static Bool WaitForNotify (Display *dpy, 
                           XEvent *event, 
						   XPointer arg ) 
{
    return    (event->type == MapNotify) 
	       && (event->xmap.window == (Window) arg) ;
}

int main (int argc, 
		  char *argv[])
{
    Display              *dpy ;
    Window                xWin ;
    XEvent                event ;
    XVisualInfo          *vInfo ;
    XSetWindowAttributes  swa ;
    GLXFBConfig          *fbConfigs ;
    GLXContext            context ;
    GLXWindow             glxWin ;
    int                   swaMask ;
    int                   numReturned ;
    int                   swapFlag = True ;

    /* Створюємо підключення до X-сервера */
    dpy = XOpenDisplay (NULL) ;
	
    if (dpy == NULL) 
	{
        printf ("Unable to open a connection to the X server\n") ;
        exit (EXIT_FAILURE) ;
    }

    /* Опитуємо необхідну конфігурацію буфера кадру - намагаємось створити
    ** конфігурацію з подвійним буфером */
    fbConfigs = glXChooseFBConfig(dpy,
	                              DefaultScreen(dpy),
                                  doubleBufferAttributes,
								  &numReturned) ;

    if (fbConfigs == NULL)
	{  
      /* немає доступних конфігурацій з подвійним буфером */
      fbConfigs = glXChooseFBConfig(dpy, 
								    DefaultScreen(dpy),
                                    singleBufferAttributess,
									&numReturned) ;
      swapFlag = False ;
    }

	/* Створюємо колірну X-карту і вікно з візуальними компонентами,
	** які відповідають отриманій конфігурації буферів кадру */
    vInfo = glXGetVisualFromFBConfig (dpy, fbConfigs[0]) ;

    swa.border_pixel = 0 ;
    swa.event_mask = StructureNotifyMask ;
    swa.colormap = XCreateColormap(dpy,
	                               RootWindow(dpy, vInfo->screen),
                                   vInfo->visual, 
								   AllocNone) ;

    swaMask = CWBorderPixel | CWColormap | CWEventMask ;

    xWin = XCreateWindow (dpy, RootWindow(dpy, vInfo->screen), 
	                      0, 0, 256, 256,
                          0, vInfo->depth, InputOutput, 
						  vInfo->visual,
                          swaMask, &swa ) ;

	/* Створюємо контекст GLX для малювання за допомогою OpenGL */
    context = glXCreateNewContext(dpy, fbConfigs[0], GLX_RGBA_TYPE,
				                  NULL, True) ;

	/* Створюємо вікно GLX для асоціюваня конфігурації буфера кадру
	** з створеним X-вікном */
    glxWin = glXCreateWindow (dpy, fbConfigs[0], xWin, NULL) ;
    
	/* Проекціюємо вікно на екран, і очікуємо поки воно намалюється */
    XMapWindow (dpy, xWin) ;
    XIfEvent (dpy, &event, WaitForNotify, (XPointer) xWin) ;

	/* Прив'язуємо контекст GLX до вікном */
    glXMakeContextCurrent (dpy, glxWin, glxWin, context) ;

	/* малювання за допомогою OpenGL ... */
    glClearColor (1.0, 1.0, 0.0, 1.0) ;
    glClear (GL_COLOR_BUFFER_BIT) ;

    glFlush () ;
    
    if (swapFlag)
    { glXSwapBuffers (dpy, glxWin) ; }

    sleep (10) ;
    exit (EXIT_SUCCESS) ;
}

 

Нотатки

Колірна X-карта повинна бути створеною і переданою до XCreateWindow.

Контекст GLX повинен створюватися і прив'язуватися до мальованого GLX перед тим, як виконуються команди OpenGL. Команди OpenGL викликані коли жодна пара контекст/мальоване являється поточною, спричиняє невизначену поведінку.

Події відображення вказують, що усі асоційовані буфери з вказаним вікном можуть бути пошкодженими і повинні перемальовуватися. Хоча деякі буфери деяких візуальних компонентів на деяких системах можуть не вимагати перемальовування (наприклад, буфер глибини), це не коректно розробляти програму, яка припускає, що ці буфери не будуть пошкодженими.

Команди GLX утилізують структури XVisualInfo, а не вказівники на візуальні компоненти або ідентифікатори visualID безпосередньо. Структури XVisualInfo вміщують елементи visual, visualID, screen і depth, так само як іншу специфічну для X системи інформацію.

Використання GLX розширень

Усі підтримувані розширення GLX будуть мати відповідні визначення у файлі glx.h і тег у рядку символів, які описують розширення повернений за допомогою функції glXQueryExtensionsString. Наприклад, якщо підтримується EXT_visual_info, тоді цей тег буде визначений у файлі glx.h, і рядок EXT_visual_info буде з'являтися у рядку символів повернених за допомогою функції glXQueryExtensionString. Визначення у файлі glx.h можуть використовуватися під час стадії компіляції програми для визначення, чи виклики процедур, які належать розширенню, існують у бібліотеці.

Система OpenGL також може розширюватися.

GLX 1.1, GLX 1.2 і GLX 1.3

GLX 1.3 зараз підтримується і є сумісне з GLX 1.1 і GLX 1.2. Воно впроваджує нову функціональність (наприклад для GLXFBConfig), яке замінює функціональність GLX 1.2. Підтримуються команди GLX 1.2, але їхнє використання у нових програмах, які розробляються не рекомендується.

GLX 1.3 відповідає системі OpenGL версій 1.2 і впроваджує наступні нові команди: glXGetFBConfigs, glXGetFBConfigAttrib, glXGetVisualFromFBConfig, glXCreateWindow, glXDestroyWindow, glXCreatePixmap, glXDestroyPixmap, glXCreatePbuffer, glXDestroyPbuffer, glXQueryDrawable, glXCreateNewContext, glXMakeContextCurrent, glXGetCurrentReadDrawable, glXGetCurrentDisplay, glXQueryContext і glXSelectEvent, glXGetSelectedEvent.

GLX 1.2 відповідає системі OpenGL версії 1.1 і впроваджує наступну нову функцію: glXGetCurrentDisplay.

GLX 1.1 відповідає системі OpenGL версії 1.0 і впроваджує наступні нові команди: glXQueryExtensionsString, glXQueryServerString і glXGetClientString.

Викличте функцію glXQueryVersion для визначення під час виконання програми, яка версія GLX доступна. Функція glXQueryVersion повертає версію, яка підтримується на підключенні. Тобто, якщо повертається 1.3, тоді клієнт і сервер підтримують GLX 1.3. Ви також можете перевірити версію GLX під час стадії компіляції програми: GLX_VERSION_1_1 буде визначено у файлі glx.h якщо підтримуються виклики GLX 1.1, GLX_VERSION_1_2 будуть визначені, якщо підтримуються виклики GLX 1.2, і буде визначена константа GLX_VERSION_1_3, якщо підтримуються виклики GLX 1.3.

Перегляньте також

glFinish, glFlush, glXChooseVisual, glXCopyContext, glXCreateContext, glXCreateGLXPixmap, glXCreateNewContext, glXCreatePbuffer, glXCreatePixmap, glXCreateWindow, glXDestroyContext, glXDestroyPbuffer, glXDestroyPixmap, glXDestroyWindow, glXGetClientString, glXGetConfig, glXGetCurrentDisplay, glXGetCurrentReadDrawable, glXGetFBConfigAttrib, glXGetFBConfigs, glXGetProcAddress, glXGetSelectedEvent, glXGetVisualFromFBConfig, glXIsDirect, glXMakeContextCurrent, glXMakeCurrent, glXQueryContext, glXQueryDrawable, glXQueryExtension, glXQueryExtensionsString, glXQueryServerString, glXQueryVersion, glXSelectEvent, glXSwapBuffers, glXUseXFont, glXWaitGL, glXWaitX, XCreateColormap, XCreateWindow, XSync

Оригінал

https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glXIntro.xml