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


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

DirectDraw® — это часть выпущенного компанией Microsoft программного продукта Microsoft® DirectX® 5 Software Development Kit (SDK). Для тех из вас, кто живет на необитаемых островах, скажу, что DirectX 5 SDK — последняя версия инструмента разработчика, изначально называвшаяся Game SDK. DirectX 5 SDK содержит набор динамически подключаемых библиотек (DLL) для ускорения операций с графикой, сервисы для работы с 3D, ускорение обработки звука, расширенные функции связи, функции для работы с джойстиком и CD-ROM.

Хотя тем для описания в DirectX 5 SDK очень много, в этой статье я собираюсь рассказать, как начать программировать графическую часть игры с помощью DirectDraw. Этот процесс относительно прост, хотя и требует незначительных познаний интерфейсов OLE и Component Object Model (COM). Однако, не паникуйте. Вся информация, которую вам нужно знать об OLE и COM, будет изложена в статье.

После прочтения этой статьи вы будете в состоянии написать простую игру с использованием DirectDraw. Однако в статье рассматриваются лишь основные моменты программирования DirectDraw. В примерах рассматриваются только полноэкранные режимы с переключением страниц. Я не собираюсь рассказывать о применении DirectDraw в окне, наложениях текстур на 3D поверхность, использования видеоклипов на поверхностях DirectDraw, или как рендерить поверхности с использованием DirectDraw. Если вы интересуетесь этими темами, можно почитать документацию по DirectX 5. (Документация DirectX 5 находится в библиотеке MSDN™ в разделе Platform SDK/Graphics and Multimedia Services.)

Требования DirectX 5 SDK

DirectX 5 SDK может работать как под платформой Windows® 95, так и Windows NT® 5.0. Далее предполагается, что вы используете IBM-PC–совместимый компьютер под управлением Windows 95. Плюс, для программирования, компилирования, и запуска программ, использующих DirectDraw, вам нужен инсталлированный DirectX 5 SDK. Вы можете скачать SDK по адресу http://www.microsoft.com/directx/resources/devdl.htm. DirectX 5 SDK также распространяется через библиотеку MSDN (только для подписчиков уровня Professional или выше).

Также предполагается, что у вас есть C или C++ компилятор, способный откомпилировать 32-битное приложение, и что у вас есть достаточный запас знаний по программированию на C или C++. Возможно использование других языков программирования для работы с DirectX 5 SDK, но в статье они не рассматриваются. Также вам необходимы познания в программировании под Windows.

Если вы используете компилятор C, вам необходимо проинсталлировать Win32® SDK. Win32 SDK содержит библиотеки, которые нужны вам, чтобы создать исполняемые файлы из примеров, поставляемых с DirectX 5 SDK.

DirectDraw API

DirectDraw — одна из компонент DirectX 5 SDK. DirectDraw был создан для быстрой работы; библиотека позволяет получить доступ к оборудованию на самом нижнем уровне, исключая многочисленные надстройки, обычно связанные с программированием Windows-based графики. Это делает DirectDraw идеальным средством для программирования игр, где самое главное — быстрый вывод графики на экран.

Но, конечно, основное преимущество DirectDraw — это то, что предоставляется одинаковый (общий) интерфейс к видеоадаптерам различных производителей Вам не нужно беспокоиться о том, на каком оборудовании будет работать ваша программа. DirectDraw использует информацию, находящуюся на абстрактном аппаратном уровне (HAL — Hardware Abstraction Level) для определения возможностей видеоадаптера. (Информация HAL — забота производителя видеоадаптера.) HAL определяет общий интерфейс между видеоадаптерами различных производителей и приложением, использующим DirectDraw.

Однако, DirectDraw не ограничивает вас только аппаратными возможностями видеоадаптера. Если вашей игре нужно специфичное оборудование или поддержка специфичных функций, а такого оборудования нет или функция не поддерживается, ваше приложение будет использовать уровень эмуляции аппаратуры (HEL — Hardware Emulation Level), включенный в DirectDraw. В этом случае DirectDraw использует встроенную эмуляцию для «создания» тех условий, которые требуются. Конечно, у HEL есть свои недостатки, в основном связанные с быстродействием. Этот вопрос будет рассмотрен позже, в статье Determining the Capabilities of the Display Hardware.

