Основы directdraw


Содержание

Основы directdraw

Один из способов оценить API — посмотреть на его размер. Большой, сложный API может быть результатом неудачного планирования. С другой стороны, большой API иногда свидетельствует и о том, что разработчики учли все возможные ситуации и позаботились о вас. Маленькие API нередко характерны для новых пакетов с ограниченными возможностями. С другой стороны, это может говорить и о том, что API делает только самое необходимое и ничего больше.

DirectDraw API невелик. В сущности, он настолько мал, что все его функции можно рассмотреть в одной главе (так мы и поступим), не превращая ее в справочное руководство. DirectDraw обладает некоторыми удобными средствами и подчиняется нескольким ограничениям.

Библиотека DirectDraw оформлена в виде четырех COM-объектов. Доступ к каждому объекту осуществляется через один или несколько интерфейсов. Вот их полный список:

  • DirectDraw
  • DirectDraw2
  • DirectDrawSurface
  • DirectDrawSurface2
  • DirectDrawSurface3
  • DirectDrawPalette
  • DirectDrawClipper

Мы рассмотрим все интерфейсы вместе с входящими в них функциями. Тем не менее этот раздел не претендует на то, чтобы заменить собой справочное руководство. Help-файл, входящий в состав DirectX SDK, несмотря на все ограничения, содержит достаточно справочной информации, так что мы не станем подробно рассматривать все функции, а поговорим вместо этого о том, что делает каждая функция, для чего и с какой вероятностью она вам может понадобиться.

Интерфейсы DirectDraw и DirectDraw2

В первоначальном варианте библиотеки DirectX (еще в те времена, когда она называлась Game SDK) вся основная функциональность DirectDraw была сосредоточена в интерфейсе DirectDraw . Позднее, с выходом DirectX 2, рабочий интерфейс был усовершенствован. В соответствии со спецификацией COM интерфейс DirectDraw не изменился, а для работы с новыми возможностями использовался новый интерфейс DirectDraw2 . Следует заметить, что интерфейс DirectDraw2 представляет собой расширение DirectDraw . Он предоставляет все возможности интерфейса DirectDraw , а также ряд дополнительных. При работе с DirectX версий 2 и выше можно выбирать между интерфейсом DirectDraw и DirectDraw2 . Поскольку DirectDraw2 делает все то же, что и DirectDraw , а также многое другое, вряд ли можно найти какие-то доводы в пользу работы с DirectDraw . Кроме того, Microsoft выступает против хаотичного, непоследовательного использования этих интерфейсов. По этим причинам во всех программах, приведенных в книге, будет использован интерфейс DirectDraw2 .

Ниже перечислены все функции интерфейсов DirectDraw и DirectDraw2 (в алфавитном порядке):

  • Compact()
  • CreateClipper()
  • CreatePalette()
  • CreateSurface()
  • DuplicateSurface()
  • EnumDisplayModes()
  • EnumSurfaces()
  • FlipToGDISurface()
  • GetAvailableVidMem()
  • GetCaps()
  • GetDisplayMode()
  • GetFourCCCodes()
  • GetGDISurface()
  • GetMonitorFrequency()
  • GetScanLine()
  • GetVerticalBlankStatus()
  • RestoreDisplayMode()
  • SetCooperativeLevel()
  • SetDisplayMode()
  • WaitForVerticalBlank()

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

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

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

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

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

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

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

Функция GetCaps()

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

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

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

СОВЕТ

Функция SetCooperativeLevel()

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

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

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

  • EnumDisplayModes()
  • GetDisplayMode()
  • RestoreDisplayMode()
  • SetDisplayMode()

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

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

Функция RestoreDisplayMode() восстанавливает видеорежим, действовавший до вызова SetDisplayMode() . Перед вызовом функций SetDisplayMode() и RestoreDisplayMode() необходимо предварительно установить монопольный уровень кооперации вызовом функции SetCooperativeLevel() .

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

Помимо функции CreateSurface() интерфейс DirectDraw содержит следующие функции для работы с поверхностями:

  • DuplicateSurface()
  • EnumSurfaces()
  • FlipToGDISurface()
  • GetGDISurface()
  • GetAvailableVidMem()
  • Compact()

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

Функция EnumSurfaces() используется для перебора всех поверхностей, удовлетворяющих заданному критерию. Если критерий не указан, составляется список всех существующих поверхностей.

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

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

Функция GetAvailableVidMem() возвращает объем текущей доступной видеопамяти. Эта функция присутствует в интерфейсе DirectDraw2 , но отсутствует в DirectDraw . С ее помощью приложение может определить, сколько поверхностей ваше приложение сможет создать в видеопамяти.

Функция Compact() не реализована в DirectX, однако в будущем она обеспечит механизм дефрагментации видеопамяти. Если ваше приложение постоянно создает и уничтожает поверхности, находящиеся в видеопамяти, дефрагментация может высвободить немало места.

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

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

  • GetMonitorFrequency()
  • GetScanLine()
  • GetVerticalBlankStatus()
  • WaitForVerticalBlank()

Говоря конкретно, эти функции относятся к механизму смены кадров на мониторе. С их помощью можно реализовать анимации с минимальным мерцанием и задержками. Тем не менее следует учесть, что эти функции поддерживаются не всеми комбинациями видеокарт и мониторов.

Функция GetMonitorFrequency() возвращает текущую частоту смены кадров монитора. Эта частота обычно измеряется в герцах (Гц). Например, частота в 60 Гц означает, что состояние экрана обновляется 60 раз в секунду.

Функция GetScanLine() возвращает номер строки развертки (горизонтального ряда пикселей), обновляемой в данный момент. Она не поддерживается некоторыми комбинациями видеокарт и мониторов. Если данная способность не поддерживается, функция возвращает код ошибки DDERR_UNSUPPORTED .

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

Функция GetFourCCCodes()

Наш обзор интерфейса DirectDraw завершается функцией GetFourCCCodes() . Она возвращает коды FourCC, поддерживаемые видеокартой. Коды FourCC используются для описания YUV-поверхностей, не относящихся к стандарту RGB. Мы не будем рассматривать такие поверхности, так как они выходят за рамки этой книги.

Интерфейсы DirectDrawSurface

Множественные интерфейсы DirectDrawSurface , как и интерфейсы DirectDraw , возникли из-за особенностей спецификации COM. В исходном варианте работа с поверхностями осуществлялась через интерфейс DirectDrawSurface . В DirectX 2 появились новые функциональные возможности, представленные интерфейсом DirectDrawSurface2 , а в DirectX 5 возник интерфейс DirectDrawSurface3 .

Хотя в этой книге вместо DirectDraw повсюду используется интерфейс DirectDraw2 , для работы с поверхностями мы будем придерживаться исходного интерфейса DirectDrawSurface , потому что нововведения интерфейсов DirectDrawSurface2 и DirectDrawSurface3 не слишком важны. В оставшейся части книги термин «интерфейс DirectDrawSurface » будет обозначать все три интерфейса, если при этом не возникает двусмысленности.

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

  • AddAttachedSurface()
  • AddOverlayDirtyRect()
  • Blt()
  • BltBatch()
  • BltFast()
  • DeleteAttachedSurface()
  • EnumAttachedSurfaces()
  • EnumOverlayZOrders
  • Flip
  • GetAttachedSurface()
  • GetBltStatus()
  • GetCaps()
  • GetClipper()
  • GetColorKey()
  • GetDC()
  • GetDDInterface()
  • GetFlipStatus()
  • GetOverlayPosition()
  • GetPalette()
  • GetPixelFormat()
  • GetSurfaceDesc()
  • IsLost()
  • Lock()
  • PageLock()
  • PageUnlock()
  • ReleaseDC()
  • Restore()
  • SetClipper()
  • SetColorKey()
  • SetOverlayPosition()
  • SetPalette()
  • SetSurfaceDesc()
  • Unlock()
  • UpdateOverlay()
  • UpdateOverlayDisplay()
  • UpdateOverlayZOrder()

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

Мы начнем с четырех функций, с помощью которых можно получить информацию о самой поверхности:

  • GetCaps()
  • GetPixelFormat()
  • GetSurfaceDesc()
  • SetSurfaceDesc()

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

Функция GetPixelFormat() особенно важна при работе с поверхностями форматов High и True Color, поскольку формат пикселей может зависеть от видеокарты. Функция возвращает маски, которые определяют способ хранения отдельных цветовых составляющих.

Функция GetSurfaceDesc() возвращает описание поверхности. Сведения включают ширину и высоту поверхности, а также глубину пикселей. В описание поверхности также входит формат ее пикселей (в том же виде, что и получаемый с помощью функции GetPixelFormat() ).

Функция SetSurfaceDesc() (появилась только в DirectX 5 и поддерживается только интерфейсом DirectDrawSurface3 ) позволяет задать значения некоторых атрибутов поверхности. Например, с ее помощью можно выбрать тип памяти, в которой должна находиться поверхность. Данная функция помогает реализовать нестандартную схему управления поверхностями.

Функции блиттинга

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

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

Функция BltBatch() не реализована в DirectX 5 (ее можно вызвать, но при этом ничего не произойдет). После реализации эта функция будет выполнять сразу несколько операций блиттинга, по возможности одновременно.

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


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

Функция Flip()

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

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

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

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

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

Аналогично, функция GetFlipStatus() показывает, происходит ли в данный момент переключение страниц. Для получения информации о переключении страниц, вызванном функцией Flip() , вместо GetBltStatus() следует пользоваться именно этой функцией даже в том случае, если DirectDraw имитирует переключение страниц посредством блиттинга.

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

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

По умолчанию поверхность не имеет цветового ключа. Чаще всего цветовой ключ представляет собой один цвет, однако на некоторых видеокартах возможна работа с интервалами цветовых ключей. Цветовые ключи и их интервалы описываются структурой DDCOLORKEY . Указатели на эту структуру передаются функциям GetColorKey() и SetColorKey() в качестве аргументов. Функции GetColorKey() и SetColorKey() используются при частичном копировании поверхностей, а также при выполнении операций с цветовыми ключами приемника.

Функции Lock() и Unlock()

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

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

Для заблокированных поверхностей не выполняются операции блиттинга и переключения, так что хранение поверхности в заблокированном состоянии не даст вам никаких преимуществ. Указатель, полученный функцией Lock() , после разблокирования поверхности становится недействительным.

Заблокированную поверхность невозможно заблокировать снова. Попытка вызова функции Lock() для уже заблокированной поверхности закончится неудачей.

Функции GetDC() и ReleaseDC()

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

Функция GetDC() предоставляет в ваше распоряжение DC (контекст устройства, Device Context), через который можно осуществлять вывод на поверхность стандартными функциями Win32. Например, передавая его функции Win32 TextOut() , можно вывести на поверхность текст. Функция ReleaseDC() должна быть вызвана сразу же после завершения работы с DC.

Как и в случае с Lock() и Unlock() , функцию ReleaseDC() необходимо вызывать после GetDC() как можно быстрее. Это связано с тем, что внутри функции GetDC() вызывается Lock() , а внутри ReleaseDC() — Unlock() .

Функции PageLock() и PageUnlock()

Перейдем к двум функциям, внешне похожим на Lock() и Unlock() :

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

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

Функция PageLock() сообщает Windows о том, что данную поверхность нельзя переносить на диск. В этом случае поверхность всегда остается доступной и не требует долгих обращений к жесткому диску. Функция PageUnlock() разрешает Windows переносить поверхность на диск.

Следует помнить, что частое использование PageLock() приведет к замедлению работы Windows из-за сокращения общего объема переносимой памяти. Когда именно это произойдет, зависит от объема памяти, для которой запрещен перенос на диск, и общего объема системной памяти.

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

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

Функции PageLock() и PageUnlock() не влияют на поверхности, находящиеся в видеопамяти.

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

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

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

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

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

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

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

Функция GetDDInterface()

Функция 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 имеются две функции:

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

Функции палитры

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

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

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

Интерфейс DirectDrawPalette

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

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

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

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

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

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

Интерфейс DirectDrawClipper

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

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

Объекты отсечения обычно используются для ограничения вывода, необходимого при работе приложений 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 мы переходим к структурам данных. Всего в 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.

Раз уж речь зашла о структурах, следует упомянуть, что перед использованием структур желательно заполнять их нулями. В этом случае предыдущий фрагмент будет выглядеть так:

Функция Win32 ZeroMemory() заполняет нулями область памяти, начало которой передается в качестве первого аргумента. Второй аргумент функции определяет размер инициализируемой области. Преимущество такого подхода состоит в том, что теперь можно выяснить, какие поля структуры изменились в результате вызова функции GetSurfaceDesc() . Если не инициализировать структуру, случайные значения в ее полях можно принять за величины, занесенные в нее DirectDraw.

Основы directdraw

тБЪНЕТ УБНПК УФТХЛФХТЩ. рТПЭЕ ЧУЕЗП ЙУРПМШЪПЧБФШ ПРЕТБФПТ sizeof() ДМС ЙОЙГЙБМЙЪБГЙЙ ЬФПЗП РПМС.

пРТЕДЕМСЕФ — ЛБЛЙЕ ЙЪ ДТХЗЙИ РПМЕК УФТХЛФХТЩ ВХДХФ ЧБМЙДОЩ — ФП ЕУФШ ЪОБЮЕОЙС ЛПФПТЩИ ОХЦОП ЙУРПМШЪПЧБФШ РТЙ УПЪДБОЙЙ РПЧЕТИОПУФЙ. чЕДШ РТЙ УПЪДБОЙЙ РТПУФПК РПЧЕТИОПУФЙ ДБМЕЛП ОЕ ЧУЕ ЙЪ ДЕУСФЛБ РПМЕК ОХЦОП ЙОЙГЙБМЙЪЙТПЧБФШ ЪОБЮЕОЙЕН ЮФП ЧЙДОП ЙЪ ОБЫЕЗП РТЙНЕТБ.

уФТХЛФХТБ Ч УФТХЛФХТЕ (DDSCAPS2) РПМС ЛПФПТПК ПРТЕДЕМСАФ УЧПКУФЧБ РПЧЕТИОПУФЙ Й ЕЕ ФЙР.

ьФП ЪОБЮЕОЙЕ ПФОПУЙФУС ФПМШЛП РПЧЕТИОПУФСН ЛПФПТЩЕ УПЪДБАФУС ЛБЛ РЕТЧЙЮОЩЕ(Ч РТЙМПЦЕОЙЙ ПОБ ПДОБ) Й ПРТЕДЕМСЕФ ЛПМЙЮЕУФЧП ЖПОПЧЩИ ЙМЙ ВЬЛ ВХЖЖЕТПЧ.

ъБ УПЪДБОЙЕ ПУОПЧОПК Й ЖПОПЧПК РПЧЕТИОПУФЙ ПФЧЕЮБЕФ УМЕДХАЭЙК ЛПД : пУОПЧОБС РПЧЕТИОПУФШ УПЪДБЕФУС ЧЩЪПЧПН CreateSurface . рПУЛПМШЛХ РТЙ УПЪДБОЙЙ НЩ ХЛБЪЩЧБЕН ФП, ЮФП ОБН ОХЦЕО ВЬЛ ВХЖЖЕТ — ЕЗП ОБН УПЪДБЧБФШ ОЕ ОХЦОП — ПО ЛБЛ ВЩ РТЙУПЕДЙОЕО Л ОБЫЕК РПЧЕТИОПУФЙ — РПЬФПНХ НЩ РПМХЮБЕН ХЛБЪБФЕМШ ЙУРПМШЪХС ЖХОЛГЙА ЙОЕФТЖЕКУБ >DDSCAPS2 . фХ УБНХА ЮФП ЧИПДЙФ Ч УПУФБЧ DDSURFACEDESC2 . чПФ Й ЧУЕ ДМС ОБЮБМБ ! рПУМЕ ЪБЧЕТЫЕОЙС ТБВПФЩ У DirectDraw ОХЦОП «ХВТБФШ ЪБ УПВПК» : пРЙУЩЧБФШ ЛБЦДХА ЖХОЛГЙА ОЕ ВХДХ — ОБЪОБЮЕОЙЕ ЛБЦДПК ЙФБЛ СУОП ЙЪ ОБЪЧБОЙК. рТЕДПУФПТПЦОПУФЙ ФЙРБ ЙОЙГЙБМЙЪБГЙЙ ХЛБЪБФЕМЕК Ч NULL ДБОШ ОЕ ФПМШЛП ИПТПЫЕНХ УФЙМА ОП Й ОЕ МЙЫОЙЕ РТЕДПУФПТПЦОПУФЙ. иПЮХ МЙЫШ ЮФПВЩ ФЩ ПВТБФЙМ ЧОЙНБОЙЕ ОБ ФП, ЮФП РПУЛПМШЛХ «ПЖЖЙГЙБМШОП» УБНЙ НЩ ОЕ УПЪДБЧБМЙ ВЬЛ ВХЖЖЕТ — ЕЗП «ХДБМСФШ» ОЕ ОХЦОП — ЪБ ЬФП ПФЧЕЮБЕФ g_pDDSPrimary->Release();
фЕРЕТШ ПВТБФЙ ЧОЙНБОЙЕ ОБ ЖХОЛГЙА DisplayWelcomeMsg. х DirectDraw ЕУФШ ПДОП РПМЕЪОПЕ Ч РТПУФЩИ ДЕНПОУФТБГЙПООЩИ(ЙНЕООП ДЕНПОУФТБГЙПООЩИ РП НПЕНХ НОЕОЙА ЙВП ФПТНПЪЙФ) ГЕМСИ УЧПКУФЧП — ПОП НПЦЕФ ЙУРПМШЪПЧБФШ ЖХОЛГЙЙ GDI Windows ДМС ТЙУПЧБОЙС ОБ УЧПЙИ РПЧЕТИОПУФСИ — ДМС ЬФПЗП МЙЫШ ОХЦОП РПМХЮЙФШ ЛПОФЕЛУФ ХУФТПКУФЧБ ЛБЛ ЬФП ДЕМБЕФУС Х НЕОС: лУФБФЙ — ЪДЕУШ С РПУФХРЙМ ОЕ УПЧУЕН ИПТПЫП — С ОЕ РТПЧЕТСА ТЕЪХМШФБФБ. фП ЕУФШ С ОЕ ЪОБА — ЧЕТОХМБУШ МЙ ПЫЙВЛБ ЙМЙ ЧУЕ РТПЫМП ОПТНБМШОП. фБЛ РПУФХРБФШ ОЕ ИПТПЫП — DirectDraw (лБЛ ЧРТПЮЕН Й ЧУЕ ПУФБМШОПЕ, ЛБЛ Й ЧУС ОБЫБ ЦЙЪОШ) ОЕ РТПЭБЕФ ПЫЙВПЛ ;). лУФБФЙ Ч ЬФПК ЖХОЛГЙЙ ЧЕУШ ЧЩЧПД ЙДЕФ ОБ ПУОПЧОХА РПЧЕТИОПУФШ, ФБЛ ЮФП Ч ЬФПН РТЙМПЦЕОЙЙ ЖПОПЧЩК ВХЖЖЕТ БВУПМАФОП ОЕ ЙУРПМШЪХЕФУС. рПУМЕ ЙУРПМШЪПЧБОЙС ЛПОФЕЛУФ ХУФТПКУФЧБ ОХЦОП ХДБМЙФШ :

рБТХ УМПЧ ОБ РПУМЕДПЛ:

  • еУМЙ Ч УЙУФЕНЕ РТЙУХФУФЧХЕФ ОЕУЛПМШЛП ЧЙДЕПЛБТФ ЙМЙ ХУЛПТЙФЕМЕК УРПУПВОЩИ ТБВПФБФШ У DirectDraw ЙМЙ ЦЕ ФЩ ЛБЛ ТБЪТБВПФЮЙЛ РТЕДРПМБЗБЕЫШ ЬФП — ДП ЙОЙГЙБМЙЪБГЙЙ РТЙМПЦЕОЙЕ ДПМЦОП ЪБРТПУЙФШ УРЙУПЛ ЬФЙИ ХУФТПКУФЧ ЖХОЛГЙЕК DirectDraw API DirectDrawEnumerate ЙМЙ DirectDrawEnumerateEx .
  • ч УМХЮБЕ ПЛПООПЗП РТЙМПЦЕОЙС ОБН ОЕ ОХЦОП ХУФБОБЧМЙЧБФШ (ДБ НЩ Й ОЕ НПЦЕН) ЧЙДЕПТЕЦЙН. рПУМЕ УПЪДБОЙС ПУОПЧОПК РПЧЕТИОПУФЙ ОХЦОП УПЪДБФШ Й РТЙУПЕДЕОЙФШ Л ОЕК ФБЛ ОБЪЩЧБЕНЩК ПВЯЕЛФ ПФУЕЮЕОЙС (Clipper) ДМС ЛПОФТПМС ЪБ ПВМБУФША ЧЩЧПДБ. (жХОЛГЙЙ CreateClipper , SetClipper ).
  • пЛПООПЕ РТЙМПЦЕОЙЕ Ч DirectDraw ОЕ НПЦЕФ РПМХЮЙФШ НПОПРПМШОПЗП ДПУФХРБ РТЙ ТБВПФЕ У ЧЙДЕПЛБТФПК. пОП ФБЛЦЕ ОЕ НПЦЕФ ЧЩРПМОСФШ РЕТЕЛМАЮЕОЙС УФТБОЙГ (ЙУРПМШЪХКФЕ ДПВБЧПЮОХА РПЧЕТИОПУФШ Й ЛПРЙТХКФЕ ЕЕ УПДЕТЦЙНПЕ) Й ОЕ НПЦЕФ ЙЪНЕОЙФШ ХУФБОПЧЛЙ ЗМХВЙОЩ ЙМЙ (ЮФП ЧРПМОЕ МПЗЙЮОП) ТБЪТЕЫЕОЙС ЬЛТБОБ (ЗМХВЙОХ Й ЧУЕ РТПЮЕЕ НПЦОП ЛПОЕЮОП РПРЩФБФШУС ЙЪНЕОЙФШ ЧЩЪПЧПН ЖХОЛГЙЙ РПДУЙУФЕНЩ СДТБ windows ChangeDisplaySettings — ОП УФПЙФ МЙ ЙЗТБ УЧЕЮШ ? тБЪЧЕ ТБДЙ ФПЗП, ЮФПВЩ «ЭЕМЛБФШ» РЕТЕЧПДС ЬЛТБО Ч ДТХЗЙЕ ТБЪТЕЫЕОЙС ФЩ УФБМ РЙУБФШ ПЛПООПЕ РТЙМПЦЕОЙЕ ?). рТЙ ТЙУПЧБОЙЙ Ч ПЛПООПН РТЙМПЦЕОЙЙ ДПУФХРЕО чеуш ЬЛТБО — ФП ЕУФШ ЙНЕООП ФЕВЕ ЛБЛ РТПЗТБННЙУФХ РТЙДЕФУС ЛПОФТПМЙТПЧБФШ Й УМЕДЙФШ ЪБ РЕТЕНЕЭЕОЙСНЙ ПЛОБ Й РЙУБФШ ЙНЕООП ФХДБ ЗДЕ ОБИПДЙФШУС ЛМЙЕОФУЛБС ПВМБУФШ ПЛОБ (ЕУМЙ ФЩ ЛПОЕЮОП ОЕ РПЛМПООЙЛ БОПНБМЙК).
  • рБМЙФТПЧЩЕ ТЕЦЙНЩ РПЪЧПМСАФ ЙУРПМШЪПЧБФШ ФТАЛЙ У РБМЙФТПК, ВПМЕЕ ЬЛПОПНЙЮОЩ (Ч ДЧБ ТБЪБ РП УТБЧОЕОЙА У 16 ВЙФОЩНЙ Ч ДЧБ,Б У 32 ВЙФОЩНЙ Ч ЮЕФЩТЕ !), ОП ВПМЕЕ ПЗБОЙЮЕОЩ Й ФТЕВХАФ ЧПЪОЙ У РБМЙФТПК. ч ПЛПООЩИ РБМЙФТПЧЩИ РТЙМПЦЕОЙСИ ДПУФХРОЩ ОЕ ЧУЕ 256 ЬМЕНЕОФПЧ РБМЙФТЩ — ЧПУШНБС ЮБУФШ СЧМСЕФУС УЙУФЕНОПК РБМЙФТПК Windows — ЕЕ ЙЪНЕОСФШ ОЕ ТЕЛПНЕОДХЕФУС.
  • хУФБОПЧЙЧ 16 ВЙФОЩК ЙМЙ 32 ВЙФОЩЕ ГЧЕФБ ЧЩСУОЙ РПТСДПЛ Й ВЙФОПУФШ УМЕДПЧБОЙС ЛПНРПОЕОФ. л РТЙНЕТХ 16 ВЙФОЩК RGB ТЕЦЙН НПЦЕФ ВЩФШ ЛБЛ 5-5-5 ВЙФ (1 ВЙФ РХУФ) РПД ЛБЦДХА ЛПНРПОЕОФХ ГЧЕФБ, ФБЛ Й 5-6-5. б ФП Й ЧППВЭЕ BGR. йУРПМШЪХКФЕ ДМС ЬФПЗП GetPixelFormat НЕФПД IDirectDrawSurfase7 ЙОФЕТЖЕКУБ.

ьФБ УФБФШС СЧМСЕФУС ЙОФЕММЕЛФХБМШОПК УПВУФЧЕООПУФША БЧФПТБ(JM). рЕТЕРЕЮБФЛБ ЙМЙ РХВМЙЛБГЙС ПФДЕМШОЩИ ЕЕ ЮБУФЕК ЙМЙ ГЕМЙЛПН ТБЪТЕЫЕОБ У ПВСЪБФЕМШОЩН ХЛБЪБОЙЕН ЙУФПЮОЙЛБ.

Стэн Трухильо — Графика для Windows средствами DirectDraw

99 Пожалуйста дождитесь своей очереди, идёт подготовка вашей ссылки для скачивания.

Скачивание начинается. Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.

Описание книги «Графика для Windows средствами DirectDraw»

Описание и краткое содержание «Графика для Windows средствами DirectDraw» читать бесплатно онлайн.

«Графика для Windows средствами DirectDraw»

Посвящается Стэнли и Велме Коппок (моим дедушке и бабушке по материнской линии), а также Дж. Д. и Марии Трухильо (дедушке и бабушке по отцовской линии). Их общество и поддержка радовали меня в детстве и продолжают радовать сейчас.

Программисты (особенно начинающие) любят задавать вопросы типа: «Скажи, на чем ты пишешь…?» Когда-то этот вопрос выглядел вполне логично.

Компиляторы, отладчики, серверы, системы управления базами данных и все остальное только-только выходило из каменного века. Программные инструменты разительно отличались друг от друга по качеству и возможностям. Стоило сделать ставку на неудачный инструментарий, и работа становилась излишне тяжкой, а качество результата — низким.

Сегодня стал актуальным другой вопрос: «А чего стоишь ты сам?» Благодаря непрерывной конкуренции современные средства разработчика стали невероятно мощными и качественными, так что среднему программисту вряд ли удастся выжать из них все возможное. Скорее всего, вы спасуете намного раньше, чем ваш инструментарий — если только не узнаете о нем абсолютно все и не доведете свое мастерство программиста до подлинного совершенства.

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

Конечно, это не единственный путь — например, можно добросовестно набивать шишки обо все острые углы новых технологий и наобум пробовать все подряд, пока что-нибудь не заработает. А можно воспользоваться опытом наших авторов, которые уже прошли стадию обучения и попутно сделали кое-какие заметки на память. Мы тщательно отобрали темы, авторов и методику изложения, чтобы читатель не путался в ненужных вступлениях или редких технологиях, которые ему все равно не понадобятся.

Наша главная цель — поднять ваше мастерство настолько, насколько вы сами захотите. Классные инструменты у вас уже есть, осталось лишь стать классным программистом.

Засидевшись допоздна над своей предыдущей книгой, «Cutting-Edge Direct3D Programming», я решил ложиться спать. Оказалось, что та же самая мысль пришла в голову здоровенному пауку-каракурту. Что еще хуже, для этого нами была выбрана одна и та же кровать. Мы мирно улеглись, не подозревая о присутствии друг друга (во всяком случае, я ничего не подозревал).

До того мне приходилось слышать о каракуртах и даже видеть их время от времени. Бесспорно, они пользуются дурной славой. Я полагал, что после укуса каракурта следуют пять или десять минут невыносимой боли, а затем неизбежно наступает смерть. Оказалось, я ошибался в обоих отношениях. Сам по себе укус проходит совершенно безболезненно, но если его не лечить, боль продолжается до 48 часов. Тем не менее укус каракурта (даже без лечения) редко бывает смертельным.

И мне, и пауку пришлось пожалеть о встрече. Пауку — потому что он был жестоко раздавлен своей разгневанной и удивленной жертвой. Мне — потому что у врача я оказался лишь через восемь часов после укуса (а серьезные мышечные спазмы начинаются через 2–4 часа). После нескольких посещений местной амбулатории проблема была решена. Этой ночью я так и не спал, и к тому же в течение восьми часов мучался от жуткой боли. В довершение всего перед вводом противоядия меня накачали валиумом. Разумеется, о работе не могло быть и речи.

При первой возможности я позвонил своему редактору, Скотту Палмеру (Scott Palmer). Заплетающимся языком я рассказал, что немного задержусь с очередной главой, потому что меня укусил каракурт. Скотт проявил полное понимание, и мы перенесли срок сдачи материала.

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

Скотт заверил меня, что он никогда не сомневался в моей искренности, а в список включил сразу все оправдания, независимо от того, поверил он или нет. Тем не менее полагаю, его позиция вполне ясна.

Редактором этой книги была Мишель Страуп. Она берется за дело довольно жестко, так что мне повезло, что при написании этой книги дело обошлось без медицинского вмешательства — не то, пожалуй, пришлось бы посылать ей факсом справку от врача.

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

Другими словами, Coriolis отвечает за распространение и продажу книги, однако за содержащийся в ней материал отвечаю я. Следовательно, если у вас возникнут какие-либо вопросы по поводу программ или CD-ROM, не стесняйтесь и пишите мне. Некоторые читатели обращаются в Coriolis, но издательство все равно просто пересылает почту мне. Если вы захотите обратиться ко мне, обязательно укажите, о какой книге идет речь, и постарайтесь сделать свои вопросы и замечания по возможности конкретными. Со мной можно связаться по адресу mailto:[email protected]

Кроме того, некоторые вопросы встречаются особенно часто. Я собираюсь создать и вести список ЧаВО (часто задаваемых вопросов) на Web-узле этой книги (www.rezio.com/wgp). Здесь вы найдете ответы на некоторые вопросы, а также исправления ошибок, обновления и, возможно — даже новые демонстрационные программы.

Для чего написана эта книга

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

Эта книга начинается с того, на чем другие книги обычно заканчивались. Мы поговорим об основах DirectDraw, но лишь в общих чертах. Читатель — опытный программист, но незнакомый с DirectDraw — сможет с ходу войти в курс дела. Затем мы перейдем к другим темам, столь же интересным, сколь и полезным.

Цель этой книги — научить вас работать с DirectDraw, а не предоставить некоторую «структурную основу» или нестандартный API, который бы выполнял за вас всю работу. Демонстрационные программы написаны на C++ и используют MFC, но совсем не для того, чтобы скрыть все технические подробности. С++ и MFC — превосходные инструменты, потому что с их помощью любое приложение можно написать несколькими разными способами. Примеры для этой книги были написаны так, чтобы при этом получались структурированные и удобные для чтения проекты, которые наглядно показывают, что и почему происходит в программе.

Помимо DirectDraw, во многих примерах используется библиотека DirectInput. Строго говоря, при программировании графики для Windows можно обойтись и без DirectInput, но ей все же стоит воспользоваться. Она работает быстрее традиционных средств ввода Windows и к тому же входит в DirectX, так что для работы с ней не потребуется никаких дополнительных SDK.

Требования к читателю

Эта книга научит вас почти всему, что можно узнать о DirectDraw. Тем не менее она не учит C, C++, MFC или работе с Developer Studio пакетов семейства Visual — предполагается, что вы уже знакомы с этими темами. С другой стороны, от вас не требуется никаких выдающихся познаний. Например, мы будем использовать MFC, но лишь в объеме, необходимом для написания наших приложений. Следовательно, чтобы читать эту книгу, вовсе не обязательно быть экспертом в MFC.

Для работы с книгой необходимо иметь Windows NT 4.0 или Windows 95. Кроме того, потребуется Visual C++ 5.0 или более поздней версии.

Введение в Microsoft DirectX

Microsoft DirectX — это набор низкоуровневых программных интерфейсов, используемых для управления рядом аппаратных компонентов компьютера. В состав этих интерфейсов входят: DirectDraw — для быстрого доступа к видеопамяти, DirectSound — для вывода аудиоинформации на звуковую карту, DirectPlay — для организации многопользовательской работы через модем, локальную сеть или Internet, DirectInput — для обработки ввода информации с клавиатуры, от мыши или джойстика и Direct3D — ядро поддержки трехмерной графики, используемое совместно с DirectDraw.

Основная цель, которую преследовала фирма Microsoft, создавая интерфейс DirectX, — превратить компьютеры, работающие под управлением операционной системы Windows, в идеальную платформу для приложений, богатых мультимедийными элементами: полноцветной графикой, видеофрагментами, трехмерной анимацией и стереозвуком. Встроенный непосредственно в ядро операционной системы Microsoft Windows, интерфейс DirectX является интегрированным сервисом Windows 98 и Windows 2000, а также Microsoft Internet Explorer. Компоненты DirectX могут быть автоматически загружены на ваш компьютер при установке современных игр и мультимедийных приложений, разработанных для операционной системы Windows 95.

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

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

На рис. 1 показана архитектура Microsoft DirectX.

В этом обзоре мы рассмотрим основные компоненты Microsoft DirectX и познакомимся с предоставляемыми ими сервисами.

DirectX Foundation

DirectX Foundation предоставляет в распоряжение разработчиков единый набор программных интерфейсов, который обеспечивает доступ ко всем возможностям, реализованным на уровне аппаратного обеспечения, — 3D-ускорителям, звуковым картам и т.п. Эти программные интерфейсы, называемые низкоуровневыми функциями, включают ускорение отображения двухмерной графики, поддержку устройств ввода информации — джойстиков, мышей и клавиатур, управление микшированием аудиоинформации и ее вывод. Эти низкоуровневые функции поддерживаются компонентами, составляющими DirectX Foundation: Microsoft DirectDraw, Microsoft Direct3D, Microsoft DirectInput, Microsoft DirectSound, Microsoft DirectPlay и Microsoft DirectMusic. Эти компоненты показаны на рис. 2.

До появления DirectX разработчики, создававшие мультимедийные приложения для платформы Windows, должны были настраивать свои продукты на работу с различными типами устройств и конфигураций. Теперь эта проблема решена. DirectX Foundation содержит компонент, известный как «слой аппаратной абстракции» (Hardware Abstraction Layer, HAL), который использует программные драйверы для реализации взаимодействия программного и аппаратного обеспечения. В результате разработчики могут создавать единую версию приложения, использующего интерфейсы DirectX, не заботясь о том, чтобы оно работало на конкретных аппаратных конфигурациях. DirectX автоматически определяет аппаратные возможности компьютера и устанавливает соответствующие параметры. DirectX также позволяет выполнять мультимедийные приложения, требующие аппаратной поддержки, отсутствующей на данном компьютере. В этом случае они программно эмулируются компонентом, который называется «слой аппаратной эмуляции» (Hardware Emulation Layer, HEL) и обеспечивает программные драйверы, работающие как недостающие устройства.

DirectX Media

Как мы выяснили выше, DirectX Foundation выполняет обработку низкоуровневых запросов. Компонент DirectX Media располагается над DirectX Foundation и обеспечивает высокоуровневые сервисы — поддержку анимации, потоковый вывод (возможность передачи и просмотра аудио- и видеоинформации по мере ее загрузки из Internet) и интерактивность. Автоматическая интеграция низкоуровневых сервисов, реализуемых DirectX Foundation, и высокоуровневых, реализованных в DirectX Media, облегчает процесс создания и воспроизведения мультимедийных элементов, позволяя разработчикам включать их в свои приложения и Web-страницы, обеспечивая тем самым недоступное ранее интерактивное мультимедийное содержимое.

Как и DirectX Foundation, DirectX Media состоит из нескольких интегрированных компонентов. К ним относятся: Microsoft DirectShow, DirectAnimation и DirectX Transform. Поддержка DirectShow и DirectAnimation встроена в последние версии браузера Microsoft Internet Explorer. В результате разработчики и Web-дизайнеры получают в свое распоряжение недоступные ранее средства для управления графикой, анимацией, аудио, видео и другими видами онлайновой мультимедиа-информации. Компоненты DirectX Media показаны на рис. 3.

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

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

Компоненты DirectX

Помимо кратко рассмотренных выше двух основных составляющих Microsoft DirectX в ее состав также входят высокоуровневые компоненты, которые обеспечивают мультимедийные функции для Web-приложений. К этим компонентам относятся: NetMeeting — для организации групповых онлайновых дискуссий и Windows Media Player — средство для передачи мультимедийного содержимого по Internet.

Рассмотрев организацию DirectX, давайте более подробно остановимся на основных возможностях, предоставляемых отдельными компонентами DirectX Foundation и DirectX Media.


DirectX Foundation

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

DirectX Foundation основывается на таких проверенных временем технологиях, как Microsoft DirectDraw, Microsoft Direct3D (режимы Immediate и Retained), Microsoft DirectInput, Microsoft DirectMusic, Microsoft DirectSound, Microsoft DirectPlay и Microsoft DirectSound 3D. Эти программные интерфейсы системного уровня обеспечивают эффективный доступ к различным компьютерным устройствам — 3D-ускорителям, звуковым картам, устройствам ввода информации. DirectX Foundation обеспечивает реальную аппаратную независимость приложений, снимает проблемы установки драйверов и несовместимости аппаратно-программных платформ.

Ниже рассматриваются отдельные компоненты, входящие в состав DirectX Foundation.

Direct3D

Microsoft Direct3D представляет собой интерфейс для работы с 3D-картами. Он поддерживает два режима работы — Immediate Mode и Retained Mode.

Immediate Mode

В режиме Immediate Mode Direct3D обеспечивает разработчикам аппаратную поддержку игровых и мультимедийных приложений в среде Microsoft Windows. Он позволяет добиться аппаратной независимости, поддерживает переключаемую Z-буферизацию и Intel MMX-архитектуру процессоров. В режиме Direct3D Immediate Mode основные графические примитивы реализуются напрямую, без использования буферов выполнения (execute buffers).

Retained Mode

Режим Retained Mode Direct3D облегчает создание и анимацию трехмерных миров, поддерживая две новые функции: интерполяторы анимации со смешением цветов, плавными перемещениями объектов и множеством различных видов трансформации, а также последовательное заполнение сеточной структуры 3D-объектов (meshes), позволяющее осуществлять их постепенную загрузку с удаленных серверов.

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

На рис. 4 показана архитектура Direct3D.

Отметим, что Direct3D-приложения общаются с графическими устройствами одинаково, вне зависимости от режима — Retained или Immediate. Они могут использовать или не использовать программную эмуляцию перед обращением к HAL. Реально Direct3D является интерфейсом к объекту DirectDraw, поэтому на приведенной выше диаграмме слой аппаратной абстракции (HAL) обозначен как DirectDraw/Direct3D HAL.

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

DirectDraw

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

На рис. 5 показано взаимоотношение между DirectDraw, компонентом ядра операционной системы GDI (Graphics Device Interface), слоем аппаратной абстракции (Hardware Abstraction Layer, HAL) и слоем аппаратной эмуляции (Hardware Emulation Layer, HEL).

Как видно из рис. 5, DirectDraw существует независимо от GDI и оба интерфейса обладают возможностью прямого доступа к графическим устройствам через аппаратно-независимые слои. В отличие от GDI, DirectDraw по возможности использует аппаратные функции. Если конкретное устройство не поддерживает требуемых функций, DirectDraw пытается эмулировать их, используя HEL.

Отметим, что DirectDraw может предоставлять доступ к поверхностям как к контекстам устройств (Device Context, DC), что позволяет использовать функции GDI для работы с поверхностями.

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

DirectInput

Microsoft DirectInput представляет собой интерфейс к различным устройствам ввода информации — клавиатуре, джойстику, мыши, а также к устройствам с обратной отдачей (force-feedback). Использование DirectInput дает два преимущества по сравнению с обычными, стандартными функциями: данный интерфейс поддерживает большее число устройств и обеспечивает более быструю реакцию на запросы. Работая непосредственно с драйверами устройств, DirectInput не использует систему обмена сообщениями Microsoft Windows.

К новым возможностям DirectInput относится расширенный список поддерживаемых устройств, в числе которых: игровые панели (game pads), авиационные рули (flight yokes), шлемы виртуальной реальности (virtual-reality headgear) и устройства с обратной отдачей, обеспечивающие такие эффекты, как вибрация, сопротивление при движении и т.п., использование которых делает современные игры еще более реалистичными и привлекательными.

DirectMusic

Microsoft DirectMusic — это новый компонент семейства технологий DirectX, который представляет собой принципиально новый подход к оцифрованной музыке на платформе Microsoft Windows. DirectMusic — это программная оболочка для создания музыкальных шаблонов и инструкций по реакции на действия пользователя. Такой подход позволяет разработчикам создавать фоновую музыку, составляемую в реальном времени на основе алгоритмов, задаваемых в Web-страницах или мультимедийных приложениях. Это означает, что времена, когда вы слушали MIDI-файлы, выполняемые в цикле, отошли в прошлое.

DirectMusic основывается на полной реализации стандарта DownLoadable Sounds (DLS) — новой спецификации, позволяющей разработчикам создавать музыкальные шаблоны с уверенностью, что они будут воспроизведены практически на любом устройстве и аппаратной платформе. Так как музыка создается из базовых блоков, предоставляемых разработчиком, то для нее практически не требуется места для хранения и DirectMusic представляет собой идеальное решение для доставки музыкальных фрагментов по Internet. В состав DirectMusic входит DirectMusic Producer — интегрированный редактор, позволяющий работать со всеми объектами DirectMusic: стилями, шаблонами, DLS-инструментами и т.п.

DirectPlay

Microsoft DirectPlay представляет собой высокоуровневый программный интерфейс между прикладной программой и коммуникационными сервисами, который упрощает игры через Internet, связь по модему или локальную сеть. В состав DirectPlay входит набор утилит, позволяющих играющим, в частности, находить партнеров и Web-узлы, поддерживать поток информации между серверами и игроками.

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

На рис. 6 показана архитектура DirectPlay.

DirectSound

Microsoft DirectSound — это аудиокомпонент DirectX, который использует такие возможности, как воспроизведение с микшированием, аппаратные функции и трехмерное позиционирование источников звука. При использовании DirectSound различные аудиосигналы могут одновременно микшироваться и воспроизводиться, необходимые аппаратные функции могут программно эмулироваться, а нестандартные средства микширования обеспечиваются прямым доступом к аудиоустройствам. Интерфейс DirectSound позволяет программно изменять уровень громкости, частоту, позиционирование источников, баланс, а также имитировать трехмерные эффекты, такие как смещение и эффект Доплера.

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

На рис. 7 показано взаимоотношение DirectSound с другими компонентами системы.

DirectSound3D

DirectSound3D — это расширение рассмотренного выше интерфейса DirectSound, позволяющее вместо стандартного стереозвука (левый/правый канал и управление балансом) управлять позиционированием источников звука в любую точку трехмерного пространства. Эти возможности могут базироваться как на функциях, реализованных тем или иным аудиоустройством, так и на чисто программных функциях, реализованных на уровне HEL.

DirectX Media

Объединение мультимедийных приложений и сервисов Internet открывает перед разработчиками принципиально новые возможности и более широкие аудитории для создания приложений, использующих различные типы информации. Набор программных интерфейсов Microsoft DirectX версии 6 предоставляет в распоряжение разработчиков унифицированный, полный набор программных сервисов различного уровня — от системного до прикладного. В этом обзоре мы рассмотрим прикладные сервисы, предоставляемые DirectX Media.

Как известно, интерфейс Microsoft DirectX представляет собой набор программных интерфейсов для решения различных задач — от программного управления аппаратным обеспечением до создания виртуальных миров. В дополнение к низкоуровневым интерфейсам, обеспечивающим доступ к аппаратуре и известным как DirectX Foundation, в состав DirectX входит более высокоуровневый набор интерфейсов DirectX Media — набор сервисов, обеспечивающих поддержку потокового вывода информации (streaming), анимации и управления поведением объектов.

DirectX Media — это семейство программных интерфейсов и компонентов для мультимедийных приложений. В настоящее время DirectX Media состоит из следующих программных интерфейсов:

Интерфейс Описание
Direct3D Retained Mode 3D-графика
DirectShow (ранее назывался ActiveMovie SDK) Воспроизведение, потоковый вывод
DirectAnimation (ранее назывался ActiveX Animation) Анимация и интеграция с Dynamic HTML
DirectX Transform Двух- и трехмерные миры, временные задержки для приложений и Web-страниц

Назначение DirectX Media

Набор интерфейсов DirectX Media был разработан для того, чтобы:

обеспечить сервисы прикладного уровня для работы с различными типами информации. DirectX Media обеспечивает сервисы прикладного уровня — аппаратно-независимые сервисы, которые используют системные сервисы DirectX Foundation;

унифицировать сервисы для работы с информацией. Используя DirectX Media, разработчики мультимедийных приложений получают аппаратно-независимый доступ к различным типам информации без потери производительности, так как сервисы DirectX Foundation по-прежнему напрямую работают с аппаратурой. DirectX Media предоставляет в распоряжение разработчиков набор программных интерфейсов, аппаратную независимость на основе архитектуры HAL/HEL (уровень аппаратной абстракции/уровень аппаратной эмуляции) и высокоуровневые интерфейсы к сервисам DirectX Foundation;

предоставить поддержку пользователей и сред. Благодаря аппаратной независимости, использованию компонентной объектной модели (Component Object Model, COM) и интеграции с Internet, сервисы DirectX Media могут быть использованы любыми разработчиками мультимедийных приложений — от Web-дизайнеров до профессиональных программистов.

Архитектура DirectX Media

DirectX Media — это результат разделения интерфейсов DirectX 6 на два уровня — системный уровень, предоставленный DirectX Foundation, и прикладной уровень — DirectX Media. Сервисы DirectX Media используют сервисы DirectX Foundation. К этим сервисам относятся: Direct3D Retained Mode, DirectAnimation, DirectShow и DirectX Transform. DirectX Media также обеспечивает поддержку VRML.

Напомним, что DirectX Foundation обеспечивает следующие сервисы системного уровня: DirectDraw, DirectInput, DirectSound, DirectSound3D и Direct3D Immediate Mode.

После того как мы получили общее представление о DirectX Media, давайте рассмотрим каждый компонент этого интерфейса.

DirectAnimation

Данный компонент, входящий в семейство программных интерфейсов Microsoft DirectX, предоставляет в распоряжение разработчиков набор функций для реализации анимации, потокового вывода информации и интеграции различных типов мультимедийных данных — двухмерной векторной графики, трехмерной графики, спрайтов, аудио- и видеофрагментов. Так как интерфейс DirectAnimation реализован как набор COM-интерфейсов, его функции доступны из различных программных средств и языков программирования:

HTML-разработчики могут использовать DirectAnimation для анимации элементов Web-страниц.

Можно объединять технологию Dynamic HTML со скриптовыми программами (JavaScript/VBScript), управляющими объектами DirectAnimation для создания различных мультимедийных эффектов в HTML-документах.

Любые средства разработки и языки программирования, поддерживающие COM-технологии: Java, Visual Basic, Microsoft Visual C++, Borland Delphi, могут использоваться для создания интерактивных мультимедийных приложений.

На рис. 8 показана архитектура DirectAnimation.

Мультимедийные компоненты DirectAnimation

Входящие в состав DirectAnimation мультимедийные компоненты (ранее называвшиеся Multimedia DHTML-компонентами) обеспечивают доступ к функциональности DirectAnimation из скриптовых программ, располагаемых в HTML-документах. Эти мультимедийные компоненты позволяют создавать изображения на основе векторной графики, управлять графическими изображениями, использовать анимацию и могут быть включены в состав HTML-документов. К мультимедийным компонентам DirectAnimation относятся:

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

компонент Sequencer для создания комплексных последовательностей с использованием компонентов ActiveX, скриптовых программ и Dynamic HTML;

компонент Sprite для добавления к HTML-документам статических и анимированных графических изображений и управления ими;

компонент Structured Graphics для создания векторной графики и манипуляций с ней.

Более подробно об этих компонентах см. статью «Microsoft DirectAnimation. Клиентские компоненты» в этом номере КомпьютерПресс.

DirectShow

Microsoft DirectShow (предыдущее название — Microsoft ActiveMovie) представляет собой архитектуру для реализации потокового воспроизведения на платформе Microsoft Windows с поддержкой мультимедийных потоков. Такие потоки могут содержать аудио- и видеоданные, представленные в различных форматах, включая MPEG, Apple QuickTime, AVI и WAV. Также реализована возможность сохранения информации на основе Video for Windows (VFW) или Windows Driver Model (WDM).

Компонент DirectShow интегрирован в Microsoft DirectX, что позволяет ему использовать различные сервисы — работу с аппаратными функциями аудио- и видеоустройств, тем самым обеспечивая оптимальную производительность. Для разработчиков Internet- и Intranet-приложений в состав DirectShow входит компонент Windows Media Player, позволяющий воспроизводить мультимедийные данные в различных форматах, а также обеспечивающий такие сервисы, как воспроизведение MPEG-фильмов и видео в формате DVD. Начиная с версии DirectX Media 6.0 компонент Windows Media Player заменяет ранее использовавшийся компонент ActiveMovie.

DirectX Transform

DirectX Transform служит для реализации различных типов трансформаций и переходных эффектов, которые могут быть применены к графическим изображениям и трехмерным объектам. Благодаря своей гибкой архитектуре, DirectX Transform может настраиваться на различные типы данных и, таким образом, является программно расширяемым. Данный компонент используется совместно с DirectAnimation при создании Web-приложений, мультимедийных приложений и других типов программ.

Будущее DirectX

Фирма Microsoft уже объявила о некоторых возможностях, которые появятся в будущих версиях DirectX. В частности, в версии 7.0 (которая должна выйти в конце 1999 года) планируется ввести новые функции для трехмерного звука, многоканального аудио, AC-3 (Dolby Digital) и графики, улучшения производительности, поддержку новых типов устройств, аппаратную реализацию трансформаций и источников света, механизмы расширений, геометрический морфинг и интеграцию с технологией Fahrenheit.

DirectX for Visual Basic

В состав DirectX 7.0 будет входить DirectX for Visual Basic — языковая поддержка для разработчиков на Visual Basic, которая позволит им создавать игровые и мультимедийные приложения на языке Basic так же легко, как это сейчас делают разработчики на C/C++ и Java. Ядром DirectX for Visual Basic станет динамически загружаемая библиотека (DLL), которая будет осуществлять перенаправление объектов между ядром DirectX и Visual Basic. Данная библиотека будет поддерживать основные типы данных, свойственные Visual Basic, и изолировать разработчиков на этом языке от необходимости использовать несвойственную им семантику. Для обеспечения наибольшей гибкости и совместимости объектная модель останется той же, что доступна сейчас из языков C/C++.


Помимо этого в состав DirectX for Visual Basic будет включено множество примеров, компонентов и справочная система.

DirectX 8.0 и далее. . .

В версии 8.0 впервые появятся первые плоды совместной деятельности двух компаний — Silicon Graphics и Microsoft.

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

Fahrenheit

Говоря о будущем технологии DirectX, следует упомянуть и совместный проект фирм Silicon Graphics и Microsoft под названием Fahrenheit. Целью данного проекта является разработка архитектуры для графических технологий, которые могли бы использоваться в различных областях. В этом проекте также участвуют такие фирмы, как Intel и Hewlett-Packard.

В состав Fahrenheit входит три основных компонента:

Низкоуровневый программный интерфейс (Fahrenheit Low Level API, FLL), рассчитанный на пользовательские и профессиональные графические приложения, работающие в среде Windows. Аналогами FLL являются Direct3D Immediate Mode и OpenGL. Данный интерфейс полностью совместим с уже существующими приложениями и драйверами, написанными для Microsoft Direct 3D и OpenGL. После выхода FLL заменит Direct3D и обеспечит интеграцию с OpenGL.

Интерфейс Scene Graph (Fahrenheit Scene Graph, FSG), который позволит увеличить производительность графических приложений и расширить их функциональные возможности. Данный интерфейс базируется на сервисах, предоставляемых OpenGL, Direct3D Immediate Mode и FLL, и предоставляет древовидные структуры, в которых отдельные сцены могут быть описаны в терминах геометрии, текстур, освещения и т.п. Таким образом, приложения указывают, что необходимо отобразить, а не какими средствами это достигается. FSG является дальнейшим развитием таких технологий, как Performer, Open Inventor, Cosmo3D и OpenGL++.

Модель Large Model Visualization (FLM), с помощью которой станет возможным управление большими трехмерными моделями. Данная модель основана на SGI OpenGL Optimizer и HP DirectModel. FLM будет представлять собой расширение FSG, обладающее функциональностью, необходимой для визуализации моделей большого размера, например целого автомобиля, и будет поддерживать конструктивы, используемые в САПР, такие как NURBS, волнистые поверхности (curved surfaces) и т.п.

Архитектура проекта Fahrenheit показана на рис. 9.

Первые компоненты проекта Fahrenheit — Fahrenheit Scene Graph и Fahrenheit Large Model появятся в IV квартале 1999 года, Fahrenheit Low Level API — в следующем году.

Разработка трехмерных игр для Windows 8 с помощью C++ и Microsoft DirectX

Разработка игр — постоянно актуальная тема: всем нравится играть в игры, их охотно покупают, поэтому их выгодно продавать. Но при разработке хороших игр следует обращать немало внимания на производительность. Никому не понравится игра, «тормозящая» или работающая рывками даже на не самых мощных устройствах.
В этой статье я покажу, как разработать простую футбольную 3D игру с использованием Microsoft DirectX и C++, хотя главным образом я занимаюсь разработкой на C#. В прошлом я довольно много работал с C++, но теперь этот язык для меня уже не столь прост. Кроме того, DirectX для меня является новинкой, поэтому эту статью можно считать точкой зрения новичка на разработку игр. Прошу опытных разработчиков простить меня за возможные ошибки.

Мы будем использовать пакет Microsoft Visual Studio 3D Starter Kit — естественный начальный ресурс для всех желающих разрабатывать игры для Windows 8.1.

Microsoft Visual Studio 3D Starter Kit

После загрузки пакета Starter Kit можно распаковать его в папку и открыть файл StarterKit.sln. В этом решении есть уже готовый проект C++ для Windows 8.1. При его запуске появится изображение, похожее на рис. 1.

Рисунок 1. Начальное состояние Microsoft Visual Studio 3D Starter Kit

Эта программа в составе Starter Kit демонстрирует несколько полезных элементов.

  • Анимировано пять объектов: четыре фигуры вращаются вокруг чайника, а чайник, в свою очередь, «танцует».
  • Каждый предмет сделан из отдельного материала; некоторые имеют сплошной цвет, а поверхность куба представляет собой растровый рисунок.
  • Источник света находится в верхнем левом углу сцены.
  • В правом нижнем углу экрана расположен счетчик кадровой скорости (количество кадров в секунду).
  • Сверху находится индикатор очков.
  • Если щелкнуть какой-либо предмет, он выделяется и увеличивается количество очков.
  • Если щелкнуть экран игры правой кнопкой мыши или провести по экрану от нижнего края к середине, появятся две кнопки для последовательного переключения цвета чайника.

Основной цикл игры находится в файле StarterKitMain.cpp, где отрисовывается страница и счетчик кадровой скорости. Game.cpp содержит игровой цикл и проверку нажатий. В этом файле в методе Update вычисляется анимация, а в методе Render происходит отрисовка всех объектов. Счетчик кадровой скорости отрисовывается в SampleFpsTextRenderer.cpp. Объекты игры находятся в папке Assets. Teapot.fbx — это чайник, а файл GameLevel.fbx содержит четыре фигуры, которые вращаются вокруг танцующего чайника.
Теперь, ознакомившись с образцом приложения в пакете Starter Kit, можно перейти к созданию собственной игры.

Добавление ресурсов в игру

Мы разрабатываем игру в футбол, поэтому самым первым нашим ресурсом должен быть футбольный мяч, который мы добавим в Gamelevel.fbx. Сначала нужно удалить из этого файла четыре фигуры, выделив каждую из них и нажав кнопку Delete. В обозревателе решений удалите и файл CubeUVImage.png, поскольку он нам не нужен: это текстура для куба, который мы только что удалили.
Теперь добавляем сферу в модель. Откройте инструменты (если их не видно, щелкните View > Toolbox) и дважды щелкните сферу, чтобы добавить ее в модель. Нам также требуется растянутая текстура, такая как на рис. 2.

Рисунок 2. Текстура футбольного мяча, приспособленная к сфере

Если вы не хотите создавать собственные модели в Visual Studio, можно найти готовые модели в Интернете. Visual Studio поддерживает любые модели в формате FBX, DAE и OBJ: достаточно добавить их в состав ресурсов решения. Например, можно использовать файл .obj, подобный показанному на рис. 3 (бесплатная модель с сайта TurboSquid).

Рисунок 3. Трехмерная OBJ-модель мяча

Анимация модели

Если сейчас запустить проект, вы увидите, что мяч вращается вокруг своей оси Y. Теперь приведем мяч в движение.

Движение мяча

Если сейчас запустить проект, вы увидите, что мяч движется вверх и вниз с постоянной скоростью. Теперь нужно придать мячу физические свойства.

Добавление физики мяча

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

Добавление футбольного поля

При этом изменении преобразование применяется только к мячу. Поле отрисовывается без преобразования. Если запустить код сейчас, вы увидите, что мяч отскакивает от поля, но «проваливается» в него в нижней части. Для исправления этой ошибки нужно перенести поле на -0,5 по оси Y. Выберите поле и измените его перенос по оси Y на -0,5. Теперь при запуске приложения мяч будет отскакивать от поля, как на рис. 4.

Рисунок 4. Мяч отскакивает от поля

Задание положения камеры и мяча

Мяч расположен в центре поля, но нам он там не нужен. В этой игре мяч должен находиться на 11-метровой отметке. Следует переместить мяч по оси X, изменив перемещение мяча в методе Render в Game.cpp:

Мяч перемещается на 63 единицы по оси X, то есть устанавливается на 11-метровую отметку. После этого изменения вы перестанете видеть мяч, поскольку он вне поля зрения камеры: камера установлена в центре поля и направлена на середину. Нужно изменить положение камеры, чтобы она была направлена на линию ворот. Это нужно сделать в CreateWindowSizeDependentResources в файле Game.cpp:

Теперь камера находится между отметкой середины поля и 11-метровой отметкой и направлена в сторону линии ворот. Новое представление показано на рис. 5.

Рисунок 5. Измененное положение мяча и новое положение камеры

Добавление штанги ворот

Это изменение применяет преобразование к воротам и отрисовывает их. Это преобразование является сочетанием трех преобразований: масштабированием (увеличение исходного размера в 2 раза), поворотом на 90 градусов и перемещением на 85,5 единиц по оси X и на -0,5 единиц по оси Y из-за глубины поля. После этого ворота устанавливаются лицом к полю на линии ворот. Обратите внимание, что важен порядок преобразований: если применить вращение после перемещения, то ворота будут отрисованы совсем в другом месте, и вы их не увидите.

Удар по мячу

Все элементы установлены на свои места, но мяч все еще подпрыгивает. Пора по нему ударить. Для этого нужно снова применить физические навыки. Удар по мячу выглядит примерно так, как показано на рис. 6.

Рисунок 6. Схема удара по мячу

Удар по мячу осуществляется с начальной скоростью v под углом α (если не помните школьные уроки физики, поиграйте немного в Angry Birds, чтобы увидеть этот принцип в действии). Движение мяча можно разложить на два разных движения: по горизонтали — это движение с постоянной скоростью (исходим из того, что отсутствует сопротивление воздуха и воздействие ветра), а также вертикальное движение — такое же, как мы использовали раньше. Уравнение движения по горизонтали:
sX = s + v*cos(α)*t
Уравнение движения по вертикали:
sY = s + v*sin(α)*t — 1/2*g*t 2
Таким образом, у нас два перемещения: одно по оси X, другое по оси Y. Если удар нанесен под углом 45 градусов, то cos(α) = sin(α) = sqrt(2)/2, поэтому v*cos(α) = v*sin(a)*t. Нужно, чтобы мяч попал в ворота, поэтому дальность удара должна превышать 86 единиц (расстояние до линии ворот равно 85,5). Нужно, чтобы полет мяча занимал 2 секунды. При подстановке этих значений в первое уравнение получим:
86 = 63 + v* cos(α) * 2 >= v* cos(α) = 23/2 = 11,5
Если заменить значения в уравнении, то уравнение перемещения по оси Y будет таким:
sY = 0 + 11,5*t-5*t 2
А по оси X — таким:
sX = 63 + 11,5*t
Уравнение для оси Y дает нам время, когда мяч снова ударится о землю. Для этого нужно решить квадратное уравнение (да, я понимаю, что вы надеялись навсегда распрощаться с ними после школьного курса алгебры, но тем не менее вот оно):
(-b ± sqrt(b 0 — 4*a*c))/2*a >= (-11,5 ± sqrt(11,52 — 4 * -5 * 0)/2 * -5 >= 0 или 23/10 >= 2,3 с
Этими уравнениями можно заменить перемещение для мяча. Сначала в Game.h создайте переменные для сохранения перемещения по трем осям:
float m_translationX, m_translationY, m_translationZ;
Затем в методе Update в Game.cpp добавьте уравнения:

Метод Render использует эти новые перемещения:
rotation *= XMMatrixTranslation(m_translationX, m_translationY, 0);
Если запустить программу сейчас, вы увидите, как мяч влетает в середину ворот. Если нужно, чтобы мяч двигался в других направлениях, нужно добавить горизонтальный угол удара. Для этого мы используем перемещение по оси Z.
Расстояние от 11-метровой отметки до ворот составляет 22,5 единицы, а расстояние между штангами ворот — 14 единиц. Это дает нам угол α = atan(7/22.5), то есть 17 градусов. Можно вычислить и перемещение по оси Z, но можно сделать и проще: мяч должен переместиться до линии в тот же момент, когда он достигнет штанги. Это означает, что мяч должен переместиться на 7/22,5 единицы по оси Z и на 1 единицу по оси X. Уравнение для оси Z будет таким:
sz = 11,5 * t/3,2 ≥ sz = 3,6 * t

Это перемещение до штанги ворот. У любого перемещения с меньшей скоростью угол будет меньше. Чтобы мяч достиг ворот, скорость должна составлять от -3,6 (левая штанга) до 3,6 (правая штанга). Если учесть, что мяч должен полностью попасть в ворота, максимальное расстояние составляет 6/22,5, а скорость — от 3 до -3. Имея эти цифры, можно задать угол удара в методе Update:

Результат должен быть примерно таким, как на рис. 7.

Рисунок 7. Удар под углом

Добавление вратаря

Новое положение вратаря используется в методе Render файла Game.cpp, где вычисляется перемещение вратаря:
auto goalkeeperTransform = XMMatrixTranslation(85.65f, 1.40f, m_goalkeeperPosition);
Применив эти изменения, можно запустить игру: вы увидите, что вратарь движется вправо или влево при нажатии соответствующих клавиш со стрелками (см. рис. 8).

Рисунок 8. Игра с вратарем в нужном положении

До сих пор мяч двигался постоянно, но это нам не нужно. Мяч должен начинать движение непосредственно после удара и останавливаться при достижении ворот. Вратарь также не должен двигаться до удара по мячу.
Необходимо объявить частное поле m_isAnimating в файле Game.h, чтобы игра «знала», когда мяч движется:

Объявляем два частных поля в файле Game.h: m_isGoal и m_IsCaught. Эти поля говорят нам о том, что произошло: пользователь забил гол или вратарь поймал мяч. Если оба поля имеют значение false, мяч еще летит. Когда мяч достигает вратаря, программа вычисляет границы мяча и вратаря и определяет, налагаются ли границы мяча на границы вратаря. Если посмотрите в код, то увидите, что я добавил 7.0 f к каждой границе. Я сделал это, поскольку границы могут быть положительными или отрицательными, а это усложнит вычисление наложения. Добавив 7.0 f, я добился того, что все значения стали положительными, чтобы упростить вычисление. Если мяч пойман, его положение устанавливается по центру вратаря. m_isGoal и m_IsCaught сбрасываются при ударе.

Итак, мы получили вполне рабочий вариант игры. Желающих продолжить ее совершенствовать, в частности, добавить ведение счета или сенсорное управление, отсылаем к исходному материалу на IDZ.

Основы directdraw

DirectDraw это часть DirectX и представляет из себя API. Первоначально с появлением Windows оказалось, что игры писать практически нельзя. То есть они очень медленно работали. При программировании в Windows графики используется GDI. Но как раз этот GGI очень медленный. Проблема не нова. Те кто программировал в DOS знают, что наибольшею скорость можно достичь, напрямую обращаясь к видеопамяти. Посмотрите на схему ниже, все операции производятся в обход GDI. И мы можем работать либо с уровнем HAL либо HEL. Разница в совместимости. HAL обеспечивает запись в память. Данный компонент имитирует большой участок памяти в независимости от реальной организации видео карты. Для вас память сплошная. При попытке обращения этот уровень разбирается, куда и что нужно писать в реальную память адаптера. HEL создан для унификации. Дело в том, что многие адаптеры поддерживаю ряд возможностей, помогая существенно упростить управление ими. Например, пересылку блоков памяти из одного участка в видео памяти в другой на уровне адаптера. Но этого может и не быть. Вот если этого нет HEL эмулирует данную возможность программно и позволяет не думать о том кто это сделает. Если видео карта, то хорошо, нет программным путем.

Для работы с DirectDraw он должен быть у Вас установлен. Есть много версий DirectDraw. Мы пока будем рассматривать DirectX 7, а соответственно и DirectDraw 7.

Технология DirectX

DirectX — совокупность технологий, разработанных корпорацией Microsoft с целью превратить Windows в оптимальную платформу для мультимедийных приложений и компьютерных игр с полноцветной графикой, видео, трехмерной анимацией и объемным звуком.

До появления DirectX практически все игры для компьютеров PC реализовывались на платформе MS-DOS. Каждую программу разработчикам приходилось комплектовать множеством видео- и аудиодрайверов (с тем, чтобы охватить как можно больше установленных у пользователей аппаратных компонентов) и при этом применять расширители DOS для преодоления барьера в 640 Кбайт. Среда Windows, упростившая взаимодействие пользователей с ПК благодаря удобному графическому интерфейсу, не облегчила жизнь программистов: в Windows графические программы функционировали слишком медленно. Как ни парадоксально это звучит, Windows, являясь графической средой, не была приспособлена для выполнения быстрых графических операций.

Пытаясь поправить ситуацию, Microsoft разработала для создателей компьютерных игр и графических приложений технологию WinG, которая обеспечивала более быстрое выполнение графических операций, чем интерфейс GDI (Graphics Device Interface) Windows. В то же время корпорация не ограничивалась только решением проблем производительности. Разработчики стремились к тому, чтобы программисты могли создавать игровые и прикладные программы, не задумываясь о том, какие аппаратные компоненты имеются у конкретного пользователя. Сама операционная среда должна была содержать все необходимые драйверы и взять на себя взаимодействие программы с аппаратурой ПК, такой как аудио, видеоплаты и принтеры.

Между тем, даже после выхода в свет ОС Windows 95, платформа Microsoft по-прежнему не соответствовала заявленным обещаниям. Только сегодня, с появлением усовершенствованных технологий, получивших обобщенное название DirectX, положение начинает меняться.

Технология DirectX позволяет программистам создавать в Windows приложения со встроенным доступом к аппаратным средствам. При этом им не нужно знать специфику аппаратной конфигурации определенного компьютера — явного программирования конкретной платы не требуется. Фактически DirectX выполняет роль промежуточного звена между программой и драйвером, преобразуя обобщенные команды в команды, специфические для того или иного устройства.

Если первоначально DirectX была ориентирована на превращение Windows 95 в полноценную платформу для компьютерных игр, всегда стимулировавших развитие аппаратных средств ПК, то по мере проникновения в массовые приложения технологий мультимедиа комплект программных интерфейсов DirectX становится важной частью операционной системы.

DirectX включает в себя следующие API:

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

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

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

— DirectPlay — представляет собой независимый протокол для осуществления связи между компьютерами. Может применяться для многопользовательских игр, связь в которых осуществляется через Интернет, локальную сеть или прямое последовательное соединение с помощью кабеля. Интерфейс, именуемый DirectPlay Lobby, позволяет создавать онлайновые места встреч в Интернете, попадая в которые множество людей могут объединяться и совместно участвовать в играх.

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

HAL и HEL



До появления DirectX создателям приложений мультимедиа для платформы Windows приходилось настраивать свои продукты для работы на широком спектре устройств и конфигураций. DirectX предусматривает так называемый уровень абстрагирования аппаратных средств HAL (Hardware Abstraction Layer). HAL функционирует как промежуточное звено между программным обеспечением и аппаратурой, позволяя разработчикам обращаться к тем или иным компонентам, не зная их марки, модели и других деталей. В результате они получают возможность писать лишь одну версию приложения, взаимодействующую с DirectX. Кроме того, DirectX предоставляет в распоряжение разработчиков инструментальные средства для достижения наивысшей производительности. Данный базовый слой определяет возможности аппаратуры компьютера и устанавливает соответствующие параметры приложения. Он обеспечивает также выполнение мультимедиа-приложений, использующих функции, не поддерживаемые в системе на аппаратном уровне. Это достигается за счет уровня HEL (Hardware Emulation Layer), с помощью которого DirectX программно эмулирует функции, не реализуемые самим устройством. Если аппаратное обеспечение не совместимо с запрашиваемым программой сервисом, уровень HEL пытается эмулировать его наилучшим возможным образом. Чаще всего эмулируются средства 3D-графики. Хотя эмуляция и не так эффективна, как аппаратная реализация, зато разработчику не приходится писать несколько версий одной и той же программы.

DirectDraw

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

Именно DirectDraw — единственный компонент DirectX, взаимодействующий с HAL. Использующие DirectDraw приложения взаимодействуют только с DirectDraw и не могут обращаться непосредственно к HAL. Этот интерфейс повышает производительность приложений за счет поддержки функций 2D-графики, быстрого выполнения» операций с растровыми изображениями, пересылки битовых блоков (blitting), прозрачного наложения объектов и управления несколькими слоями анимации.

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

DirectDraw реализует интерфейс с видеопамятью, используя четыре объекта: DirectDraw. DirectDrawSurface. DirectDrawPalette и DirectDrawClipper. Объект DirectDraw, плата адаптера дисплея, является основным. Объект DirectDrawSurface представляет видеопамять, куда помещаются отображаемые данные. Обычно DirectDrawSurface используется следующим образом. В памяти создаются два буфера (для смены изображений). Отображаемые фрагменты записываются в первый буфер (а не выводятся на экране непосредственно), а те, что должны отображаться следующими, во второй. Затем происходит переключение буферов — второй буфер становится текущим, и изображение обновляется. Direct3D позволяет выполнять приложение в режиме полного экрана или в окне, а также оперативно настраивать в программе разрешение дисплея.

Объект DirectDrawPaiette допускает применение для каждого фрагмента собственной палитры из 256 цветов или использование общих палитр, а DirectDrawClipper позволяет приложениям, выполняемым в окне, работать в обход GDI, уменьшая задержки при выводе графики и предоставляя прозрачный доступ к аппаратуре графических ускорителей.

Direct3D

Компонент Direct3D помогает интегрировать с приложениями Windows 3D-графику. Он применяется для разработки интерактивных приложений трехмерной графики и программ реального времени. Несомненными его достоинствами являются независимость от устройств, общая модель драйверов (гарантирующая поддержку минимального набора средств и возможностей), простота включения в приложения функций трехмерной графики. Созданные с помощью Direct3D прикладные системы могут работать на разных аппаратных платформах, поскольку все средства D i rect3D реализуются «поверх» HAL. Кроме того, Direct3D предлагает разработчикам аппаратных средств спецификацию, помогающую создавать платы, изначально поддерживающие различные средства Direct3D. Одним из наиболее важных качеств Direct3D является прозрачный доступ к графическим ускорителям. Если аппаратная платформа не поддерживает какой-то функции, Direct3D реализует ее эквивалент программным путем. В процессе своего исполнения приложение может определять наличие аппаратных компонентов и использовать их возможности. Кроме того, Direct3D реализует быстрый программно выполняемый рендеринг, для чего применяется полный конвейер рендеринга 3D-графики. При наличии соответствующей аппаратной поддержки часть операций такого рода осуществляется аппаратурой компьютера .

Пользователю средства Direct3D доступны через интерфейсы Retained Mode и Immediate Mode. Retained Mode базируется на Immediate Mode и некоторых средствах DirectDraw. Вместе с HAL эти интерфейсы по сути и образуют Direct3D. Direct3D Retained Mode (интерфейс отображения объектов Direct3D после их группирования) позволяет разработчикам комбинировать мультимедиа-информацию (например, графику и звук) для создания трехмерных сцен и управлять этими сценами в своих приложениях. Для корректного воспроизведения система файлов Direct3D хранит информацию, необходимую для трехмерного рендеринга, включая текстуры, порядок расположения объектов, маршрут анимации и другие детали.

Direct3D Immediate Mode (интерфейс непосредственного отображения объектов Direct3D) реализован на уровне DirectX Foundation и предоставляет разработчикам более прямой доступ к аппаратным средствам. Он обеспечивает повышенную скорость и гибкость, но в этом случае рендеринг сцены и управление ею должны осуществляться самим программистом. Кроме того, Direct3D работает совместно с HEL и реализует программную эмуляцию средств рендеринга 3d-графики, не поддерживаемых аппаратурой. Этот слой тесно интегрирован с DirectDraw HAL и драйверами GDI системы Win32, что помогает унифицировать модель драйверов для ускорения обработки трехмерной графики.

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

Модуль на основе этих матриц строит одну составную, которая и используется в вычислениях (в последних версиях Direct3D для ускорения вычислений применяется технология ММХ).

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

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

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

Компоненты Directlnput и DirectSound

Directlnput реализует поддержку в приложениях таких периферийных устройств управления, как джойстики. Он позволяет разработчикам программировать взаимодействие с этими устройствами, используя уровень HAL или HEL. В то же время Directlnput не ограничивается игровыми контроллерами и реализует интерфейс ввода данных с таких устройств, как графические планшеты.

Компонент DirectSound выполняет роль интерфейса с аппаратурой, предназначенной для воспроизведения звука. Он обеспечивает проигрывание файлов *.WAV и позволяет применять буферы разного типа (основные, вспомогательные, статические и потоковые). В основной буфер (используемый в данный момент компьютером) помещаются файлы из вспомогательных буферов (отведенных для каждого файла *.WAV). Небольшие файлы для ускорения доступа можно помещать в статические буферы, а более длинные -циклически загружать в потоковые буферы по частям. Кроме того, DirectSound предоставляет микшер, управляющий различными параметрами воспроизведения (от громкости до эффектов объемного звучания, применяемых к вспомогательным буферам).

Мультимедийный слой DirectX

Над базовым уровнем DirectX (DirectX Foundation) расположен мультимедийный слой DirectX Media. Если DirectX Foundation реализует функции нижнего уровня, то DirectX Media предоставляет средства высокого уровня для поддержки анимации, потоков мультимедиа (просмотр и прослушивание видео- и аудиофайлов, загружаемых из Internet), а также интерактивных функций.

DirectX Media, как и DirectX Foundation, состоит из нескольких интегрированных компонентов: DirectShow. DirectModel. Direct-Animation. DirectPlay. DirectSD Retained Mode (иногда в него включают и поддержку VRML). В частности, DirectShow и DirectPlay встроены в последние версии Microsoft Internet Explorer. С помощью набора взаимосвязанных фильтров (взаимодействующих с потоком данных через диспетчер фильтров) DirectShow выполняет функции воспроизведения потоков аудио и видео в различных форматах (MPEG, QuickTime, AVI и WAV). Этот компонент является одним из примеров реализации встраивания в операционную систему тех средств, которые ранее предлагались в качестве интегрируемых модулей и программных дополнений, поставляемых независимыми разработчиками.

Другие компоненты мультимедийного слоя обеспечивают иные функции высокого уровня, каждая из которых помогает разработчикам полностью использовать возможности аппаратных средств мультимедиа. DirectModel реализует рендеринг и взаимодействие с крупными объектами 30-графики. DirectAnimation позволяет разработчикам комбинировать звук с движением двух- и трехмерных изображений и связывать их с временными и инициируемыми пользователем событиями в целях создания сложных анимаций. Компонент DirectPlay спроектирован в основном для диалоговых игр с участием нескольких партнеров и приложений, в которых используются диалоговые коммуникации между пользователями сети. Он позволяет воспроизводить мультимедиа при работе в сети, осуществляя обмен информацией о ходе игры и сообщениями между ее участниками. Язык моделирования виртуальной реальности VRML

(Virtual Reality Modeling Language) использует DirectX для реализации трехмерных «виртуальных миров» в Web-браузерах, что существенно увеличивает скорость их отображения.

В целом мультимедийный слой DirectX помогает разработчикам решить одну из наиболее сложных задач, возникающих при создании высококачественных игровых программ для Windows и мультимедиа-приложений, — координировать различные типы мультимедийных эффектов. Это делается с помощью набора API-интерфейсов, синхронизирующих разные эффекты в рамках одного приложения. До появления D irectX в подобной ситуации приходилось использовать API-интерфейсы разных производителей (средств видео, аудио или анимации), что затрудняло объединение элементов. Слой DirectX Media помогает разработчикам также синхронизировать воспроизведение мультимедиа, привязывая его элементы к единой шкале времени.

Библиотека компонентов и другие элементы высокого уровня

DirectX Foundation и DirectX Media предоставляют разработчикам еще одно важное средство — библиотеку компонентов, которую можно использовать для создания компьютерных игр и мультимедиа-приложений. Такая библиотека упрощает процесс разработки, поскольку позволяет программистам применять большое число стандартных интерфейсов и элементов. Кроме того, реализуемые DirectX Media операции высокого уровня используются в следующем, компонентном слое, состоящем из приложений, построенных на основе базового и мультимедийного слоев. Такими компонентами являются, в частности, ActiveMovie, NetMeeting и NetShow, входящие в состав IE 4, Windows 98 и Windows NT 5.0. DirectX дает возможность разрабатывать целую систему подобных компонентов, количество которых продолжает увеличиваться. Кроме того, компоненты, составляющие DirectX, предоставляют разработчикам гибкую платформу для использования самых современных технологий.

Что нужно для программирования

В интерфейсе DirectX реализованы принципы модели COM (Component Object Model), что позволяет оформлять необходимые функции в виде компонентов или объектов. Значительное число API-интерфейсов DirectX представляет собой набор OLE-объектов. Все функции, поддерживаемые СОМ-объектом, можно использовать в качестве интерфейса при взаимодействии с этим объектом. Такой интерфейс представляет собой просто группу родственных функций, используемых для доступа к различным методам объекта. Применение СОМ-объектов в DLL-библиотеках дает ряд преимуществ перед экспортом обычных API-интерфейсов. Использовать указанные СОМ-объекты в приложении C++ или Object Pascal не труднее, чем любой другой API-интерфейс. Заголовочный файл DirectDraw описывает классы C++ для различных объектов DirectX. Экземпляры этих классов создаются путем вызова соответствующих функций «create». Естественно, создание Windows-приложений, использующих DirectX, требует навыков работы с инструментарием SDK или MFC.

Для компиляции и компоновки программы, использующей DirectX, прежде всего необходим комплект DirectX SDK. Он поставляется вместе со справочным файлом и полезными примерами программ. Кроме того, в системе должна быть установлена библиотека «DDRAW.DLL». Поскольку D i rectX представляет собой 32-разрядную технологию, необходим компилятор, способный генерировать приложения Win32 (такой, как Borland C++ 4.52 или C++ 5.0). Для выполнения программы в системе должны быть инсталлированы драйверы DirectX.

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

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 История создания … Википедия

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

Основы directdraw

Сидел я на днях, погруженный в унылую осеннюю тоску, и вспоминал прошлые дни. В прошлые дни все было лучше: свободное время не перерастало в скуку, хорошие идеи перерастали в хорошие программы. Короче говоря, в те дни я был молод и не работал. А еще я более-менее знал DirectX, и даже сделал симпатичную игру.

Ой, зря я начал так издалека. Попробуем снова.

Сидел я на днях, погруженный в унылую осеннюю скуку, и вспоминал прошлые дни. От тоски меня избавила идея разобраться в DirectX11. Загоревшись такой идеей, первым делом я попробовал найти уроки в интернете – безрезультатно. Тогда я открыл классический туториал MSDN . Вооружившись топором, я прорубил узкую тропу через его джунгли, снабжая код примеров густыми комментариями, а код статей – самодельными картинками и схемами. И вот. Дикая растительность повержена, длинный путь пройден, однако все эти сделанные мной штуковины могут кому-то пригодиться. Собственно, такая мысль и стала причиной рождения этого эпоса.

Все описанное ниже – очень вольный пересказ базового учебника Direct3D11 от Микрософт с сокращениями, пояснениями и дополнениями. Всего в MSDN насчитывается 7 уроков, которые я ужал до 6. Чтобы сравнять счет, пришлось составить собственный последний урок, который просто суммирует все описанное ранее (но в гораздо более интересной форме, поверьте).

Этот туториал не претендует на серьезность или, не дай бог, «остроумие» изложения. Я не пытаюсь тягаться с бессмертными творениями Anti loop ’а . Цель одна – просто поделиться знаниями, которые накопились в моей голове, но мне самому вряд ли пригодятся.

Урок 1. Создание устройства DirectX

Давайте разберемся, что же нам пондобится. Кроме огромного желания сделать что-то крутое и обязательно трехмерное необходимо знание C++. Мы будем создавать окно при помощи WinAPI. Я использовал Visual C++ из Microsoft Visual Studio 2008, но в принципе версия C++ не играет роли. Вы можете взять любую другую среду. Кроме того, придется скачать с сайта Микрософт DirectX SDK. Ссылка найдется где-то здесь . После распаковки архива не забудьте через меню Сервис a Параметры добавить каталоги с lib‘ами и include‘ами DirectX.

Итак, C++ выучен, SDK установлен, а идея будущей гениальной игры родилась. Что дальше? А дальше давайте разберемся, что такое вообще Direct3D. Как сообщает официальная справка, Direct3D – COM-библиотека, которая служит для облегчения и ускорения рисования в Windows. Direct3D напрямую работает с видеокартой, а это гораздо эффективнее, чем рисовать в стандартном окне при помощи стандартных API-функций. Кроме того, Direct3D сам проводит страшные трехмерные вычисления (ну или, во всяком случае, я так наивно думал, вспоминая DirectX8).

В этом уроке мы создадим минимально необходимые объекты Direct3D, привяжем их к нашему окну и научимся очищать его при помощи инструментов Direct3 D . «Ха-ха», — скажете вы, — «очистить окно можно одной строчкой, и без всяких Иксов». Так оно и есть, но Микрософт довольно разумно сочла, что для начала осилить и такой объем информации – уже неплохо. Мы не будем идти против Стива Б. и Билла Г.

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

Итак, сначала мы создаем окно. Это просто окно. Такое можно хоть в макросах Экселя создать, если подключить нужные API, так что код я приведу в конце. После этого нам надо будет создать устройства Direct3D, для чего мы отведем отдельную функцию. Кроме того, мы сделаем функцию удаления всех созданных устройств. Она будет вызываться при получении сообщения о завершении программы. В цикле сообщений мы используем время простоя (отсутствия сообщений), чтобы вызывать функцию Render(). Там-то мы средствами Direct3D и будем очищать наше окошко в восхитительный синий цвет.

// Главный цикл сообщений

while ( WM_QUIT != msg.message ) <

if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )

else // Если сообщений нет

CleanupDevice(); // Удалить объекты Direct3D

Илон Маск рекомендует:  Атрибут cols в HTML
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL