Библиотека OpenGL является фактическим стандартом в мире профессионалдьной трехмерной графики.
Она позволяет легко работать в реальном времени со сложными трехмерными объектами как на различных
платформах (Windows, UNIX, Mac OS), так и на различных видеоускорителях (GeForce, Radeon, Matrox и др)/
Однако сечас возможности современных графических ускорителей очень быстро растут, причем
этот рост носит не только количественный (быстродействие), но и качественный (новые возможности)
характер.
Стандартных средcтd OpenGL для поддержки этих новых возможностей, к сожалению не достаточно, чтобы
новые аппаратные возможности современных графических ускорителей быстро становились доступными для
программистов (разаработчиков).
Именно с этой целью в библиотеку OpenGL и введено понятие так называемых расширений.
Используя механизм расширений, каждый производитель видеоускорителей может давать возможность
разработчикам сразу начать использовать новые возможности своих продуктов.
При этом достаточно включить поддержку расширения в драйвере ускорителя и опубликовать спецификации расширения.
Разработчики имеют возможность получить полный список всех поддерживаемых ускорителем/драйвером расширений
и использовать их наряду со стандратными функциями и константами библиотеки 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, где
в качестве аргумента служит имя функции.
Удобно сразу ввести указатель на функцию с заданным интерфейсом и в него заносить полученной функцией
wglGetProcAddress значение. Тогда для вызова новых функций можно использовать тот же формат, как и для
стандартные функций OpenGL.
Ниже приводится простой пример.
Здесь можно взять утилиту с сайта DelphiGL, показывающу список всех как всех
изветсных расширений, так и список поддерживаемых расширений для данного видеускорителя и драйвера.
Также эта утилита по клику на название расширения выкачивает полное описание данного расширения.
Обратите внимание, что поддержка расширения зависит не только от используемого видеоускорителя, но также и
от драйвера и настроек. Поэтому по возможности используйте самые свежие драйвера для своего графического
ускорителя.