Все остальные поля будут установлены функцией SetPi xel Format ( ) по полученному значению m_Index и данным из контекста устройства.
В поле pfd. dwFl ags можно попытаться также задать флаги выбора эффекта переключения страниц. Значение PFD_SWAP_EXCHANGE предусматривает обмен данными между видимой и активной страницами. При этом нельзя указать, что обмен должен выполняться аппаратным переключением страниц. В этом случае после замены страниц поверхность рисования должна содержать предыдущий кадр изображения, который только что был виден на экране. Значение PFD_SWAP_COPY определяет способ замены страниц путем копирования. В результате содержимое поверхности рисования не изменяется.
Указанные флаги на самом деле являются только рекомендацией для системы, так как заданный режим может просто не поддерживаться драйвером.
В структуре PIXELFORMATDESCRIPTOR не предусмотрено полей для задания размеров невидимой страницы, однако есть два варианта выделения памяти для невидимой страницы. В первом из них при инициализации создается BackBuffer размером во весь экран, изображение создается в части буфера, соответствующей положению рабочей области окна, а затем функция SwapBuffersO копирует эту часть в видимую страницу. Либо можно использовать вариант, когда при ини-
Инициализация библиотек и вывод примитивов
циализации BackBuffer создается по размеру рабочей области окна, а при каждом его изменении старый буфер уничтожается и создается новый, размер которого задается параметрами функции gl Viewport О. Первый вариант экономит видеопамять, но проще в реализации. Текстуры тоже хранятся в видеопамяти. Увеличение BackBuffer приведет к увеличению буфера трафарета, Z-буфера, а так как место занято текстурами, то их придется передвигать или даже удалять в системное ОЗУ.
Посмотреть, как будет фактически настроена OpenGL, можно при помощи функции DescribePixelFormat(hDC. mjndex, sizeof (PIXELFORMATDESCRIPTOR). &pfd). Эта функция заполняет структуру pfd фактически установленными параметрами. Анализируя полученные значения полей, разработчик может увидеть, что при инициализации системы всегда задается Z-буфер. Если не заполнить поле pfd.cDepthBits, то будет создан буфер с 16-битными ячейками. Легко также убедиться в том, что заполнение поля pfd.cColorBits в данном случае не имеет смысла. Независимо от того, какое значение будет установлено, в поле запишется количество бит на пиксел, установленное пользователем компьютера при настройке свойств экрана. Изменение формата пиксела разрушило бы изображение в окнах, созданных другими приложениями. Следует также отметить, что независимо от предварительной установки флагов управления способом обмена страницами у меня всегда получался странный результат - после выполнения функции ChoosePixelFormate) принудительно взводился флаг PFD_SWAP_EXCHANGE, но вместо обмена производилось копирование активной страницы в видимую.