OpenGL в Delphi

       

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


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

PFD_SWAP_LAYER_BUFFERS,
PFD_GENERIC_ACCELERATED и PFD_DEPTH_DONTCARE.

А константа, названная PFD_DOUBLE__BUFFER_DONTCARE, по-видимому, соответствует константе, описанной в модуле windows. pas как PFD_DOUBLEBUFFER
DONTCARE.
Итак, смысл структуры pixelFormatDescriptor - детальное описание графической системы, на которой происходит работа. Вас может озадачить дотошность этого описания, но, уверяю, особое внимание из всего этого описания требуют совсем немногие вещи.
В проекте я привел описание всех полей структуры TPixelFormatDescriptor на русском языке (в момент их первоначального заполнения). Делается это в процедуре setDCPixelFormat, вызываемой между получением ссылки на контекст устройства и созданием ссылки на контекст воспроизведения OpenGL.
Посмотрим подробнее, что там делается. Полям структуры присваиваются желаемые значения, затем вызовом функции choosePixelFormat осуществляется запрос системе, поддерживается ли на данном рабочем месте выбранный формат пиксела, и, наконец, вызовом функции SetPixelFormat устанавливается формат пиксела в контексте устройства.
Функция choosePixelFormat возвращает индекс формата пиксела, который нам нужен в качестве аргумента функции SetPixelFormat.
Заполнив поля структуры TPixelFormatDescriptor, мы определяемся со своими пожеланиями к графической системе, на которой будет происходить работа приложения, OpenGL подбирает наиболее подходящий к нашим пожеланиям формат и устанавливает уже его в качестве формата пиксела для последующей работы. Наши пожелания корректируются сервером OpenGL применительно к реальным характеристикам системы.
To, что OpenGL не позволит нам установить нереальный для конкретного рабочего места формат пиксела, значительно облегчает нашу задачу. Предполагая, что разработанное приложение будет работать на машинах разного класса, можно запросить "всего побольше", а уж OpenGL разберется в каждом конкретном случае, каковы параметры и возможности оборудования, на котором в данный момент выполняется приложение.
На этом можно было бы и закончить разговор о формате пиксела, если бы мы могли полностью довериться выбору OpenGL.
Обратим внимание на поле структуры "битовые флаги", dwFlags. To, как мы зададим значение флагов, может существенно сказаться на работе нашего
приложения, и наобум задавать эти значения не стоит. Тем более что некоторые флаги совместно "не уживаются", а некоторые присутствуют только в паре с определенными флагами.
В рассматриваемом примере я присвоил флагам значение PFD_DRAW_TO WINDOW or PFD_SUPPORT_OPENGL, сообщив тем самым системе, что собираюсь осуществлять вывод в окно и что моя система в принципе поддерживает OpenGL (Рисунок 1. 1).


Содержание раздела