Steps3D - Tutorials - OpenGL extensions

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

Кожне розширення визначається своїм назвою (рядком, наприклад, GL_EXT_fog_coord). Назва починається з префікса (GL, WGL, GLX), далі йде тип розширення (ARG, EXT. NV, ATI та ін), після цього йде власне сама назва розширення.

Така схема дозволяє виробникам графічних прискорювачів самим розробляти та вносити у свої продукти нові розширення, не побоюючись конфліктів із вже існуючими розширеннями інших виробників.

Тим не менш, існує структура, звана OpenGL Architecture Review Board, яка веде облік всіх існуючих розширень і займається їх стандартизацією.

Нижче наведено таблицю стандартних типів розширень.

Тип Значення
ARBРозширення введені OpenGL Architecture Review Board
EXTРозширення спільно введені різними виробниками
3DFXРозширення, введені компанією 3DFX
APPLEРозширення, введені компанією Apple
ATIРозширення, введені компанією ATI
HPРозширення, введені компанією Hewlett-Packard
IBMРозширення, введені компанією Internation Buisness Machines
KTXРозширення, введені компанією Kinetix
INTELРозширення, введені компанією Intel
NVРозширення, введені компанією NVIDIA
MESAРозширення, введені в реалізація Mesa
SGIРозширення, введені компанією Silicon Graphics
SGIXРозширення, введені компанією Silicon Graphics
SUNРозширення, введені компанією Sun Microsystems
WINРозширення, введені компанією Microsoft
Повний список усіх розширень можна знайти в OpenGL Extension Registry

Для отримання списку всіх розширень використовується функція glGetString із параметром GL_EXTENSIONS. В результаті повертається покажчик на рядок , що містить списку всіх розширень OpenGL, що підтримуються в даному контексті, розділених пробілами.

Зверніть увагу, що для отримання цього рядка спочатку потрібно проініціалізувати OpenGL, інакше ви отримаєте NULL.

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

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

Нижче наводиться проста функція, що перевіряє підтримується лідане розширення.

Для перевірки підтримки розширення також можна використовувати функцію glutExtensionSupported з бібліотеки glut.

Ця функція повертає ненульове значення, якщо це розширення підтримується.

Однак при цьому слід мати на увазі, що на момент її виклику активне вікно має існувати і бути валідним. З іншого боку, ця функція підтримує лише розширення самого OpenGL, тобто. системні розширення (наприклад GLX) цією функцією неперевіряються.

Як мовилося раніше, нові розширення можуть запроваджувати як нові функції, і нові константи. Список констант, що вводяться, і інтерфейсів функцій можна знайти в постійно оновлюваних файлах glext.h wglext.h (для платформи Windows). Найсвіжіші версії цих файлів можна взяти тут.

Зручно ввести вказівник на функцію із заданим інтерфейсом і в нього заносити отриманої функцією wglGetProcAddress значення. Тоді для виклику нових функцій можна використовувати той самий формат, як і для стандартних функцій OpenGL. Нижче наводиться простий приклад.

Тут можна взяти утиліту з сайту DelphiGL, що показує список всіх як відомих розширень, так і список підтримуваних розширень для даного виду прискорювача і драйвера. Також ця утиліта на кліку на назву розширення викачує повний опис даного розширення.