Главная -
Статьи -
Проекты -
Ссылки -
Скачать -
Из гельминтов -
Юмор, приколы -
Почитать -
Обо мне -
Мысли -
Гостевая -

Расширения OpenGL

Библиотека 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.

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

void	printExtList ( const char * extension )
{
    char   name [1024];                   // hope this will be enough

    printf ( "Supported extensions:\n" );

    for ( int i = 0, j = 0; extension [i] != '\0'; i++ )
        if ( !isspace ( extension [i] ) )
            name [j++] = extension [i];
        else                               // end of name
        {
            name [j] = '\0';               // terminate name

            printf ( "\t%s\n", name );

            j = 0;
        }

    if ( j > 0 )
    {
        name [j] = '\0';

        printf ( "\t%s\n", name );
    }
}

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

Ниже приводится простая функция, проверяющая поддерживается лиданное расширения.

bool	isExtensionSupported ( const char * ext )
{
    const char * extensions = (const char *)glGetString ( GL_EXTENSIONS );
    const char * start      = extensions;
    const char * ptr;

    while ( ( ptr = strstr ( start, ext ) ) != NULL )
    {
                                            // we've found, ensure name is exactly ext
        const char * end = ptr + strlen ( ext );

        if ( isspace ( *end ) || *end == '\0' )
            return true;

        start = end;
    }

    return false;
}

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

int glutExtensionSupported ( char * extension );

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

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

Как уже говорилось, новые расширения могут вводить как новые функции, так и новые константы. Список вводимых констант и интерфейсов функций можно найти в постоянно обновляемых файлах glext.h wglext.h (для платформы Windows). Наиболее свежие версии этих файлов можно взять здесь.

Для получения адресов вводимых расширениями функций следует использовать функция wglGetProcAddress, где в качестве аргумента служит имя функции.

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


#include	<glext.h>

PFNGLFOGCOORDFPROC	glFogCoordf = NULL;

if ( isExtensionSupported ( "GL_EXT_fog_coord" ) )
	glFogCoordf = (PFNGLFOGCOORDFPROC) wglGetProcAddress ( "glFogCoordf" );

...

glFogCoordf ( 0.5f );

...

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

Обратите внимание, что поддержка расширения зависит не только от используемого видеоускорителя, но также и от драйвера и настроек. Поэтому по возможности используйте самые свежие драйвера для своего графического ускорителя.


Copyright © 2003 Алексей В. Боресков