void (_stdcall *glAddSwapHintRectWIN)(GLint.GLint. GLsizei.GLsizei) - NULL Указатель заполняется обращением к функции wglGetProcAddress(), которой передается текстовое название требуемой функции расширения:
glAddSwapHintRectWIN -(void (_stdcall *)(GLint.GLint. GLsizei.GLsizei ))
wglGetProcAddressC'glAddSwapHintRectWIN"):
Уже после этого выполняется вызов функции расширения:
if(glAddSwapHintRectWIN)
gl AddSwapHi ntRectWINC100.50.500.200): SwapBuffers(hDC);
При использовании пакетов разработчика OpenGL SDK в заголовочных файлах присутствуют необходимые объявления указателей, а указатели заполняются стандартными средствами, поэтому разработчик приложений вызывает функции расширения, как обычные функции.
Рисование в битовую карту DIB-формата В предыдущих главах было показано, как средствами GDI можно выполнить вывод примитива не на экран, а в оперативную память. Для этого в функциях вывода примитивов вместо контекста изображения необходимо указать контекст памяти. То же решение применяется при рисовании в битовую карту средствами Использование расширений
OpenGL. Сначала создается контекст устройства hDC и связанный с ним контекст памяти hDCMem. Затем создается или загружается из файла в аппаратно-независи-мом формате битовая карта и связывается с контекстом памяти. И наконец, при инициализации библиотеки везде, где указывался контекст устройства, используется контекст памяти.
Функция инициализации библиотеки для вывода в контекст памяти приведена в листинге 22.11.
Листинг 22.11
HDC hDC; HDC hDCMem;
int StartOpenGKHWND hWnd.HGLRC *hGLRC) {
hDC - GetDC(hWnd);
hDCMem - CreateCompatibleDC(hDC);
HBITMAP h - CreateCompatibleBitmapChDC.
GetSystemMetrics(SM_CXSCREEN). GetSystemMetrics(SM_CYSCREEN)); SelectObject(hDCMem.h); PIXELFORMATDESCRIPTOR pfd; pfd.nSize - sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion - GL_VERSI0N_1_1;
pfd.dwFlags - PFD_SUPPORT_OPENGL|PFD_DRAW_TO_BITMAP|PFD_SUPPORT_GDI;
pfd.iPixel Type - PFD_TYPE_RGBA;
pfd.cColorBits - 32;
pfd.iLayerType - PFD_MAIN_PLANE;
int m_Index - ChoosePixelFormate hDCMem. &pfd):