Следующий рисунок показывает связь между DirectDraw и графическими компонентами Windows:

Рисунок 1. Связь между DirectDraw и графическими компонентами Windows

API DirectDraw состоит из объекта DirectDraw, который представляет собой индивидуальный адаптер дисплея. Кроме того, API содержит объект DirectDrawSurface, который представляет собой поверхность, объект DirectDrawPalette, представляющий палитру поверхности, и объект DirectDrawClipper, представляющий список клипов. Объект DirectDraw можно использовать для создания объектов DirectDrawSurface и DirectDrawPalette. (Также с помощью объекта DirectDraw можно создать объект DirectDrawClipper, однако обычно DirectDrawClipper создают независимо.) Единственные объекты, нужные для создания игр — DirectDraw, DirectDrawSurface, и DirectDrawPalette.

Для понимания, как работают эти объекты вам нужны некоторые знания по технологии OLE и ее интерфейсу COM. Интерфейс COM — базис всего программирования DirectDraw. Если вы уже знакомы с OLE, вы можете пропустить следующий раздел, где будет рассказано, что вам нужно знать об OLE.

DirectDraw, OLE, и интерфейс COM

DirectDraw был спроектирован на основе OLE и интерфейса COM. Если вы не знакомы с программированием OLE начало программирования DirectDraw может показаться вам очень трудным. Хотя много бумаги ушло на многотомовые издания книг об OLE и интерфейсе COM, для программирования DirectDraw вам нужно знать всего лишь несколько вещей.

Для начала, дадим определение OLE и инетрфейсу COM. OLE — это объектно-ориентированная технология, разработанная Microsoft для совместного использования информации процессами. COM — Component Object Model (компонентная объектная модель) — интерфейс, используемый при программировании OLE. Теперь, когда вы знаете эти определения, можете их забыть — они не используются в программировании. Вместо этого давайте изучим самый минимум, который необходимо знать об интерфейсе COM, чтобы использовать DirectDraw.

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

Все интерфейсы COM выводятся из интерфейса IUnknown OLE. Интерфейс IUnknown поддерживает жизненный цикл объекта DirectDraw. В дополнение, он определяет доступные интерфейсы данного объекта. Интерфейс IUnknown состоит из трех методов: AddRef , Release , и QueryInterface .

AddRef и Release ответственны за хранение числа ссылок на интерфейс. Когда создается экземпляр объекта, число ссылок устанавливается в 1. Если какая-нибудь функция возвращает указатель на интерфейс, ассоциированный с этим объектом, функция должна вызывать метод AddRef для увеличения числа ссылок на 1. (Если другое приложение обращается к этому объекту, число ссылок также увеличивается. Для нашей статьи это уточнение не имеет значение, так как только одно приложение будет использовать наши объекты.)

Когда вы завершили использование интерфейса, вы должны вызвать метод Release для уменьшения числа ссылок на 1. Для того, чтобы удалить из памяти объект, число ссылок должно равняться 0. Как только число ссылок объекта равняется 0, он удаляется и все его интерфейсы становятся «неправильными» (invalid).

Третий метод IUnknown , QueryInterface , запрашивает объект о поддержке определенного интерфейса. Если интерфейс поддерживается, QueryInterface возвращает указатель на этот интерфейс.

Как методы AddRef , QueryInterface , и Release связаны с DirectDraw? Во-первых, нет причин использовать AddRef или QueryInterface в простых играх, использующих только DirectDraw. Функции, создающие различные типы объектов DirectDraw должны заботиться об увеличении числа ссылок и возвращении указателей на интерфейсы. Вам неоходимо выполнить Release для каждого неявно созданного указателя. Если эти требования не выполнять, ваши программы будут заканчиваться с «утечкой памяти». В следующих примерах я покажу как все делается. (Вам понадобится использовать AddRef и QueryInterface, если ваша программа использует объекты DirectDraw, уже используемые другим приложением. Если вы используете Direct3D, необходимо использовать QueryInterface для возврата указателя на интерфейс Direct3D. Оба эти случая находятся за пределами рассмотрения данной статьи.)

