netlib.narod.ru< Назад | Оглавление | Далее >

DirectDraw

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

Приведенное ниже описание DirectDraw не претендует на полноту, но это и не требуется. Мы обсудим только те функциональные возможности DirectDraw, которые потребуются нам для создания полноэкранного приложения.

Интерфейс DirectDraw

DirectDraw, подобно Direct3D, предоставляет большую часть своих функциональных возможностей через главный интерфейс. Для абстрактного режима Direct3D, главным является интерфейс Direct3DRM. Главный интерфейс DirectDraw называется DirectDraw.

Интерфейс DirectDraw создается функцией DirectDrawCreate(), вызов которой выглядит следующим образом:

LPDIRECTDRAW ddraw;
DirectDrawCreate(0, &ddraw, 0);

Уровни кооперации

Степень контроля DirectDraw над видеокартой может быть настроена с помощью функции SetCooperativeLevel(). Уровень кооперации (cooperative level) определяет, в какой мере DirectDraw будет сотрудничать с другими приложениями. Для наших целей мы воспользуемся функцией SetCooperativeLevel() чтобы установить монопольный полноэкранный режим.

Видеорежимы

Интерфейс DirectDraw позволяет нам определять и активировать видеорежимы. Для определения поддерживаемых видеорежимов предназначена функция EnumDisplayModes(). Найденный видеорежим может быть включен с помощью функции SetDisplayMode(). Функция RestoreDisplayMode() используется для возвращения видеокарты к тому видеорежиму, который был установлен до запуска нашего приложения. Позднее, при написании приложения FullScreen, мы воспользуемся этими функциями, чтобы наша программа могла включать любой поддерживаемый видеорежим.

Переключение страниц

Одной из важнейших возможностей DirectDraw является переключение страниц. Переключением страниц называется способ анимации при котором изображение подготавливается во внеэкранном буфере, а затем отображается на экране. Этот метод полезен по двум причинам. Во-первых, подготовка изображения в скрытом буфере позволяет устранить мерцание изображения во время анимации, поскольку перед тем как стать видимым, новый кадр уже полностью собран. Вторая причина — скорость. Переключение страниц осуществляется аппаратурой видеокарты, поэтому обновление экрана происходит практически мгновенно.

Для переключения страниц необходимы два буфера — первичный (primary buffer) и вторичный (back buffer). Первичный буфер содержит данные, которые в текущий момент времени отображаются на экране. Вторичный буфер содержит изображение, которое может быть перемещено в первичный буфер за одну операцию. Позже мы создадим и первичный, и вторичный буфер. Мы будем копировать трехмерные и двухмерные изображения во вторичный буфер, а затем выполнять переключение страниц, чтобы сделать новое изображение видимым.

Поверхности

В DirectDraw поверхностью (surface) называется область памяти, предназначенная для хранения изображений. Используемая поверхностью память может быть расположена как на видеокарте, так и в системной памяти. Однако отображаться на экране могут только те поверхности, которые размещены в памяти видеокарты.

Поверхности представлены интерфейсом DirectDrawSurface и могут быть созданы функцией CreateSurface() интерфейса DirectDraw. Функции CreateSurface() передаются аргументы, которые задают тип, размер и возможности создаваемой поверхности.

Существует три основных типа поверхностей: переключаемые поверхности (flipping surfaces), внеэкранные поверхности (off-screen surfaces) и Z-буферы (Z-buffers). Переключаемые поверхности используются для выполнения переключения страниц. Первичный и вторичный буфер в нашем коде будут представлять собой переключаемые поверхности. Внеэкранные поверхности используются для хранения изображений, таких как фоновые картинки и спрайты, и различных манипуляций с ними. Z-буферы мы обсудим в следующем разделе.

Z-буфферизация

Одно из преимуществ использования Direct3D в оконной среде — автоматическое создание Z-буферов. В полноэкранных приложениях мы должны создать Z-буфер сами.

Z-буфер — это поверхность DirectDraw, обладающая возможностью Z-буфферизации. Подобно обычной поверхности, Z-буфер создается функцией CreateSurface() интерфейса DirectDraw. Как только Z-буфер создан и установлен, Direct3D может использовать его не требуя дальнейшего вмешательства.

Палитры

Для 8-разрядных видеорежимов необходима палитра. Для оконных приложений Direct3D автоматически создает и устанавливает палитру. В полноэкранных приложениях предоставить палитру должна наша программа.


СОВЕТ


Захват палитры. Простейший способ получения палитры для вашего приложения — создание оконной версии приложения и последующее использование программы захвата изображений (такой, как Paint Shop Pro) для захвата содержимого окна. Полученный в результате файл будет содержать цвета, необходимые для отображения полноэкранной версии. В этой главе мы узнаем, как извлечь палитру из файлов BMP.


Палитры представлены интерфейсом DirectDrawPalette и создаются с помощью функции CreatePalette() интерфейса DirectDraw.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz