Используйте функции pglQueryCapability() и pglQueryVersion() для определения того, поддерживается ли OpenGL на данной машине и, если так, как она поддерживается и какая версия присутствует. pglChooseConfig() возвращает указатель на структуру VISUALCONFIG, описывающую визуальную конфигурацию, наилучшим образом подходящую к заданным клиентом атрибутам. Список отдельных визуальных конфигураций, поддерживаемых графическим устройством можно получить с помощью pglQueryConfigs().
Управление визуализацией
PGL предоставляет несколько функций для создания и управления контекстом визуализации OpenGL, захвата содержимого битовой карты, синхронизации потоков Presentation Manager и OpenGL, переключения буферов, использования цветовой палитры и использования логического шрифта OS/2.
Управление контекстом визуализации OpenGL
Контекст визуализации OpenGL создается с помощью функции pglCreateContext(). Один из аргументов этой функции позволяет запросить непосредственный контекст, который, минуя GPI, производит визуализацию прямо в окно PM, что обычно происходит быстрее. Вы можете определить, является ли контекст непосредственным с помощью функции pglIsDirect().
Чтобы сделать контекст текущим, используйте pglMakeCurrent(); pglGetCurrentContext() возвращает текущий контекст. Вы также можете получить текущее окно с помощью pglGetCurrentWindow(). Вы можете копировать значения переменных состояния OpenGL с помощью pglCopyContext(). Когда вы закончите работы с контекстом OpenGL, вы можете удалить его с помощью pglDestroyContext().
Доступ к битовой карте переднего буфера
Для доступа к битовому представлению содержимого переднего буфера используйте функцию pglGrabFrontBitmap(). В качестве части этой функции вызывается команда glFlush() после чего вы можете получить доступ к битовой карте, но она будет доступна только для чтения. Немедленно после того, как доступ завершен, вы должны
вызвать функцию pglReleaseFrontBitmap() для восстановления режима записи в передний буфер.
Синхронизация исполнения
Во избежании запросов об исполнении функций GPI до того, как визуализация OpenGL закончится, вызовите pglWaitGL(). В этом случае гарантируется, что все вызванные команды OpenGL будут выполнены до того, как начнут исполняться функции визуализации GPI, вызванные после pglWaitGL(). Для предотвращения исполнения последовательностей команд OpenGL перед исполнением вызванных ранее функций визуализации GPI, используйте pglWaitPM(). В этом случае гарантируется, что все вызванные функции GPI будут выполнены до того, как начнут исполняться команды визуализации OpenGL, вызванные после pglWaitPM().
Замечание: Визуализации OpenGL и GPI могут интегрироваться, только если контекст является опосредованным.
Переключение буферов
Для окон с двойной буферизацией передний и задний буферы можно поменять местами с помощь функции pglSwapBuffers(). glFlush() выполняется как часть этой функции.
Использование цветовой палитры
Когда вы работаете в 8-битном режиме (с 256 цветами), вы должны позаботиться об управлении цветовой палитрой. Для окон с индексной визуальной конфигурацией вызовите pglSelectColorIndexPalette(), чтобы сообщить OpenGL о том, какую палитру вы хотите использовать с вашим контекстом. Цветовая палитра должна быть выбрана до того, как контекст будет изначально связан с окном. В RGBA режиме OpenGL настраивает палитру автоматически.
Использование логического шрифта OS/2
Простой путь использования шрифтов OS/2 предоставляется с помощью функции pglUseFont(). Эта функция строит списки отображения для каждого запрошенного шрифта и его размера, каждый из которых вызывает glBitmap().
Прототипы PGL
Инициализация
Определить, поддерживается ли OpenGL и, если да, то какой версии:
long pglQueryCapability (HAB hab);
void pglQueryVersion (HAB hab, int *major, int *minor);
Выбор визуальной конфигурации:
PVISUALCONFIG pglChooseConfig (HAB hab, int *attribList);
bool pglUseFont (HAB hab, HPS hps, FATTRS *fontAttribs, long logicalID, int first, int count, int listBase);
WGL: Расширения OpenGL для Microsoft Windows 95/98/NT
Визуализация OpenGL поддерживается на системах с Microsoft Windows 95, 98 и NT. Для инициализации формата пикселей, управления визуализацией и получения доступа к расширениям OpenGL необходимы функции библиотеки Win32. Для полной поддержки OpenGL был добавлен ряд функций с префиксом wgl.
Ключевой структурой данных для управления форматом пикселей окна OpenGL в
системе Win32/WGL является PIXELFORMATDESCRIPTOR. Переменная типа
PIXELFORMATDESCRIPTOR хранит информацию о формате пикселей, включая тип пикселей (индексные или RGBA), тип буферизации (однократная или двойная), разрешение цветов, а также наличие буферов глубины, трафарета и аккумуляции.
Для получения более подробной информации о WGL вам следует начать с технических статей, доступных через веб – сайт Microsoft Developer Network.
Инициализация
Для получения информации о версии используйте функцию GetVersion() или более новую GetVersionEx(). ChoosePixelFormat() пытается найти
PIXELFORMATDESCRIPTOR с заданными атрибутами. Если совпадение найдено, следует вызвать SetPixelFormat() для перехода к использованию этого формата пикселей. Вы
должны выбрать формат пикселей в контексте устройства до вызова wglCreateContext().
Если вы хотите получить подробную информацию о полученном формате пикселей,
используйте DecribePixelFormat() или, для оверлеев, wglDescribeLayerPlane().
Управление визуализацией
Несколько функций WGL предоставлены для создания и управления контекстом OpenGL, визуализации на битовую карту, переключения буферов, установки цветовой палитры и использования растровых или векторных шрифтов.
Управление контекстом визуализации OpenGL
Для создания контекста OpenGL, рисующего на устройстве с выбранным в контекст устройства нужным форматом пикселей применяется функция wglCreateContext(). (Для создания контекста визуализации для окон – оверлеев используется wglCreateLayerContext().) Чтобы сделать контекст текущим, используйте wglMakeCurrent(); wglGetCurrentContext() возвращает текущий контекст. Вы также можете получить текущий контекст устройства с помощью wglGetCurrentDC(). Вы можете копировать некоторые переменные состояния OpenGL из контекста в контекст с
помощью wglCopyContext() или разделять списки отображения или текстурные объекты с помощью wglShareLists(). Когда вы закончите работы с контекстом визуализации, вы можете уничтожить его функцией wglDestroyContext().
Доступ к расширениям OpenGL
Для доступа к специфичным для реализации функциям расширений OpenGL используйте функцию wglGetProcAddress(). Для определения того, какие расширения поддерживаются реализацией OpenGL, используйте glGetString(GL_EXTENSIONS). Если передать функции wglGetProcAddress() имя функции расширения (например «glMinmax» или «glConvolution2D») она возвратит фактический указатель на эту функцию внутри библиотеки, если таковая функция там есть или NULL, если расширение не поддерживается.
Визуализация на битовой карте
Win32 включает несколько функций для выделения и освобождения памяти под битовые карты, на которые визуализация OpenGL может производиться непосредственно. CreateDIBBitmap() создает зависимую от устройства битовую карту (Device Dependent Bitmap – DDB) из независимой от устройства битовой карты (Device Independent Bitmap – DIB). CreateDibSection() создает независимую от устройства битовую карту, на которую приложение может писать непосредственно. Когда вы закончите работу с картой, вы можете освободить память с помощью DeleteObject().
Синхронизация исполнения
Если вы хотите комбинировать визуализацию GDI и OpenGL, имейте в виду, что в Win32
не функций аналогичных glXWaitGL(), glXWaitX() или pglWaitGL(). Хотя glXWaitGL() отсутствует в Win32, вы можете добиться того же эффекта с помощью glFinish(), которая заставляет приложение ждать, когда исполнятся все ожидающие команды OpenGL или GdiFlush(), которая заставляет приложение ждать, когда завершаться все ожидающие функции GDI.
Переключение буферов
Для окон с двойной буферизацией передний и задний буферы могут быть переключены с помощью SwapBuffers() или wglSwapLayerBuffers() последняя используется для оверлеев.
Управление цветовой палитрой
Для доступа к цветовой палитре стандартных (не оверлейных) битовых поверхностей используйте стандартные функции GDI для установки вхождений в палитру. Для оверлеев используйте wglRealizeLayerPalette(), которая отображает вхождения их палитры индексного слоя на физическую палитру или инициализирует палитру RGBA
слоя. wglGetLayerPaletteEntries() и wglSetLayerPaletteEntries() используются для установки и получения вхождений в цветовую палитру слоев.
Использование растрового или векторного шрифта
В WGL есть две функции wglUseFontBitmaps() и wglUseFontOutlines(), для
конвертирования системных шрифтов в формы пригодные для использования в OpenGL. Обе функции строят списки отображения для каждого символа запрошенного шрифта и его размера.