Теперь давайте посмотрим на пример кода на C, использующего метод интерфейса IDirectDraw :

ddrval = lpDD->lpVtbl->SetDisplayMode( lpDD, ScreenX, ScreenY, ScreenBpp );

В этой строчке кода вы используете метод SetDisplayMode для установки видеорежима и получения результата этой операции (успешно/неудачно). Это не так важно. Важно то, как получается указатель на метод, который вы используете. Вы не можете получить прямой доступ к методам интерфейса IDirectDraw . Когда создается экземпляр объекта, создается таблица виртуальных функций, называемая vtable, которая содержит указатели на все методы интерфейса. Единственная возможность вызвать методы интерфейса — использовать указатели из этой таблицы. В предыдущем примере указатель на объект DirectDraw (lpDD)указывает на указатель, содержащий адрес таблицы vtable (lpVtbl), которая в свою очередб содержит указатели на все методы объекта—в нашем случае это метод SetDisplayMode . Связь между нашим приложением и интерфейсом объекта представлена на следующем рисунке:

Следующий пример показывает, как сделать то же с использованием C++:

ddrval = lpDD->SetDisplayMode( ScreenX, ScreenY, ScreenBpp );

Заметим, что указатель на vtable явно больше не используется. Указатель на vtable неявный, и C++ автоматически подставляет lpDD как первый параметр. Указатель this больше не нужен, так как С++ вызывает метод относительно, используя указатель на текущий объект (в нашем случае, lpDD).

Если вы хотите узнать больше об OLE и интерфейсе COM, можете почитать книгу «Inside OLE» (автор Kraig Brockschmidt, MSDN Library/Books/Inside OLE). Это лучшая книга, объясняющая как работают OLE и COM. Я рекомендую прочитать первую главу и половину второй для хорошего понимания принципов функционирования интерфейса COM. Это поможет понять связи между DirectDraw и интерфейсом COM (если вы не поняли моих объяснений).

Начало работы с DirectDraw

Я отмечал ранее, что вам нужно проинсталлировать на компьютер DirectX 5 SDK. Также вам нужно проинсталлировать компилятор C или C++. Предположим, вы используете Microsoft Visual C++® версии 5.0 и вы проинсталлировали компилятор и SDK в каталоги по умолчанию. Если вы используете другой компилятор или проинсталлировали SDK в другой каталог на жестком диске, вам нужно внести соответствующие изменения в примеры, приведенные ниже.

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

Но перед началом работы нужно настроить окружение компилятора для работы с DirectX 5 SDK. Как это сделать, зависит от того, как вы используете Visual C++ для компиляции примеров. Я покажу вам правильную настройку в случае использования Microsoft Developer Studio, или при использовании утилиты NMAKE из командного режима.

Настройка Microsoft Developer Studio

Для тех из вас, кому нравится работать с удобным графическим интерфейсом, Visual C++ предлагает Microsoft Developer Studio. Для начала компилирования примеров из DirectX 5 SDK, вам нужно создать новый проект, подключить к нему несколько файлов и настроить окружение таким образом, чтобы компилятор нашел нужные библиотеки и включаемые файлы. Рассмотрим по пунктам, что же нужно сделать для того, чтобы откомпилировать первый пример, DDEX1.

Открыв Microsoft Developer Studio создайте новый проект:

  1. В меню File , выберите New .
  2. В диалоге New , выберите закладку Project .
  3. Из списка Projects , выберите Win32 Application .
  4. В поле Location можно выбрать путь к каталогу, содержащему проект.
  5. В поле Project name , введите DDEX1 .
  6. Нажмите OK . Появится новая папка DDEX1 Classes в левой части окна.

Для подключения к проекту файлов проделайте следующие действия:.

  1. В меню Project выберите пункт Add To Project и кликните Files . Появится диалог Insert Files into Project .
  2. Откройте каталог DXSDK\SDK\SAMPLES\DDEX1. Выберите все файлы с расширением CPP. Нажмите OK .
  3. Откройте панель FileView для просмотра файлов, подключенных к проекту.
  4. Для просмотра списка файлов в папке DDEX1, нажмите на + слева от надписи DDEX1.

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

  1. В меню Tools выберите Options . Появится диалог Options .
  2. Выберите закладку Directories .
  3. В списке Show Directories For выберите категорию файлов Include .
  4. В поле Directories , дважды щелкните на пустую строку в конце списка, и введите C:\DXSDK\SDK\LIB .
  5. Нажмите Enter .
  6. В поле Directories , дважды щелкните мышью на последней (пустой) строке и введите C:\DXSDK\SDK\SAMPLES\MISC.
  7. Выделите строку C:\DXSDK\SDK\LIB. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\LIB не станет самой верхней строкой.
  8. Выделите строку C:\DXSDK\SDK\SAMPLES\MISC. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\SAMPLES\MISC не станет второй (прямо после строки C:\DXSDK\SDK\LIB).
  9. Нажмите OK .

Выбираем каталог, где находятся библиотеки.

  1. В списке Show Directories For , выберите категорию файлов Library .
  2. В поле Directories , дважды щелкните на самую нижнюю пустую строку и введите C:\DXSDK\SDK\LIB .
  3. Нажмите Enter .
  4. Выделите строку C:\DXSDK\SDK\LIB. Нажимайте Move Item Up в поле Directories пока строка C:\DXSDK\SDK\LIB не станет самой верхней строкой.
  5. Нажмите OK .

Наконец, подключаем нужные библиотеки:

  1. В меню Project выберите пункт Settings . Появится диалог Project Settings .
  2. Выберите закладку Link .
  3. Из выпадающего списка Category выберите General .
  4. В списке Object/library modules добавьте Ddraw.lib и Winmm.lib.
  5. Нажмите OK .


Вы наверное удивляетесь, почему C:\DXSDK\SDK\INC, C:\DXSDK\SDK\SAMPLES\MISC и C:\DXSDK\SDK\LIB нужно двигать в самый верх поля Directories . Это нужно из-за того, что Visual C++ версии 5.0 уже содержит все библиотеки и включаемые файлы от DirectX 3. Чтобы быть увереным, что используются файлы DirectX 5, мы вынуждены поставить их самыми первыми в списке. В этом случае Visual C++ 5.0 найдет эти файлы первыми и не будет использовать старые файлы DirectX 3.

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

Настройка путей для утилиты NMAKE

Если вам (как и мне) нравится утилита командной строки NMAKE, то вам нужно прописать пути к каталогам, содержащим библиотеки и включаемые файлы DirectX 5. Так как в Visual C++ 5.0 используются длинные имена, то нужно проделать дополнительную работу, чтобы зставить NMAKE работать нормально. Я дам вам несколько подсказок, чтобы вы представляли, что нужно сделать.

  1. Первое, что нужно сделать — это изменить файл Vcvars32.bat, находящийся в каталоге C:\Program Files\DevStudio\VC\bin. Здесь нужно прописать некоторые переменные окружения, определяющие как вы используете C++. (К примеру, если вы переписали все каталоги с установочного диска C++ на жесткий диск, то нужно закоментировать все строки, ссылающиеся на CD-ROM)
  2. Затем необходимо создать .BAT- файл, который будет содержать все, необходимое для работы с DirectX 5:

1. @echo off
2. set INCLUDE=%INCLUDE%;C:\DXSDK\SDK\INC
3. set LIB=%LIB%;C:\DXSDK\SDK\LIB

  1. Затем необходимо увеличить объем памяти, выделяемый под переменные окружения окна MS-DOS® (спасибо новым длинным именам в Visual C++ 5.0). Для этого выполните в окне MS-DOS следующую команду:

