Основы 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 автоматически использует аппаратную поддержку, если она имеется, и по умолчанию в случае необходимости переключается на программную эмуляцию. Неудачей заканчиваются вызовы лишь тех функций, которые не поддерживаются ни на аппаратном, ни на программном уровне.
СОВЕТ |
Функция 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-страниц |
НОВОСТИ ФОРУМА Рыцари теории эфира |
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