Direct draw термины и концепции интерфейс directdrawpalette


Читать онлайн «Графика для Windows средствами DirectDraw» автора Трухильо Стэн — RuLit — Страница 8

Далее рассмотрены функции интерфейса DirectDraw. Обратите внимание на то, что в оставшейся части этой главы термин интерфейс DirectDraw относится как к интерфейсу DirectDraw, так и к DirectDraw2. Уточнения будут приведены лишь в тех случаях, когда функция отличается в двух интерфейсах.

Функции создания интерфейсов

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

Функция CreateClipper() создает экземпляры интерфейса DirectDrawClipper. Объекты отсечения (clipper) используются не всеми приложениями DirectDraw, так что в некоторых программах эта функция может отсутствовать. Вскоре мы рассмотрим интерфейс DirectDrawClipper подробнее.

Функция CreatePalette() создает экземпляры интерфейса DirectDrawPalette. Палитры, как и интерфейс DirectDrawClipper, используются не всеми приложениями DirectDraw. Например, приложению, работающему только с 16-битными видеорежимами, палитра не понадобится. Тем не менее приложение, работающее в 8-битном видеорежиме, должно создать хотя бы один экземпляр DirectDrawPalette.

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

Экземпляры самого интерфейса DirectDraw создаются функцией DirectDraw Create(). DirectDrawCreate() — одна из немногих самостоятельных функций DirectDraw, не принадлежащих никакому COM-интерфейсу.

Интерфейс DirectDraw позволяет точно узнать, какие возможности поддерживаются как на программном, так и на аппаратном уровне. Функция GetCaps() инициализирует два экземпляра структуры DDCAPS. Первая структура показывает, какие возможности поддерживаются непосредственно видеокартой, а вторая — что доступно посредством программной эмуляции. Функция GetCaps() помогает определить, поддерживаются ли нужные возможности.

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

В DirectX SDK входит программа DXVIEW, которая сообщает о возможностях всех компонентов DirectX, в том числе и DirectDraw. На большинстве компьютеров информация о DirectDraw отображается в двух категориях: Primary Display Driver и Hardware Emulation Layer. Первая категория сообщает о возможностях аппаратных видеосредств. Во второй перечислены возможности, эмулируемые DirectDraw при отсутствии аппаратной поддержки. На компьютерах с двумя и более видеокартами, поддерживаемыми DirectDraw, DXVIEW выводит сведения о способностях каждой из них.

Функция SetCooperativeLevel() определяет уровень кооперации — степень контроля над видеокартой, необходимую для данного приложения. Например, нормальный (normal) уровень кооперации означает, что приложение не сможет изменить текущий видеорежим или задать содержимое всей системной палитры. Монопольный (exclusive) уровень допускает переключение видеорежимов и предоставляет приложению полный контроль над палитрой. Независимо от выбранного уровня вам необходимо вызвать SetCooperativeLevel().

Функции для работы с видеорежимами

Интерфейс DirectDraw содержит четыре функции для работы с видеорежимами:

С помощью функции EnumDisplayModes() можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes() перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes() не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640×480×8.

Функция SetDisplayMode() активизирует заданный видеорежим. Версия SetDisplay Mode() из интерфейса DirectDraw2 позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisplayMode() присутствует в любой программе, осуществляющей переключение видеорежимов.

Direct draw термины и концепции интерфейс directdrawpalette

• UpdateOverlayDisplay()

• UpdateOverlayZOrder()

Функции GetOverlayPosition() и SetOverlayPosition() управляют положением оверлеев. Функция UpdateOverlay() изменяет параметры оверлея; в частности, она определяет, должен ли оверлей отображаться на экране и следует ли применять для него альфа-наложение или копирование с цветовым ключом.

Функция UpdateOverlayDisplay() обновляет изображение с учетом новых значений параметров. Данная функция может обновить все изображение оверлея или ограничиться его прямоугольными областями, заданными функцией AddOverlayDirtyRect(). Наконец, функция EnumOverlayZOrders() используется для перебора оверлеев в порядке их Z-координаты (Z-координата определяет, какие оверлеи выводятся поверх других). Возможен перебор как в прямом порядке (от передних оверлеев к задним), так и в обратном (от задних — к передним).

Функции для работы с объектами отсечения

DirectDraw позволяет присоединить к поверхности экземпляр интерфейса DirectDrawClipper (который мы еще не рассматривали). После того как такое присоединение состоится, операция блиттинга на данную поверхность будет регулироваться объектом отсечения. Для работы с объектами отсечения в интерфейсе DirectDrawSurface имеются две функции:

• GetClipper()

• SetClipper()

Функция SetClipper() присоединяет объект отсечения к поверхности. Функция GetClipper() возвращает указатель на присоединенный ранее объект отсечения. С помощью функции SetClipper() можно разорвать связь между поверхностью и объектом отсечения, для этого в качестве указателя на интерфейс DirectDrawClipper следует задать NULL.

Палитры, как и объекты отсечения, можно присоединять к поверхностям. Для этой цели в интерфейсе DirectDrawSurface предусмотрены две функции:

• GetPalette()

• SetPalette()

Функция SetPalette() присоединяет к поверхности экземпляр интерфейса DirectDrawPalette (о нем речь пойдет ниже). Функция GetPalette() применяется для получения указателя на палитру, присоединенную ранее.

Палитру можно присоединить к любой поверхности, однако действовать она будет лишь в том случае, если поверхность является первичной. Палитра, присоединенная к первичной поверхности, управляет палитрой видеокарты.

Интерфейс DirectDrawPalette предназначен для работы с палитровыми видеорежимами и поверхностями. Несмотря на то что в Windows поддерживается ряд видеорежимов с глубиной пикселей менее 8 бит, DirectDraw поддерживает лишь 8-битные палитровые режимы.

Экземпляры интерфейса DirectDrawPalette создаются функцией CreatePalette() интерфейса DirectDraw. Функция CreatePalette() получает набор флагов, определяющих тип палитры.

Интерфейс DirectDrawPalette содержит всего три функции:

• GetCaps()

• GetEntries()

• SetEntries()

Функция GetCaps() определяет возможности палитры. В числе получаемых сведений — количество элементов палитры, поддержка палитрой вертикальной синхронизации и (в случае 8-битной палитры) возможность заполнения всех 256 элементов.

Для заполнения палитры используется функция SetEntries(). Содержимое палитры чаще всего берется из файла. Тем не менее значения элементов палитры можно рассчитать и занести в палитру во время выполнения программы. Функция GetEntries() возвращает значения элементов, ранее занесенных в палитру.

Экземпляры интерфейса DirectDrawPalette присоединяются к поверхности функцией SetPalette() интерфейса DirectDrawSurface. Палитровая анимация выполняется либо присоединением разных палитр к первичной поверхности, либо изменением содержимого палитры функцией SetEntries().

Интерфейс DirectDrawClipper предназначен для поддержки отсечения. Чтобы выполнить отсечение, следует присоединить объект отсечения к поверхности и использовать ее в качестве приемника блиттинга.

Экземпляры интерфейса DirectDrawClipper создаются функцией CreateClipper() интерфейса DirectDraw. Интерфейс DirectDrawClipper содержит следующие функции:

• SetHWnd()

• GetHWnd()

• IsClipListChanged()


• SetClipList()

• GetClipList()

Объекты отсечения обычно используются для ограничения вывода, необходимого при работе приложений DirectDraw в окне. Объект отсечения гарантирует, что при выполнении блиттинга будет учитываться присутствие на рабочем столе других окон. Например, если окно приложения будет полностью или частично закрыто другим окном, объект отсечения позаботится о том, чтобы содержимое верхнего окна не было испорчено приложением DirectDraw.

Отсечение для рабочего стола активизируется функцией SetHWnd(). Функция SetHWnd() присоединяет объект отсечения к логическому номеру (handle) окна. В результате инициируется взаимодействие Windows с объектом отсечения. Объект отсечения получает уведомления обо всех изменениях окон на рабочем столе и действует соответствующим образом. Функция GetHWnd() определяет, к какому логическому номеру окна присоединен заданный объект отсечения (и присоединен ли он вообще). Функция IsClipListChanged() определяет, был ли внутренний список отсечений изменен вследствие изменений на рабочем столе.

Функции SetClipList() и GetClipList() упрощают нестандартное использование интерфейса DirectDrawClipper. Функция SetClipList() определяет набор прямоугольных областей, для которых разрешено выполнение блиттинга. Функция GetClipList() извлекает внутренние данные объекта отсечения.

После того как экземпляр DirectDrawClipper будет присоединен к поверхности, происходит автоматическое отсечение операций блиттинга, выполняемых функциями Blt(), BltBatch() и UpdateOverlay(). Обратите внимание на то, что в список не входит функция BltFast(). Для нее отсечение не поддерживается.

Дополнительные интерфейсы DirectDraw

Строго говоря, DirectDraw содержит еще три интерфейса, не рассмотренных нами:

• DDVideoPortContainer

• DirectDrawColorControl

• DirectDrawVideoPort

Эти интерфейсы, появившиеся в DirectX 5, предназначены для низкоуровневого управления видеопортами. Точнее, они предоставляют средства для потоковой пересылки «живого видео» на поверхности DirectDraw. Хотя с их помощью можно организовать в приложениях DirectDraw поддержку работы с видео, это не рекомендуется, за исключением случаев, когда высокоуровневые видео-API не отвечают вашим потребностям. В книге эти интерфейсы не рассматриваются.

После рассмотрения всех интерфейсов и функций DirectDraw мы переходим к структурам данных. Всего в DirectDraw определено восемь структур:

• DDBLTFX

• DDCAPS

• DDOVERLAYFX

• DDPIXELFORMAT

• DDSURFACEDESC

• DDSCAPS

• DDBLTBATCH

• DDCOLORKEY

С некоторыми из этих структур мы уже встречались. Например, структура DDCOLORKEY упоминалась при обсуждении функции SetColorKey() интерфейса DirectDrawSurface. В настоящем разделе мы не станем детально рассматривать каждую структуру, а вместо этого разберемся с одной особенностью DirectDraw, которая способна причинить немало бед, если о ней забыть.

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

Например, фрагмент для работы со структурой DDSURFACEDESC может выглядеть так:

Сначала мы объявляем структуру, затем присваиваем полю dwSize значение, используя функцию sizeof(). После этого структура передается функции GetSurfaceDesc() интерфейса DirectDrawSurface. Если забыть присвоить значение полю dwSize, вызов функции закончится неудачей.

На первый взгляд это выглядит глупо. С какой радости DirectDraw настаивает на передаче размера структуры, в ней же и определенной? Причина, по которой эти пять структур содержат поле dwSize, состоит в том, что в будущем они могут измениться. DirectDraw будет проверять размер структуры и по нему определять ее версию. Сейчас DirectDraw требует передачи правильного размера, чтобы приучить к этому разработчиков. Позднее это окупится, поскольку дальнейшие версии DirectDraw смогут корректно работать со старыми программами DirectDraw.

«Графика для Windows средствами DirectDraw»: Стэн Трухильо 1
Предисловие 1
Введение 1
Для чего написана эта книга 1
Требования к читателю 1
Программные требования 2
Аппаратные требования 2
Глава 1. Краткий курс DirectDraw 2
Что такое DirectDraw? 2
Спецификация COM фирмы Microsoft 4
DirectDraw API 4
Интерфейсы DirectDraw и DirectDraw2 4
Интерфейсы DirectDrawSurface 6
Интерфейс DirectDrawPalette 8
Интерфейс DirectDrawClipper 8
Дополнительные интерфейсы DirectDraw 8
Структуры DirectDraw 8
Создание приложений DirectDraw 9
Подготовка инструментов 9
Глава 2. Проблемы быстродействия 10
Глава 3. За кулисами DirectDraw 12
DirectDraw AppWizard 12
Создание приложения Bounce 13
Структура приложения 13
Инициализация DirectDraw 14
Создание поверхностей 16
Графический вывод 18
Оконные приложения 20
Глава 4. Видеорежимы и частота смены кадров 21
Переключение видеорежимов 21
Обнаружение видеорежимов и частот смены кадров 22
Вычисление FPS 23
Графический вывод 24
Обработка пользовательского ввода 25
Частота смены кадров 26
Глава 5. Поверхности и форматы пикселей 28
Поверхности 28
BMP-файлы 31
Программа BmpView 34
Глава 6. DirectInput 38
Что такое DirectInput? 38
DirectInput API 39
Программа Qwerty 40
Инициализация DirectInput 40
Управление версией DirectInput 42
Программа Smear 42
Глава 7. Проблема курсора 44
Частичное обновление экрана 44
Многопоточность 45
Решение проблемы курсора 46
Программа Cursor 47
Глава 8. Воспроизведение видеороликов 50
Начальные сведения 50
Программа AviPlay 52
Глава 9. Проверка столкновений 55
Общее решение 55
Функции проверки столкновений 56
Класс Sprite 57
Программа Bumper 59
Приложение А. Информация для разработчиков 60
Отладка 60
Замечания о Visual C++ 64
Советы и рекомендации 66

Лучшие электронные книги в формате fb2
Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

Direct draw термины и концепции интерфейс directdrawpalette

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

Видеорежимы

Видеорежимом называется набор параметров, поддерживаемый аппаратурой видеокарты (видеоадаптера) и позволяющий организовать вывод графического изображения. Самым известным атрибутом видеорежима является разрешение экрана. По умолчанию в Windows используется видеорежим с разрешением 640×480. Это означает, что на экране выводится 640 пикселей по горизонтали и 480 пикселей по вертикали. Также часто встречаются видеорежимы с разрешением 800×600 и 1024×768. Некоторые видеокарты поддерживают так называемые режимы ModeX. Типичный режим ModeX имеет разрешение 320×200.

Илон Маск рекомендует:  Что такое код gets

Видеорежимы также различаются по глубине пикселей (pixel depth). Этот параметр определяет количество различных значений, принимаемых отдельным пикселем, и, следовательно, количество отображаемых цветов. Например, в видеорежиме с глубиной пикселей в 8 бит каждый пиксель может иметь один из 256 различных цветов. В режимах с 16-битной глубиной пикселей поддерживается отображение до 65536 цветов. Глубина пикселей обычно равна 8, 16, 24 или 32 битам.

Видеорежимы реализуются специальным устройством, установленным на компьютере, — видеокартой. На видеокарте устанавливается отдельная память, не входящая в основную память компьютера. Память, установленную на видеокарте, мы будем называть видеопамятью, а обычную память (RAM) — системной памятью. Объем памяти, необходимой для поддержки определенного видеорежима, определяется разрешением и глубиной пикселей в этом режиме. Например, для видеорежима 640×480×8 (640×480 пикселей, каждый из которых имеет глубину в 8 бит) требуется 307300 байт. Видеорежим 1024×768×16 требует 1572864 байт. Для поддержки видеорежимов используется видеопамять. Следовательно, режимы, поддерживаемые конкретной видеокартой, ограничиваются объемом установленной видеопамяти. Скажем, режим 1024×768×16 не поддерживается видеокартами с 1 Мбайт памяти, потому что для него такой объем памяти недостаточен.

Одна из ключевых возможностей DirectDraw — переключение видеорежимов. Она позволяет приложению DirectDraw обнаружить и активизировать любой режим, поддерживаемый установленной видеокартой. Переключение режимов подробно рассматривается в главе 4.

Аппаратное ускорение

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

Поверхности

Поверхностью (surface) в DirectDraw называется прямоугольная область памяти, обычно содержащая графические данные. Блок памяти, изображающий поверхность, может находиться как в системной, так и в видеопамяти. Хранение поверхностей в видеопамяти обычно повышает скорость работы программы, поскольку большинство видеокарт не может обращаться к системной памяти напрямую.

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

Первичная (primary) поверхность, напротив, представляет собой участок видеопамяти, отображаемой на экране. Любая программа DirectDraw, обеспечивающая графический вывод, имеет первичные поверхности. Первичная поверхность должна находиться в видеопамяти.

Первичные поверхности часто бывают составными (complex), или, что то же самое, переключаемыми (flippable). Переключаемая поверхность может участвовать в переключении страниц — операции, при которой содержимое всей поверхности мгновенно отображается на экране с помощью специальных аппаратных средств. Переключение страниц используется во многих графических программах как с поддержкой DirectDraw, так и без, поскольку оно обеспечивает очень гладкую анимацию и устраняет мерцание. Переключаемая первичная поверхность на самом деле состоит из двух поверхностей, одна из которых отображается на экране, а другая — нет. Невидимая поверхность называется вторичным буфером (back buffer). При переключении страниц поверхности меняются местами: та, которая была вторичным буфером, отображается на экране, а та, что ранее отображалась, превращается во вторичный буфер.

Как внеэкранные, так и первичные поверхности делятся на две разновидности: палитровые (palettized) и беспалитровые (non-palettized). Палитровая поверхность вместо конкретных значений цветов содержит индексы в цветовой таблице, которая называется палитрой. В DirectDraw палитровыми являются только 8-битные поверхности. Поверхности с глубиной пикселей, равной 16, 24 и 32 битам, являются беспалитровыми. Вместо индексов в них хранятся фактические значения цветов.

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

Блиттинг


На жаргоне, принятом в компьютерной графике, «блиттингом» называется операция копирования. Примером типичного блиттинга служит копирование внеэкранной поверхности во вторичный буфер. Если аппаратное ускорение невозможно, DirectDraw эмулирует блиттинг на программном уровне. Такая эмуляция справляется

Графика для Windows средствами DirectDraw (8 стр.)

Функции IsLost() и Restore()

Две следующие функции предназначены для работы с поверхностями в видеопамяти:

• IsLost()

• Restore()

Рассмотрим следующую ситуацию: ваше приложение начинает работу. Вы размещаете как можно больше поверхностей в видеопамяти, а все остальные — в системной памяти. В течение некоторого времени приложение работает, но затем пользователь запускает другое приложение или переключается на него. Другое приложение может быть чем угодно — скажем, стандартной Windows-программой (например, Windows Explorer или Notepad). Оно также может оказаться другим приложением, которое тоже работает с DirectDraw и стремится разместить как можно больше поверхностей в видеопамяти. Если DirectDraw откажется выделить новому приложению видеопамять, оно будет работать плохо (а то и вообще не будет). Возможна и обратная ситуация — видеопамять окажется недоступной для вашего приложения.

По этой причине DirectDraw может забрать у неактивного приложения видеопамять, занятую некоторыми (или всеми) поверхностями. Такие поверхности называются потерянными (lost). Вообще говоря, такие поверхности остаются у вашей программы, но они перестают быть связанными с какой-либо областью памяти. Любая попытка использовать потерянную поверхность приводит к ошибке DDERR_SURFACELOST. Функция IsLost() позволяет узнать, была ли потеряна память данной поверхности.

Потерянную поверхность можно восстановить функцией Restore(), но только после повторной активизации вашего приложения. Тем самым предотвращается восстановление поверхностей для приложений, находящихся в свернутом виде на панели задач.

При этом существует одна загвоздка. Функция Restore() восстанавливает лишь память, закрепленную за поверхностью, но не ее содержимое. Следовательно, после восстановления поверхности ваше приложение само должно восстановить ее содержимое.

Обратите внимание: сказанное не относится к поверхностям, находящимся в системной памяти. Если память, занятая такими поверхностями, потребуется для других целей, Windows перенесет их на диск. Все эти действия Windows выполняет автоматически, включая восстановление содержимого поверхностей.

Функция GetDDInterface() возвращает указатель на интерфейс DirectDraw, использованный для создания заданной поверхности. Эта функция используется очень редко, поскольку ваши программы, вероятно, будут обходиться одним экземпляром интерфейса DirectDraw. Тем не менее в одном приложении разрешено иметь несколько интерфейсов DirectDraw. В этом случае функция GetDDInterface() может оказаться полезной.

Функции присоединения поверхностей

Интерфейс DirectDrawSurface содержит четыре функции для управления взаимосвязанными поверхностями:

• AddAttachedSurface()

• DeleteAttachedSurface()

• EnumAttachedSurface()

• GetAttachedSurface()

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

Поддержка оверлеев в DirectDrawSurface представлена следующими функциями:

• AddOverlayDirtyRect()

• EnumOverlayZOrder()

• GetOverlayPosition()

• SetOverlayPosition()

• UpdateOverlay()

• UpdateOverlayDisplay()

• UpdateOverlayZOrder()

Функции GetOverlayPosition() и SetOverlayPosition() управляют положением оверлеев. Функция UpdateOverlay() изменяет параметры оверлея; в частности, она определяет, должен ли оверлей отображаться на экране и следует ли применять для него альфа-наложение или копирование с цветовым ключом.

Функция UpdateOverlayDisplay() обновляет изображение с учетом новых значений параметров. Данная функция может обновить все изображение оверлея или ограничиться его прямоугольными областями, заданными функцией AddOverlayDirtyRect(). Наконец, функция EnumOverlayZOrders() используется для перебора оверлеев в порядке их Z-координаты (Z-координата определяет, какие оверлеи выводятся поверх других). Возможен перебор как в прямом порядке (от передних оверлеев к задним), так и в обратном (от задних — к передним).

Функции для работы с объектами отсечения

DirectDraw позволяет присоединить к поверхности экземпляр интерфейса DirectDrawClipper (который мы еще не рассматривали). После того как такое присоединение состоится, операция блиттинга на данную поверхность будет регулироваться объектом отсечения. Для работы с объектами отсечения в интерфейсе DirectDrawSurface имеются две функции:

• GetClipper()

• SetClipper()

Функция SetClipper() присоединяет объект отсечения к поверхности. Функция GetClipper() возвращает указатель на присоединенный ранее объект отсечения. С помощью функции SetClipper() можно разорвать связь между поверхностью и объектом отсечения, для этого в качестве указателя на интерфейс DirectDrawClipper следует задать NULL.

Палитры, как и объекты отсечения, можно присоединять к поверхностям. Для этой цели в интерфейсе DirectDrawSurface предусмотрены две функции:

• GetPalette()

• SetPalette()

Функция SetPalette() присоединяет к поверхности экземпляр интерфейса DirectDrawPalette (о нем речь пойдет ниже). Функция GetPalette() применяется для получения указателя на палитру, присоединенную ранее.

Палитру можно присоединить к любой поверхности, однако действовать она будет лишь в том случае, если поверхность является первичной. Палитра, присоединенная к первичной поверхности, управляет палитрой видеокарты.

Интерфейс DirectDrawPalette

Интерфейс DirectDrawPalette предназначен для работы с палитровыми видеорежимами и поверхностями. Несмотря на то что в Windows поддерживается ряд видеорежимов с глубиной пикселей менее 8 бит, DirectDraw поддерживает лишь 8-битные палитровые режимы.

Экземпляры интерфейса DirectDrawPalette создаются функцией CreatePalette() интерфейса DirectDraw. Функция CreatePalette() получает набор флагов, определяющих тип палитры.

Интерфейс DirectDrawPalette содержит всего три функции:

• GetCaps()

• GetEntries()


• SetEntries()

Функция GetCaps() определяет возможности палитры. В числе получаемых сведений — количество элементов палитры, поддержка палитрой вертикальной синхронизации и (в случае 8-битной палитры) возможность заполнения всех 256 элементов.

Для заполнения палитры используется функция SetEntries(). Содержимое палитры чаще всего берется из файла. Тем не менее значения элементов палитры можно рассчитать и занести в палитру во время выполнения программы. Функция GetEntries() возвращает значения элементов, ранее занесенных в палитру.

Экземпляры интерфейса DirectDrawPalette присоединяются к поверхности функцией SetPalette() интерфейса DirectDrawSurface. Палитровая анимация выполняется либо присоединением разных палитр к первичной поверхности, либо изменением содержимого палитры функцией SetEntries().

Интерфейс DirectDrawClipper

Интерфейс DirectDrawClipper предназначен для поддержки отсечения. Чтобы выполнить отсечение, следует присоединить объект отсечения к поверхности и использовать ее в качестве приемника блиттинга.

Экземпляры интерфейса DirectDrawClipper создаются функцией CreateClipper() интерфейса DirectDraw. Интерфейс DirectDrawClipper содержит следующие функции:

Рисование с Direct2D

В июня выпуске журнала MSDN Magazine (msdn.microsoft.com/magazine/dd861344.aspx), представленные Direct2D, новой ДВУМЕРНАЯ графика API предназначены для поддержки наиболее ресурсоемких и визуально форматированного настольных приложений с наиболее возможную производительность. В этой статье я описал, где Direct2D поместился в среди различных графических API Windows, его архитектуру и принципы. В частности я подробно описаны основы использования Direct2D надежно и эффективно для отрисовки внутри окна. Включить создание ресурсов для конкретных устройств, а также аппаратно независимых ресурсов и их соответствующих жизненных циклов. Если вы еще не сделано, я бы рекомендую прочитать статью перед продолжением работы здесь, как в этой статье многом построение после основой определены извлечение существует.

Отображение и управление

Полезно подумать о Direct2D как аппаратным ускорением отрисовка 2-D API. Конечно поддерживает возврата программного обеспечения, но момент здесь является Direct2D о визуализации. В отличие от других рисунков API Windows Direct2D использует компонентную подход к рисункам. Он не предоставляет собственной API для кодирования и декодирования точечные рисунки, макет текста, управления шрифтов, анимации, объем и т. д. Вместо этого уделяется визуализации и контролировать обработки графики (GPU) обеспечивая первым классом ловит другие API, сосредоточиться на макет текста и изображений. Direct2D однако, обеспечить примитивы для представления различных типов кистей, а также простые и сложные фигуры, строительные блоки для любого приложения ДВУМЕРНАЯ графика.

В этой статье я собираюсь показать, как рисовать Direct2D. Я будет начинаться путем введения структуры цвет Direct2D и продемонстрировать способы создания различных типов кистей. В отличие от большинства других графических интерфейсов API Windows Direct2D не предоставляет «Перо»простые, поэтому кисти важны довольно используемые для всех задач контура и заполнения. С этим в сторону, я покажу, как Рисование простых фигур.

Цвета

Direct2D использует простую структуру, представляющий цвета с компонентами цвета с плавающей запятой. Тип D2D1_COLOR_F является typedef для структуры D3DCOLORVALUE, используемое Direct3D для описания значения цвета. Он включает отдельные значения с плавающей запятой для красного, зеленого, синего и альфа-каналов. Значения в диапазоне от 0.0 до 1.0 с 0.0 черные цветовые каналы и полностью прозрачным для альфа-канала.

Вот как выглядит:

Direct2D предоставляет вспомогательный класс ColorF D2D1 пространства имен, наследует D2D1_COLOR_F и определяет некоторые общие константы цвета, но важнее предоставляет несколько полезных конструкторы, инициализировать структуру D2D1_COLOR_F. Можно, например, определить красный следующим образом:

Другой конструктор принимает упакованный RGB-значение и преобразует его отдельные цветовые каналы. Вот красный снова:

Это именно то же самое как с помощью следующие значения перечисления:

Хотя краткая, используя упакованный представление RGB съесть вверх небольшое больше циклов ПРОЦЕССОРА необходимости различные цветовые каналы для извлечения и преобразуется в их перемещаемые точки эквиваленты, поэтому использовать его с осторожностью.

Все конструкторы принимать дополнительное альфа-значение, которое по умолчанию 1.0, или полностью непрозрачным. Таким образом полупрозрачным синего цвета можно выразить следующим образом:

Помимо очистки целевого буфера визуализации области рисования, однако есть немного можно сделать с помощью цвета непосредственно. Что необходимо являются кисти.

Кисти

В отличие от структур простой цвет кисти являются ресурсами, через интерфейсы. Они используются для рисования линий, для рисования и заполнения фигур и рисования текста. Интерфейсы, которые являются производными от ID2D1Brush представляют различные типы кистей, предоставляемых Direct2D. Сам интерфейс ID2D1Brush позволяет управления непрозрачности кисти как единое целое, а не изменение альфа-канала цвета кисти. Это может быть особенно полезно с некоторыми интереснее типов кистей.

Вот как может Установите непрозрачность кисти на 50 процентов.

ID2D1Brush также позволяет управлять преобразование, применяемое к кисти с момента, в отличие от Windows Presentation Foundation (WPF), кисти адаптировать система координат целевого буфера визуализации, а не с определенной фигуры, они могут рисования.

Илон Маск рекомендует:  Что такое код getarccoords

Различные методы целевого визуализации для создания кисти все принимают структуру необязательных D2D1_BRUSH_PROPERTIES, которые могут использоваться для задания начального непрозрачности и преобразования.

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

Как его названию, интерфейс ID2D1SolidColorBrush представляет сплошной цветной кисти. Он добавляет методы для управления цветом, используемым кисти. Сплошной цветной кисти создается с помощью метода CreateSolidColorBrush целевого буфера визуализации:

Я собираюсь оставить полное обсуждение фигуры для следующего раздела, но в целях обеспечения необходимости что-нибудь для просмотра, я будет просто заполнения целевого буфера визуализации в окне с помощью прямоугольника, на основе размера целевого буфера визуализации. Следует помнить, что Direct2D использует аппаратно независимых точек (DIPs). Как следствие размер, сообщенные конкретного устройства, например клиентской области окна рабочего стола, может не соответствовать размера целевого буфера визуализации. К счастью очень легко получить размер целевого буфера визуализации в с помощью метода GetSize DIPs. Возвращает GetSize D2D1_SIZE_F структуры, Direct2D используется для представления размеры с двумя с плавающей запятой указывать значения ширины и высоты. Затем я может предоставить описание области для заполнения с помощью вспомогательная функция RectF и подключить сообщенные целевого буфера визуализации размер переменной D2D1_RECT_F. И, наконец, я могу использовать метод FillRectangle целевого буфера визуализации выполнить фактическое рисунка.

Вот как выглядит код:

На рис. 1 показано окно как выглядит сплошной зеленой кистью. Очень интересные действительно!

Direct2D также поддерживает два типа градиентные кисти. Кисти градиента является, заполняет область цвета смешением вдоль оси. Кисти линейного градиента определяет ось как прямую линию с начальной и конечной точки. Кисти радиального градиента определяет ось как эллипса, где цвета radiate наружу из некоторые точки относительно центра эллипса.

Градиент определяется как последовательность относительные позиции от 0,0 до 1,0. Каждый имеет собственный цвет и вызывается ограничителя градиента. Имеется возможность использовать позиций за пределами этого диапазона для создания различных эффектов. Чтобы создать градиентную кисть, сначала необходимо создать коллекцию ограничителя градиента. Начните определение массива структур D2D1_GRADIENT_STOP.

Далее вызовите метод CreateGradientStopCollection целевого буфера визуализации для создания объекта коллекции зависимости массив позициями градиента:

Первый параметр — указатель на массив и второй параметр предоставляет размер массива. Здесь я просто использую макрос стандартных _countof. Метод CreateGradientStopCollection возвращает новой коллекции. Для создания кисти линейного градиента, необходимо также обеспечивают структуру D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES для указания начала и конечная точка оси градиента. В отличие от позиции градиента эти точки находятся в пространстве координат кисть, которая обычно это для целевого буфера визуализации Если преобразование не установлен на кисти. Например можно создать кисть с ось, которая следующим запускается из верхнего левого угла целевого буфера визуализации нижний правый угол:

LinearGradientBrushProperties является другой функцией вспомогательный, предоставляемые Direct2D инициализировать структуру D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES. Метод CreateLinearGradientBrush принимает это вместе с коллекцией градиента, показанного выше и возвращает указатель интерфейса ID2D1LinearGradientBrush, представляющий новой кисти.

Конечно кисть не известно, при изменении размера целевого буфера визуализации. При желании конечная точка оси, чтобы изменить как изменить размер окна так легко можно сделать с помощью метода SetEndPoint кисти. Аналогично можно изменить на осьв начале точки метод SetStartPoint.

Вот как выглядит код прорисовки.

На рис. 2 показано окно как выглядит с помощью кисти линейного градиента.

Для создания кисти радиального градиента, необходимо предоставить структуру D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES. Эта структура определяет эллипса, а также смещением относительно центра эллипса, представляющий начало координат, из которых кисть «излучает»цвет, в зависимости от коллекции ограничителя градиента. Следующий пример формирует эллипс, центрируется целевого буфера визуализации, имеет X и Y radius в соответствии с целевого буфера рендеринга и происхождение половину способ сторону нижний правый угол:

RadialGradientBrushProperties является другой функцией вспомогательный, предоставляемые Direct2D инициализировать структуру D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES. Метод CreateRadialGradientBrush принимает это вместе с коллекцией градиента, показанного выше и возвращает указатель интерфейса ID2D1RadialGradientBrush, представляющий новой кисти.

Можно также изменить эллипс и происхождение кисти в любое время следующим образом:

На рис. 3 показано кисти радиального градиента.

Direct2D также предоставляет кисти точечного рисунка, но Оставим обсуждение Direct2D точечные рисунки для будущей статьи.


Фигуры

До сих я показал, можно только способы заливки прямоугольника, так что МНЕ удалось сосредоточиться на кисти, но Direct2D сделать так много более простой прямоугольников. Новичкам следует иметь в виду прямоугольники, закругленные прямоугольники и эллипсы предоставляются примитивов. По примитивы я просто значит является обычный старую структуру данных для каждого из этих.

D2D1_RECT_F представляет прямоугольник с плавающей запятой и сам является typedef D2D_RECT_F:

D2D1_ROUNDED_RECT представляет Скругленный прямоугольник и определен с radiuses, определение эллипсы квартал, который будет использоваться для рисования углы следующим образом:

D2D1_ELLIPSE представляет эллипса и определен с центральной точки, а также radiuses:

Хотя эти структуры может показаться не слишком интересными, существуют две причины их упомянуть заранее. Во-первых они используются для создания более сложных объектов геометрии. Во-вторых Если необходимо заполнить или один из этих примитивов рисования, вы должны придерживаться с ними как обычно возникнет лучшую производительность, если избежать геометрических объектов.

Целевые буферы визуализации предоставляют набор из заполнения действия методы и для заполнения и структура этих примитивов. Пока я показал как использовать метод FillRectangle. Я не расточки, с примерами FillRoundedRectangle и FillEllipse методов, как они работают точно так же. В отличие от для методов заливки методы рисования может использоваться для структуры конкретной фигуры и являются весьма гибким. Как методов заливки действия методы, охватывающие все три примитивов работать в точно так же, поэтому расскажу только метод DrawRectangle.

В простейшем виде можно нарисовать контур прямоугольника следующим образом:

Третий параметр указывает ширину штрих, который рисуется контур прямоугольника. Штриха сам центрируется на прямоугольник, если заполнено этот же прямоугольник будет видно штриха и заливки перекрываются по 10.0 DIPs. Дополнительный четвертый параметр может быть предоставлено для управления стиль штрих, который рисуется. Это полезно, если требуется Рисование пунктирной линии или просто хотите управлять типом соединения с вершины фигуры.

Сведения о стиле штриха представляется интерфейса ID2D1StrokeStyle. Объекты стиля штриха являются аппаратно независимых ресурсов, что означает, что им не нужно заново при каждом целевого буфера визуализации является недействительным. В этом случае создается новый объект стиля штриха с помощью метод объекта фабрики Direct2D CreateStrokeStyle.

Если требуется просто штриха использовать определенный тип соединения, можно создать стиль штриха следующим образом:

Структура D2D1_STROKE_STYLE_PROPERTIES предоставляет множество элементов управления различными аспектами стиля штриха, в частности фигуры или отрезка на каждом конце структуры или тире, а также сам стиль тире. Второй и третий параметр для метода CreateStrokeStyle являются необязательными и необходимо предоставить их только при определении стиля пользовательские пунктирной штриха. Чтобы определить стиль штрихов пунктирной линией, убедитесь, в пары указан тире. Первый элемент в каждой паре равна длине дефиса, а второй — длина пробел перед следующей тире. Сами значения умножаются ширина штриха. Можно задать столько пар при необходимости произвести нужный шаблон. Приведем пример:

Можно выбрать любой из количество различных тире стилей из перечисления D2D1_DASH_STYLE вместо определения собственных. На рис. 4 показан некоторые стили, различные штрих на работе. Если внимательно посмотрите вы увидите, что переходит Direct2D автоматически альфа-сглаживание примитива для лучше выглядящие результатов.

Вот поэтому гораздо больше, Direct2D можно выполнить, из сложных геометрических объектов и преобразований, для рисования текста и рисунков и многое другое. Надеюсь, что рассмотрены эти и несколько столбцов в будущем.

How do you draw text in DirectX 12?

In Direct3D-12, things got much more complex and since it’s new I couldn’t find any suitable libraries online.

I’m building a basic Direct3D12 FPS Test application, and I like to display the FPS data on screen with my rendered image.

4 Answers 4

The general answer to questions like this is «if you have to ask, then you probably should be using DirectX 11.» DirectX 12 is a graphics expert API that provide immense control, and is not particularly concerned with ease-of-use for novices. See this thread for more thoughts in this vein.

With that out of the way, one option is to use device interop and Direct2D/DirectWrite. See Working with Direct3D 11, Direct3D 10 and Direct2D.

UPDATE: DirectX Tool Kit for DirectX 12 is now available. It includes a SpriteFont / SpriteBatch implementation that will draw text on Direct3D 12 render targets. See this tutorial.

Pure DirectX 12, then you need to load the font glyph data into a vertex buffer and render with a vertex shader and pixel shader. You mentioned libraries online, will this is expert stuff and fortunately James Stanard at Microsoft release a how to with their open source MiniEngine project. He handles multiple fonts, antialiasing, and drop shadows in DirectX 12.

Find the project files at GitHub https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine and check out Textrender.h and Textrender.cpp

If you want maximum feature set with minimum work you probably should go with DirectWrite on top of a D3D11 interop device, like Chuck said in his answer.

If you want to roll your own high performance text rendering you may want to take a look at the text renderer in the miniengine example repository on github, it has some interesting ideas.

Unfortunately the only ways have already been described. Interface with DirectWrite or create your glyph file system.

What you are doing is importing a texture file with glyphs on it, cutting out small squares around each character from the glyph texture file, and then gluing it all together to form a string. It results in some faster drawing (in some case).

I think the approach to this as referenced by the others is slightly outdated and destined to fail. Direct3D11 had the same lack of text drawing support as Direct3D12 (perhaps misinformation on that). It was Direct3D9 which had the built in text drawing support, which nonetheless worked fine, and later supported sprite batch drawing where you could render all text in one sprite.

It seems backwards to state that you simply «need to know» or «are not an expert» to implement such a basic yet tedious system. Such a system is destined to fail in the same way why no one wants to use Assembly to code something they can code in C and onward.

The D3D11 and D3D12 math library also suffers from the same failures. To define and convert vectors you are better off including D3D9X math or custom math structures because the newer methods included are so backwards. «Someone» made it and must like it, but I remember making a complaint showing how easy it is to do vector operations before vs afterward, it nearly doubles or triples the amount of lines needed to perform basic vectors operation and conversions, not even counting the amount of references and learning time you would need to see how someone else’s lib works. It seems to be a big failure presented by mathematicians who were never good at programming.

DirectDraw Compatibility Tool

Дубликаты не найдены

она добавляет в специальную ветку реестра путь к exe-шнику, выставляя ему принудительный флаг совместимости.

стандартным методом выставления совместимости (через свойства) — система тоже пишет это, но флаги не всегда верные. а прога типа делает это более правильно.

(согласно описанию с оф. ветки на форуме и комментариев автора).

>> вместо изменения пары параметров операционки

как было выяснено в обсуждении на форуме (откуда и была взята софтина), что стандартные параметры совместимости не всегда работают (не совсем нужные свойства пишутся в ветку реестра).

и ни ручная правка реестра (с нужными свойствами), ни использование Microsoft Application Compatibility Tool (ACT) не намного быстрее, нежели использование этой проги.

она патчит реестр за вас, нужную ветку, нужными свойствами. если не доверяете — есть как раз возможность создания reg-файла, для его проверки и дальнейшего импорта.

в оф. теме все описано. а понятно ли — другой вопрос.

DirectDraw

Англо-русский толковый словарь терминов и сокращений по ВТ, Интернету и программированию. . 1998-2007 .

Смотреть что такое «DirectDraw» в других словарях:

DirectDraw — is part of Microsoft s DirectX API. DirectDraw is used to render graphics in applications where top performance is important. DirectDraw also allows applications to run fullscreen or embedded in a window such as most other MS Windows applications … Wikipedia

DirectDraw — est une bibliothèque logicielle de la suite DirectX de Microsoft. Elle est utilisée pour le rendu d image où une haute performance est importante. DirectDraw permet aussi aux applications de se lancer en mode plein écran ou fenêtré comme dans la… … Wikipédia en Français


DirectDraw — DirectDraw, DirectX … Universal-Lexikon

DirectDraw — Microsoft DirectX Entwickler: Microsoft Corporation Aktuelle Version: 10.1 (März 2009 Build) … Deutsch Wikipedia

DirectDraw — … Википедия

DirectDraw — ● ►en np. tm. m. ►AFFICH Anciennement appelé DCI technique définie par Intel et Microsoft, permettant aux applications d envoyer directement des ordres à la carte graphique lorsque le processeur est occupé … Dictionnaire d’informatique francophone

DirectDraw Surface — The DirectDraw Surface file format (uses the filename extension DDS), from Microsoft, is a standard for storing data compressed with the lossy S3 Texture Compression (S3TC) algorithm,[1] which can be decompressed in hardware by GPUs and consoles… … Wikipedia

DirectDraw Surface — DDS (DirectDraw Surface) формат хранения данных, разработанный корпорацией Майкрософт для использования в DirectX SDK. Содержание 1 Общая информация 2 История создания … Википедия

Илон Маск рекомендует:  scrollbar-3dlight-color в CSS

Direct3D — is part of Microsoft s DirectX API. Direct3D is only available for Microsoft s various Windows operating systems (Windows 95 and above) and is the base for the graphics API on the Xbox and Xbox 360 console systems. Direct3D is used to render… … Wikipedia

Microsoft Direct3D — Direct3D is part of Microsoft s DirectX application programming interface (API). Direct3D is available for Microsoft Windows operating systems (Windows 95 and above), and for other platforms through the open source software Wine. It is the base… … Wikipedia

DirectShow — Logo of the DirectX Media SDK – the first time DirectShow was distributed under its current name.[citation needed] DirectShow (sometimes abbreviated as DS or DShow), codename Quartz, is a multimedia framework and API produced by Microsoft for… … Wikipedia

Direct draw термины и концепции интерфейс directdrawpalette

Основные сведения о новом интерфейсе программирования игровых программ для Windows 95. DirectDraw — графический компонент недавно появившегося пакета разработки игровых программ Game SDK фирмы Microsoft — новый мощный инструмент, который наконец-то дает разработчикам возможность низкоуровневого доступа к миллионам плат видеоакселераторов, применяемых в современных ПК. В первой из двух статей мы обсудим, что же, в сущности, представляет собой интерфейс DirectDraw и как его можно использовать. В следующей статье мы представим вам игру, написанную нами с использованием DirectDraw, а также поговорим о многократно используемых классах Си++, применяемых в нашей игре.

Интерфейс DirectDraw API делает возможным «прямой» доступ как к видеопамяти, так и к аппаратным графическим акселераторам, встраиваемым в большинство видеоплат, которые появились на рынке в последние несколько лет. DirectDraw позволяет реализовать широкий диапазон функций, но многие его функциональные возможности еще не реализованы в существующих видеоплатах и драйверах.

В настоящее время DirectDraw имеет три основных достоинства. Первое из них — аппаратная пересылка растрового (двоичного) блока (hardware blitting), представляющая собой способность использовать соответствующее устройство (blitter) на видеоплате для копирования изображений из одной области видеопамяти в другую. В дополнение к стандартным пересылкам растровых блоков (bit blok transfer), DirectDraw позволяет выполнять прозрачную пересылку (transparent blits), когда все пикселы указанного цвета игнорируются и, в силу этого, не отображаются в приемнике. Поскольку аппаратные пересылки растровых блоков выполняются асинхронно, ЦП в это время может заниматься другой работой.

Второе достоинство — листание страниц (page flipping) — метод, для реализации которого создаются два или большее число «экранов»: первая страница и одна или несколько страниц заднего плана. Первая страница выводится на экран в текущий момент времени, а страница заднего плана скрыта из виду. Рендеринг выполняется на фоновой странице; страницы переключаются после того, как построено окончательное изображение: фоновая страница с только что сформированным изображением, теперь видимая, становится передней. И наоборот, бывшая передняя страница перемещается на задний план и можно приступать к построению на ней нового экрана.

Последнее достоинство интерфейса DirectDraw — цветовая заливка (color filling). Операция цветовой заливки напоминает аппаратную пересылку растровых блоков, но в данном случае аппаратные средства заполняют указанную область видеопамяти одним цветом. Этот прием может быть полезен для удаления спрайтов и целых страниц.

Модель компонентного объекта

Прежде чем пользоваться интерфейсом DirectDraw, вам будет полезно познакомиться с основами Модели компонентного объекта (COM — Component Object Model), так как все компоненты пакета Game SDK инкапсулированы в объектах COM. Объект COM очень похож на объект Си++, с некоторыми важными отличиями. Вы можете создать экземпляр объекта COM, вызвать методы его интерфейсов (эквивалент принадлежащих функций) и уничтожить его после того, как прекратите им пользоваться. Вы не можете напрямую обращаться к параметрам объектов COM, и они не имеют конструкторов и деструкторов. Обычно вместо конструктора предусматривают функцию создания, а для удаления объекта COM применяют метод Release базового интерфейса IUnknown.

Завладев указателем на объект COM, вы можете вызывать его принадлежащие функции точно так же, как и в случае с объектом Си++, так как формат COM распознается большинством Windows-компиляторов Си++. В действительности, поскольку интерфейс COM фактически скрыт функциями DirectDraw API, мы свободно можем обращаться к объектам DirectDraw так, как если бы они были обычными объектами Си++.

Вы можете использовать объекты COM в чистых Си-программах, хотя это и сопряжено с некоторыми неудобствами. Например, в языке Си вам придется вызвать принадлежащую функцию объекта COM таким образом:

Файлы заголовков пакета Game SDK содержат несколько макрокоманд, которые делают доступ из Си не столь неуклюжим.

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

Первый параметр — указатель на глобально уникальный идентификатор (GUID), представляющий собой драйвер, для которого должен быть создан объект DirectDraw. Используйте параметр NULL, если хотите работать с активным дисплеем, если же вы хотите принудительно использовать режим программной эмуляции, то остановите свой выбор на DDCREATE_EMULATIONONLY. (У вас может появиться желание использовать эмуляцию только для тестирования и отладки или для того, чтобы удостовериться, что ваша прикладная программа способна работать в режиме эмуляции. DirectDraw имеет «слой» аппаратной эмуляции, имитирующей средства, которые могут отсутствовать в самом видеодрайвере DirectDraw, а также возможности, отсутствующие на видеоплате, например способность растягивать изображение.) Если функция DirectDrawCreate завершается успешно, то pDirectDraw будет инициализирован действительным указателем на объект DirectDraw, а hResult примет значение DD_OK. Если она заканчивается неудачно, то hResult будет иметь некоторое значение, отличное от DD_OK. Последний параметр предназначен для агрегирования объектов OLE2 и может быть оставлен пустым (NULL).

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

После того как вы изменили уровень кооперации, вам нужно установить режим дисплея. Интерфейс DirectDraw позволяет работать с многими значениями разрешения и глубины цвета, но в настоящий момент в сочетании с аппаратным ускорением реализованы только это 640×480 или 640×400 при глубине цвета 8 или 16 бит на пиксел. Последняя редакция DirectDraw предусматривает также параметры разрешения ModeX 320×200 и 320×240 при глубине цвета 8 бит/пиксел, но эти режимы предполагают простой доступ к буферу кадра, подобный реализованному в DOS. Использование режима ModeX возможно только в случае, если при вызове функции SetCooperativeLevel установлен флаг DDSCL_ALLOWMODEX.

Вы можете вернуть дисплей в его исходный режим, вызвав функцию RestoreDisplayMode, либо он может быть восстановлен автоматически при освобождении объекта DirectDraw.

Следующий шаг — создание первичного объекта DirectDrawSurface, который представляет или «поверхность» дисплея, или неотображаемый буфер и располагается в системной или видеопамяти. Его принадлежащие функции позволяют копировать данные с одной поверхности на другую, листать страницы и выполнять многие другие операции. Поверхности DirectDraw создаются с помощью принадлежащей функции CreateSurface объекта DirectDraw:

Этот программный фрагмент создает сложную первичную поверхность с передним буфером, одним буфером заднего плана и возможностью листания. Сложная поверхность в действительности представляет собой просто способ создания более одной поверхности с помощью вызова функции CreateSurface. Флаг DDSCAPS_PRIMARYSURFACE имеет двойное назначение: он делает новосозданную поверхность отображаемой и дает команду DirectDraw установить размеры поверхности в соответствии с текущим режимом дисплея.

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

Следующий шаг — создание объекта DirectDrawPalette с помощью функции CreatePalette. Объекты DirectDrawPalette представляют собой 16- или 256-индексные палитры, которые могут присоединяться к поверхностям. Как правило, выбирают 256-цветную палитру. Для ее создания нужно организовать массив структур PALETTEENTRY. Это те самые структуры RGB, которые вы используете для создания обычных палитр GDI. Заполнив массив 256-цветными триадами, вы передаете их в функцию CreatePalette:

Теперь все 8-разрядные значения на первичной поверхности будут проиндексированы относительно указателя pDDPalette для получения верных значений RGB.

Практическое применение Directdraw

После того как мы определили все существенные моменты применения DirectDraw, обсудим некоторые функции и приемы программирования, которые могут понадобиться при написании общеупотребительных сценариев.

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

Для простых прозрачных и копирующих пересылок блоков функция BltFast предпочтительнее, чем Blt. Если вы используете программную эмуляцию, то быстродействие BltFast на 10% выше, чем Blt; однако если вы полагаетесь на аппаратные пересылки, то разницы в быстродействии нет. При желании выполнить сплошную цветовую закраску или прибегнуть к более изощренным эффектам, основанным на блоковой пересылке данных, следует использовать стандартную функцию Blt.

Данная строка копирует область, определенную параметром sourceRect из pSourceSurface в позицию с координатами nDestX, nDestY на поверхности pDestSurface, используя цветовой ключ поверхности источника для прозрачности. Цветовой ключ для любой поверхности можно определить с помощью функции SetColorKey:

После выполнения этого программного фрагмента всякий раз, когда вы будете осуществлять пересылку растровых блоков из pSourceSurface на другую поверхность и дадите функциям Blt или BltFast указание использовать цветовой ключ источника, все пикселы со значением 0 окажутся прозрачными.

Еще один полезный тип пересылки растровых блоков — цветовая заливка, выполняемая с помощью вызова функции Blt после установки соответствующих флагов. Приведенный ниже программный фрагмент закрасит указанный участок поверхности-приемника цветом 0.

При программировании игр часто возникает необходимость простой пересылки изображения с одной поверхности на другую, бывает нужно также манипулировать конкретными битами, составляющими образ в видеопамяти. Чтобы сделать это, вам необходимо получить указатель на область памяти поверхности с помощью функции Lock поверхности, которую вы должны вызвать с указанием структуры RECT, определяющей прямоугольную область, подлежащую блокированию. Если вам нужна вся поверхность, то указатель прямоугольника должен быть пустым (NULL). Когда функция Lock завершит свою работу, структура DDSURFACEDESC будет содержать указатель на память поверхности в элементе lpSurface. Не забудьте поставить его в соответствие типу указателя, так как он относится к LPVOID и не имеет размера. Также обратите внимание на флаг DDLOCK_WAIT: в момент вызова функции Lock DirectDraw может все еще быть занят пересылкой растровых блоков, и эта операция вследствие возникшего конфликта закончится неудачей. Если установлен флаг ожидания, то DirectDraw дождется окончания пересылки.

После вызова функции Lock указатель pBits будет указывать на область памяти, занимаемую целевой поверхностью, независимо от того, находится ли она в системной или видеопамяти. Когда вы завершите запись на эту поверхность, не забудьте вызвать функцию Unlock. В промежутке между вызовами функций Lock и Unlock следует быть осмотрительным, поскольку в это время нельзя использовать стандартные отладчики ГИП.

В дополнение к блокированию поверхности на время выполнения специальных операций пересылки растровых блоков вы можете также получить стандартный контекст устройств (device context, DC) Windows, относящийся к данной поверхности. Наиболее ценное достоинство такого подхода — возможность передать обработку всех текстов функции TextOut интерфейса графических устройств GDI. Почти все современные видеоплаты располагают теми или иными аппаратными средствами быстрого формирования шрифтов TrueType, поэтому данный способ, вероятно, обладает более высоким быстродействием, чем стандартный метод хранения растровой карты для каждой цифры и буквы.

Чтобы получить контекст устройства для какой-либо поверхности, следует вызвать принадлежащую функцию GetDC. Передаваемый ею в вызывающую программу дескриптор (handle) контекста устройства представляет собой стандартный Windows hDC и может использоваться соответствующим образом. После того как вы покончили с hDC, вам следует вызвать функцию ReleaseDC. Всякий раз при вызове функции GetDC интерфейс DirectDraw выполняет внутренний вызов функции Lock, поэтому ограничения, налагаемые на процесс отладки в промежутке между вызовами функций Lock и Unlock, действуют и для функций GetDC и ReleaseDC.

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

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

Пол Модзелевски — консультант, специализирующийся на разработке интерактивных мультимедиа-программ на Си++ для Windows 95. К нему можно обратиться по адресу pmodz@mlj.com. Джиорджи Грелл — программист, работающий на Си++ в компании MLJ и специализирующийся на графическом программировании и разработке пользовательских интерфейсов. Его адрес — ggre@gsoftinc.com.

Модуль подписки в настоящее время недоступен.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL