Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

RedBook

.pdf
Скачиваний:
18
Добавлен:
11.06.2015
Размер:
7.43 Mб
Скачать

Инициализация

Используйте функции 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);

PVISUALCONFIG pglQueryConfigs (HAB hab);

Управление конфигурацией

Управление контекстами и их опрос:

HGC pglCreateContext (HAB hab, PVISUALCONFIG pVisualConfig, HGC shareList, bool isDirect);

bool pglDestroyContext (HAB hab, HGC hgc);

bool pglMakeCurrent (HAB hab, HGC hgc, HWND hwnd); long pglIsDirect (HAB hab, HGC hgc);

HGL pglGetCurrentContext (HAB hab);

HWND pglGetCurrentWindow (HAB hab);

Доступ и освобождение битовой карты переднего буфера:

bool pglGrabFrontBitmap (HAB hab, HPS *hps, HBITMAP *phbitmap);

bool pglReleaseFrontBitmap (HAB hab);

Синхронизация исполнения: HPS pglWaitGL (HAB hab);

void pglWaitPM (HAB hab);

Поменять местами передний и задний буферы: void pglSwapBuffers (HAB hab, HWND hwnd);

Выбрать палитру:

void pglSelectColorIndexPalette (HAB hab, HPAL hpal, HGC hgc);

Использовать логический шрифт OS/2:

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. Обе функции строят списки отображения для каждого символа запрошенного шрифта и его размера.

Прототипы WGL

Инициализация

Получить информацию о версии:

BOOL GetVersion (LPOSVERSIONINFO lpVersionInformation);

BOOL GetVersionEx (LPOSVERSIONINFO lpVersionInformation);

Выбор формата пикселей:

int ChoosePixelFormat (HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd);

BOOL SetPixelFormat (HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd);

int DescribePixelFormat (HDC hdc, int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd);

BOOL wglDescribeLayerPlane (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd);

Управление визуализацией

Создание и опрос контекстов устройства OpenGL:

HGLRC wglCreateContext (HDC hdc);

HGLRC wglCreateLayerContext (HDC hdc, int iLayerPlane);

BOOL wglShareLists (HGLRC hglrc1, HGLRC hglrc2);

BOOL wglDeleteContext (HGLRC hglrc);

BOOL wglCopyContext (HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask);

BOOL wglMakeCurrent (HDC hdc, HGLRC hglrc);

HGLRC wglGetCurrentContext (void);

HDC wlgGetCurrentDC (void);

Доступ к функциям расширений:

PROC wglGetProcAddress (LPCSTR lpszProc);

Создание битовых карт:

HBITMAP CreateDIBitmap (HDC hdc, CONST BITMAPINFOHEADER *lpbmih, DWORD fdwInit, CONST VOID *lpbInit, CONST BITMAPINFO *lpbmi, UINT fuUsage);

HBITMAP CreateDIBSection(HDC hdc, CONST BITMAPINFO *pbmi, UINT iUsage, VOID **ppvBits, HANDLE hSection, DWORD dwOffset);

BOOL DeleteObject (HGDIOBJ hObject);

Поменять местами передний и задний буферы:

BOOL SwapBuffers (HDC hdc);

BOOL wglSwapLayerBuffers (HDC hdc, UINT fuPlanes);

Управление цветовой палитрой для оверлеев:

int wglGetLayerPaletteEntries (HDC hdc, int iLayerPlane, int iStart, int cEntries, CONST COLORREF *pcr);

int wglSetLayerPaletteEntries (HDC hdc, int iLayerPlane, int iStart, int cEntries, CONST COLORREF *pcr);

BOOL wglRealizeLayerPalette(HDC hdc, int iLayerPlane, BOOL bRealize);

Использование шрифтов:

BOOL wglUseFontBitmaps (HDC hdc, DWORD first, DWORD count, DWORD listBase);

BOOL wglUseFontOutlines(HDC hdc, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf);

Соседние файлы в предмете Компьютерная Графика