1. command /E:1000

что добавит тысячу байт к уже выделенному объему. Заметим, что эту строку надо выполнить первой в окне MS-DOS, так как все установки переменных окружения, выполненные до этой команды будут потеряны.

  1. Зпаустите Vcvars32.bat для установки переменных окружения Visual C++ 5.0.
  2. Наконец, запустите .BAT — файл, который вы создали на шаге 2 DirectX 5.

Для того, чтобы откомпилировать какой-нибудь пример зайдите в каталог, его содержащий (C:\DXDSK\SDK\SAMPLES\DDEX4, например) и введите:

В каталоге, в котором вы находитесь создастся папка DEBUG и туда поместится откомпилированный исполняемый файл.

Начальный размер памяти, выделяемый под переменные окружения окна MS-DOS в Windows 95 можно изменить следующим образом:

  1. В настройках меню Пуск Windows найдите «MS-DOS Prompt».
  2. Щелкните на иконке правой кнопкой и выберите Properties .
  3. Выберите закладку Memory и измените значение Initial на 1024.

Основы DirectDraw (DDEX1)

Для использования DirectDraw сначала нужно создать экзепляр объекта DirectDraw object, который будет представлять адаптер дисплея, а затем использовать методы интерфеса. Также необходимо создать один или несколько экземпляров объекта DirectDrawSurface для отображения вашей игры.

Для демонстрации посмотрим, как DDEX1 из DirectX 5 SDK создает объект DirectDraw, затем создает основную поверхность и затем переключается между поверхностями.

Замечание Файлы примера DDEX написаны на C++. Если вы используете компилятор C, вам нужно модифицировать файлы чтобы они откомпилировались. (По крайней мере, вам нужно добавить vtable и указатель this для методов интерфейса.)

Инициализация DirectDraw

Инициализация DirectDraw в примере DDEX1 содержится в функции doInit .

/*
* Создаем основной объект DirectDraw.
*/
ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
if( ddrval == DD_OK )
<
// Get exclusive mode.
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
if(ddrval == DD_OK )
<
ddrval = lpDD->SetDisplayMode( 640, 480, 8 );
if( ddrval == DD_OK )
<
// Создаем основную поверхность.
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
DDSCAPS_FLIP |
DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval == DD_OK )
<
// Получаем указатель на бэк-буфер.
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps,
&lpDDSBack);
if( ddrval == DD_OK )
<
// Напишем текст.
if (lpDDSPrimary->GetDC(&hdc) == DD_OK)
<
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szFrontMsg,
lstrlen(szFrontMsg) );
lpDDSPrimary->ReleaseDC(hdc);
>
if (lpDDSBack->GetDC(&hdc) == DD_OK)
<
SetBkColor( hdc, RGB( 0, 0, 255 ) );
SetTextColor( hdc, RGB( 255, 255, 0 ) );
TextOut( hdc, 0, 0, szBackMsg,
lstrlen(szBackMsg) );
lpDDSBack->ReleaseDC(hdc);
>
// Создаем таймер для переключения страниц.
if( SetTimer( hwnd, TIMER_ID, TIMER_RATE, NULL ) )
<
return TRUE;
>
>
>
>
>
>

wsprintf(buf, «Direct Draw Init Failed (%08lx)\n», ddrval );

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

Создание объекта DirectDraw

Для создания экземпляра объекта DirectDraw ваше приложение может использовать функцию API DirectDrawCreate . (Заметим, что я употребил слово «может».Есть по-крайней мере еще одна возможность создания объекта DirectDraw — с использованием функции OLE CoCreateInstance — но это не обсуждается в данной статье).В DirectDrawCreate передается глобальный идентификатор (GUID) который определяет устройство вывода и в большинстве случаев он устанавливается в NULL (что говорит о том, что используется устройство вывода по умолчанию), адрес указателя, определяющий местонахождение создаваемого объекта DirectDraw, и третий параметр всегда устанавливается в NULL (используется для будущих расширений).

Следующий пример показывает, как создавать объект DirectDraw и определять, удачно ли завершилась эта операция:

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

В COM используется объектно-ориентированная модель, более жесткая, чем модели, принятые в языках типа C++. Так, доступ к COM-объектам всегда осуществляется с помощью функций. COM-объекты не могут иметь открытых переменных. Кроме того, наследование в COM выглядит ограниченным по сравнению с C++.

Объекты и интерфейсы

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

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

Все COM-интерфейсы являются производными от интерфейса IUnknown. Префикс I (от слова interface, то есть интерфейс) является стандартным для имен COM-интерфейсов. Имена всех интерфейсов DirectDraw начинаются с I, однако в документации обычно приводятся без префикса. В этой книге при упоминании COM-интерфейсов префикс I также будет опускаться.

Интерфейс IUnknown содержит три функции, наследуемые всеми COM-интерфейсами.

Функции AddRef() и Release() обеспечивают поддержку такого средства COM, как инкапсуляция времени существования (lifetime encapsulation). Она представляет собой протокол, согласно которому каждый объект сам отвечает за свое уничтожение.

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

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

Функция QueryInterface() позволяет обратиться к COM-объекту с запросом о том, поддерживает ли он тот или иной интерфейс. Вспомните, например, что обновленные COM-объекты предоставляют дополнительные интерфейсы, не изменяя существующих. Если данный интерфейс не поддерживается запрашиваемым объектом, возвращается указатель на альтернативный интерфейс.

GU >Чтобы обратиться к объекту с запросом о поддержке некоторого интерфейса, используя функцию QueryInterface(), необходимо как-то идентифицировать этот интерфейс. Для этого используется значение GUID (глобально-уникального идентификатора, Globally Unique IDentifier) данного интерфейса. GUID представляет собой 128-битное значение, уникальное для всех практических целей. Значения GUID всех интерфейсов DirectDraw включены в заголовочные файлы DirectX.

Такого краткого введения в COM вполне достаточно для эффективной работы с DirectDraw API. Далее, по мере обсуждения DirectDraw API, вы поймете, насколько важна эта информация.

DirectDraw API

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

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

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

Мы рассмотрим все интерфейсы вместе с входящими в них функциями. Тем не менее этот раздел не претендует на то, чтобы заменить собой справочное руководство. 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 выступает против хаотичного,

Чем Direct2D отличается от DirectDraw

13.02.2014, 18:34

Чем отличается =- от -=
Только подробно опишите пожалуйста,у меня из-за этого программа в циклах не правильно считает

Чем отличается if от (?:)
Здравствуйте. Почитываю С++, сам программирую в Делфи. Вот немного запутался. В делфи есть условный.

Чем отличается this от *this?
Привет всем ! вот код template Dictionary &.

Чем отличается?
Чем отличается? %d и %i в этой проге что лучше использовать d или i #include int.

Чем отличается equals от ==
Что они сравнивают: for(a.equals(f) и for(a == f) Что сравнивается в первом случае и.

18.02.2014, 10:34 2
11.03.2014, 12:24 3
11.03.2014, 20:02 4
11.03.2014, 20:41 5

Supported Direct3D Versions
Direct2D supports interoperability with Direct3D 10.1.
в 11 версии походу нет. Даже гдето есть тема на форуме про то что неужели нужно писать 2д самому под 11дх что то такое.

Рисование с Direct2D

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

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

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

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

Цвета

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

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

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

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

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

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

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

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

Кисти

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Фигуры

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

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

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

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


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

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

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

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

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

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

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

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

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

Direct Draw 1.0

Размер: 159 Кб

Скачать

Автор Randall Glass Software
  • (Сайт)
  • Языки Русский
    Лицензия Freeware (Бесплатная)
  • Основная информация о программе

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

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

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

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

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

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

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

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

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

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

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

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

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

    Функция GetCaps()

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

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

    СОВЕТ

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

    Функция SetCooperativeLevel()

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

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

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

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

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

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

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

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

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

    Использование Direct2D и DirectWrite в .Net-среде

    Несмотря что «нагуглить» в интернете можно все, для новых технологий это далеко не так. В частности, когда я захотел использовать достаточно новые технологии Direct2D (не бойтесь, это никак не связано с DirectX 7) и DirectWrite в своем .Net-приложении, то столкнулся с проблемой что примеров взаимодействия этих библиотек и .Net нет. Поэтому пришлось самому покопаться.
    Upd.: переношу в C++ т.к. дотнетчикам явно не интересно.

    Сначала следует пояснить что это за библиотеки. Direct2D – это новый API от Microsoft для быстрого, аппаратно-усторенного рисования двухмерной графики. Такое нововведение обрадовало бы тех, кто пока должен смиряться с тормозами GDI+ но, увы, на данный момент этот функционал доступен только из С++. Да, работа над оберткой ведется, например, командой SlimDX, но использовать хочется сегодня, поэтому снова лезем в P/Invoke.

    Вторая библиотечка – DirectWrite – сделана для качественного отображения текста. Под «качественным» подразумевается поддержка ClearType и OpenType-фич, которые важны в основном для тех кто любит типографику. Естественно, DirectWrite намного быстрее чем другие кустарные и неэффективные методы получения аналогичного результата.

    Warning: все это счастье доступно через DirectX 10.1, т.е. работает только в Висте и 7ке (а также в 2008 и 2008R2 соответственно). Да и еще, для того чтобы разрабатывать под эти фреймворки нужно скачать и установить последний Windows SDK (имеется ввиду тот, который для Windows 7/2008R2, я его в подписке долго искал) т.к. by default эти фичи с Visual Studio не поставляются.

    Библиотека DirectDraw использует т.н. «легковесный COM» что в переводе на русский означает что собственно COM-конструкты à la QueryInterface() не будут появляться в вашем коде слишком часто. Единственное – останутся постоянные проверки возвращаемых результатов на корректность. Да, и еще нужно после использования интерфейсов релизить их, или использовать что-нть вроде CComPtr (хотя для этого вроде как нужно втыкать поддержку ATL – точно не знаю т.к. не пробовал).

    Помимо DirectDraw, мы будем использовать некий компонент под названием Windows Imaging Component или просто WIC. Для наших (точнее моих) целей этот компонент актуален т.к. я планирую пробрасывать все тот же старый добрый System.Drawing.Bitmap из моего .Net-кода, и рисовать в него с помощью D2D/DWrite.

    Ну что, попробуем чего-нибудь нарисовать. Я для начала сделаю прототип функции, которую буду вызывать из .Net…


    [DllImport( «Typografix.Bitmap.dll» , CallingConvention = CallingConvention.Cdecl, ExactSpelling = true ,

    EntryPoint = «?RenderMarkup@@YAXPEAEPEB_WHHH1M@Z» , CharSet = CharSet.Unicode)]

    public static extern void RenderMarkup(IntPtr dst, string markup, int width,

    int height, int str >string fontFamily, float fontSize);

    Прошу прощения за многословность в опредении – это проблема 64-битной разработки и я об этом уже писал. Вот собственно аналог на С++. Как вы уже наверное догадались, функция просто рисует текст на предоставленной картинке. Для начального примера пойдет.

    MYAPI void RenderMarkup( BYTE * dst, LPCWSTR markup, int w >int height,

    int str >LPCWSTR fontFamily, float fontSize)

    Итак, суть всей затеи в том чтобы воспользоваться конструктами D2D и DW для того чтобы что-то там нарисовать. Первый этап – это создать фабрики, причем не одну а целых три – для Direct2D, DirectWrite и WIC соответственно. Тем кто работал в DirectX это будет знакомо:

    IWICImagingFactory *pWICFactory = NULL;

    Технология 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.

    Илон Маск рекомендует:  Креативный шаблон сайта HTML, CSS, Photoshop (psd), 1 страница
  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL