Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 300065.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
280.06 Кб
Скачать

Формат пиксела

Ссылка на контекст устройства содержит характеристики устройства и средства отображения. Упрощенно говоря, получив ссылку на контекст устройства, мы берем в руки простой либо цветной карандаш или кисть с палитрой в миллионы оттенков.

Сервер OpenGL, прежде чем приступать к работе, также должен определиться, на каком оборудовании ему придется работать. Это может быть скромная персоналка, а может быть и мощная графическая станция.

Прежде чем получить контекст воспроизведения, сервер OpenGL должен получить детальные характеристики используемого оборудования. Эти характеристики хранятся в специальной структуре, тип которой - TPlxelFormatDescriptor (описание формата пиксела). Формат пиксела определяет конфигурацию буфера цвета и вспомогательных буферов. Набрав в тексте модуля фразу "PixelFormatDescriptor", и нажав клавишу <F1>, можно получить подробную информацию об этом типе. При этом отображается раздел справки Microsoft, рассчитанной на программистов, использующих С или C++, поэтому описание содержит термины и стилистику именно этих языков.

Итак, смысл структуры pixelFormatDescriptor - детальное описание графической системы, на которой происходит работа. Особое внимание из всего этого описания требуют совсем немногие вещи.

Первоначальное заполнение полей структуры TPixelFormatDescriptor выполняется в процедуре setDCPixelFormat, вызываемой между получением ссылки на контекст устройства и созданием ссылки на контекст воспроизведения OpenGL. При этом полям структуры присваиваются желаемые значения, затем вызовом функции choosePixelFormat осуществляется запрос системе, поддерживается ли на данном рабочем месте выбранный формат пиксела, и, наконец, вызовом функции SetPixelFormat устанавливается формат пиксела в контексте устройства. Функция choosePixelFormat возвращает индекс формата пиксела, который нам нужен в качестве аргумента функции SetPixelFormat. Заполнив поля структуры TPixelFormatDescriptor, мы определяемся со своими пожеланиями к графической системе, на которой будет происходить работа приложения, OpenGL подбирает наиболее подходящий к нашим пожеланиям формат и устанавливает уже его в качестве формата пиксела для последующей работы.

OpenGL позволяет узнать, какой же формат пиксела он собирается использовать. Для этого необходимо использовать функцию DescribePixelFormat, заполняющую величину типа TPixelFormatDescriptor установленным форматом пиксела.

Приложение на основе использования этой функции, которое позволит детальнее разобраться с форматом пиксела приведено в подкаталоге \ex08.

Обратим внимание на поле структуры "битовые флаги", dwFlags. To, как мы зададим значение флагов, может существенно сказаться на работе нашего приложения. Тем более что некоторые флаги совместно "не уживаются", а некоторые присутствуют только в паре с определенными флагами.

Присвоенные флагам значения PFD_DRAW_TO WINDOW or PFD_SUPPORT_OPENGL, сообщают тем самым системе, что будет осуществляться вывод в окно и что система в принципе поддерживает OpenGL.

Так, константа PFD_DOUBLEBUFFER включает режим двойной буферизации, когда вывод осуществляется не на экран, а в память, затем содержимое буфера выводится на экран. Это очень полезный режим: если в любом примере на анимацию убрать режим двойной буферизации и все связанные с этим режимом команды, то при выводе кадра будет заметно мерцание.

Замечание 1.

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

Замечание 2.

Константу PFD_GENERIC_ACCELERATED имеет смысл устанавливать только в случае, если компьютер оснащен графическим акселератором. Флаги, заканчивающиеся на "DONTCARE", сообщают системе, что соответствующий режим может иметь оба значения, например, при установке флага PFD_DouBLE_BUFFER_DONTCARE запрашиваемый формат пиксела допускает оба режима - как одинарной, так и двойной буферизации.

ПРИЛОЖЕНИЕ 3