Поделиться через


Общие сведения об API Direct2D

Direct2D предоставляет API, аналогичный Direct3D, для использования с C или C++. API предоставляет различные функциональные возможности, связанные с рисованием:

  • Отрисовка целевых объектов для отображения и отрисовки вне экрана с помощью Direct2D, Direct3D или GDI.
  • Объекты для управления состоянием рисования, такие как преобразования пространства координат и режимы сглаживания.
  • Представления для геометрических данных и функции для обработки геометрии.
  • Функции отрисовки для растровых изображений, геометрических объектов и текста.
  • Подготовка к использованию графического содержимого, созданного с помощью GDI или Direct3D.

В этом разделе представлен обзор объектов, составляющих API Direct2D. Он содержит следующие подразделы:

Файлы заголовков Direct2D

API Direct2D определяется следующими файлами заголовков.

Файл заголовка Описание
d2d1.h Определяет версии C и C++ основного API Direct2D.
d2d1helper.h Определяет вспомогательные функции, классы и структуры C++.
d2dbasetypes.h Определяет примитивы рисования для Direct2D, такие как точки и прямоугольники. Этот заголовок входит в состав d2d1.h.
d2derr.h Определяет коды ошибок для Direct2D. Этот заголовок входит в состав d2d1.h.
d2d1_1.h Определяет версии C и C++ основного API Direct2D для Windows 8 и более поздних версий.
d2d1_1helper.h Определяет вспомогательные функции, классы и структуры C++ для Windows 8 и более поздних версий.
d2d1effects.h Определяет версии C и C++ эффектов изображений в API Direct2D для Windows 8 и более поздних версий.
d2d1effecthelpers.h Определяет вспомогательные функции C++, классы и структуры эффектов изображений в API Direct2D для Windows 8 и более поздних версий.

 

Чтобы использовать Direct2D, приложение должно содержать файл заголовка d2d1.h.

Чтобы скомпилировать приложение Direct2D, добавьте d2d1.lib в список библиотек. D2d1.h и d2d1.lib можно найти в пакете средств разработки программного обеспечения Windows (SDK) для Windows 7.

В следующих разделах описываются некоторые распространенные интерфейсы, предоставляемые API Direct2D.

Интерфейсы Direct2D

В корне API Direct2D находятся интерфейсы ID2D1Factory и ID2D1Resource . Объект ID2D1Factory создает объекты ID2D1Resource и служит отправной точкой для использования Direct2D. Все остальные объекты Direct2D наследуются от интерфейса ID2D1Resource . Существует два типа ресурсов Direct2D: независимые от устройства ресурсы и ресурсы, зависящие от устройства.

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

(Дополнительные сведения о ресурсах и совместном использовании ресурсов см. в разделе Общие сведения о ресурсах.)

Интерфейс ID2D1Factory

Интерфейс ID2D1Factory является отправной точкой для использования Direct2D. Используйте ID2D1Factory для создания экземпляров ресурсов Direct2D. Чтобы создать ID2D1Factory, используйте один из методов CreateFactory .

Фабрика определяет набор методов CreateResource , которые могут создавать следующие ресурсы рисования:

  • Целевые объекты отрисовки — это объекты, которые отрисовывают команды рисования.
  • Блоки состояния рисования — это объекты, в которых хранятся сведения о состоянии рисования, такие как текущее преобразование и режим сглаживания.
  • Геометрические объекты — это объекты, представляющие простые и потенциально сложные фигуры.

Одним из наиболее полезных объектов, которые может создать фабрика, является ID2D1RenderTarget, как описано в следующем разделе.

Отрисовка целевых объектов

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

  • Объекты ID2D1HwndRenderTarget отображают содержимое в окне.
  • Объекты ID2D1DCRenderTarget отображаются в контексте устройства GDI.
  • Целевые объекты отрисовки точечного рисунка отображают содержимое в растровом рисунке вне экрана.
  • Целевые объекты dxGI отрисовки отображаются на поверхности DXGI для использования с Direct3D.

Так как целевой объект отрисовки связан с определенным устройством отрисовки, он является ресурсом, зависящим от устройства, и перестает работать при удалении устройства.

Отрисовка целевых компонентов

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

Целевые объекты отрисовки также могут группировать операции рисования в слои, представленные интерфейсом ID2D1Layer . Слои полезны для сбора операций рисования, которые необходимо объединить при отрисовке кадра. В некоторых сценариях это может быть полезной альтернативой отрисовке целевого объекта отрисовки растрового изображения, а затем повторного использования содержимого растрового рисунка, так как затраты на распределение на многоуровневое распределение ниже, чем для ID2D1BitmapRenderTarget.

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

Кроме того, можно выполнить отрисовку с помощью GDI в целевом объекте отрисовки Direct2D, вызвав QueryInterface в целевом объекте отрисовки для ID2D1GdiInteropRenderTarget, в котором есть методы GetDC и ReleaseDC , которые можно использовать для получения контекста устройства GDI. Отрисовка через GDI возможна только в том случае, если целевой объект отрисовки был создан с установленным флагом D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE . Это полезно для приложений, которые в основном отрисовывается с помощью Direct2D, но имеют модель расширяемости или другое устаревшее содержимое, требующее возможности отрисовки с помощью GDI. Дополнительные сведения см. в статье Общие сведения о взаимодействии Direct2D и GDI.

Отрисовка целевых ресурсов

Как и фабрика, целевой объект отрисовки может создавать ресурсы рисования. Все ресурсы, созданные целевым объектом отрисовки, зависят от устройства (как и целевой объект отрисовки). Целевой объект отрисовки может создавать следующие типы ресурсов:

  • Растровые изображения
  • Кисти
  • Слои
  • Сетки

Команды рисования

Для отрисовки содержимого используются методы рисования целевого объекта отрисовки. Перед началом рисования вызовите метод ID2D1RenderTarget::BeginDraw . После завершения рисования вызовите метод ID2D1RenderTarget::EndDraw . Между этими вызовами используются методы Draw и Fill для отрисовки ресурсов рисования. Большинство методов Draw и Fill принимают фигуру (примитив или геометрию) и кисть для заполнения или структурирования фигуры.

Целевые объекты отрисовки также предоставляют методы для обрезки, применения масок непрозрачности и преобразования пространства координат.

Direct2D использует левую систему координат: положительные значения оси X переходит вправо, а положительные значения оси Y — вниз.

Обработка ошибок

Команды отрисовки целевого рисунка не указывают, была ли запрошена операция успешной. Чтобы узнать, были ли ошибки рисования, вызовите метод Flush целевого объекта отрисовки или метод EndDraw , чтобы получить HRESULT.

Ресурсы рисования

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

Кисти

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

  • ID2D1SolidColorBrush закрашивает область сплошным цветом.
  • ID2D1LinearGradientBrush закрашивает область линейным градиентом, который смешивает два или более цветов через линию, ось градиента.
  • ID2D1RadialGradientBrush закрашивает область радиальным градиентом, который смешивает два или более цветов вокруг эллипса.
  • ID2D1BitmapBrush закрашивает область растровым рисунком.

Чтобы создать кисть, используйте один из методов ID2D1RenderTarget::Create*<Type>*Brush, например CreateRadialGradientBrush. Кисти можно использовать с методами Draw и Fill целевого объекта отрисовки либо для рисования росчерка фигуры или контура, либо в качестве маски непрозрачности.

Дополнительные сведения о кисть см. в статье Общие сведения о кисти.

Геометрия

В дополнение к базовым примитивам рисования, таким как точки, прямоугольники и многоточия, Direct2D предоставляет интерфейс ID2D1Geometry для описания простых и сложных фигур. Интерфейсы, наследующие от ID2D1Geometry , определяют различные типы фигур, например ID2D1RectangleGeometry для представления прямоугольников, ID2D1RoundedRectangleGeometry для представления округлых прямоугольников и ID2D1EllipseGeometry для представления многоточия.

Более сложные фигуры можно создать с помощью интерфейса ID2D1GeometrySink для указания ряда фигур, состоящих из линий, кривых и дуг. Id2D1GeometrySink передается методу Open id2D1PathGeometry для создания сложной геометрии. ID2D1SimplifiedGeometrySink также можно использовать с API DirectWrite для извлечения контуров пути отформатированного текста для художественной отрисовки.

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

Чтобы создать геометрию, используйте один из методов ID2D1Factory::Create*<Type>*Geometry, например CreatePathGeometry. Геометрия — это не зависящий от устройства ресурс.

Для отрисовки геометрии используются методы DrawGeometry и FillGeometry целевого объекта отрисовки.

Дополнительные сведения о геометриях см. в статье Общие сведения о геометрических элементах.

Растровые изображения

Direct2D не предоставляет методы для загрузки или хранения растровых изображений; вместо этого он позволяет создавать точечные изображения с помощью компонента обработки изображений Windows (WIC). Ресурсы точечных рисунков можно загрузить с помощью WIC, а затем использовать для создания ID2D1Bitmap с помощью метода ID2D1RenderTarget::CreateBitmapFromWicBitmap .

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

Поскольку создание ресурсов растрового изображения в целевых объектах отрисовки оборудования часто является дорогостоящей операцией, Direct2D может обновлять содержимое растрового изображения (или его части) с помощью методов CopyFromBitmap, CopyFromRenderTarget и CopyFromMemory . Использование этих методов может сэкономить затраты, связанные с дополнительными выделениями текстур GPU.

Рисование текста

Direct2D предназначен для работы с текстовыми операциями нового API текста, DirectWrite. Чтобы упростить использование API DirectWrite, целевые объекты отрисовки предоставляют три метода для отрисовки DirectWrite текстовых ресурсов: DrawText, DrawTextLayout и DrawGlyphRun. Так как Direct2D использует GPU для процесса отрисовки текста ClearType, Direct2D обеспечивает более низкую загрузку ЦП, чем GDI, для текстовых операций и лучшую масштабируемость по мере доступности большей вычислительной мощности GPU.

ID2D1RenderTarget::D rawText предназначен для простейших сценариев, включая отрисовку строки текста Юникода с минимальным форматированием. Более сложный макет и типографическая гибкость предоставляются с помощью метода ID2D1RenderTarget::D rawTextLayout , который использует объект IDWriteTextLayout для указания содержимого и форматирования для отрисовки. IDWriteTextLayout позволяет указать отдельное форматирование для подстрок текста и других расширенных параметров оформления.

В сценариях, где требуется точный контроль макета уровня глифа, метод ID2D1RenderTarget::D rawGlyphRun можно использовать в сочетании с средствами измерения, предоставляемыми DirectWrite.

Чтобы использовать API DirectWrite, включите заголовок dwrite.h. Как и Direct2D, DirectWrite использует фабрику IDWriteFactory для создания текстовых объектов. Используйте функцию DWriteCreateFactory для создания фабрики, а затем используйте ее методы Create для создания DirectWrite ресурсов (например, IDWriteTextFormat).

Дополнительные сведения о DirectWrite см. в разделе Введение DirectWrite.

Примитивы Direct2D

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

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

Справочник по Direct2D

DirectWrite HelloWorld

Знакомство с DirectWrite

Общие сведения о ресурсах

Компонент обработки изображений Windows (WIC)