Общие сведения об API Direct2D
Direct2D предоставляет API, аналогичный Direct3D, для использования с C или C++. API предоставляет различные функциональные возможности, связанные с рисованием:
- Отрисовка целевых объектов для отображения и отрисовки вне экрана с помощью Direct2D, Direct3D или GDI.
- Объекты для управления состоянием рисования, такие как преобразования пространства координат и режимы сглаживания.
- Представления для геометрических данных и функции для обработки геометрии.
- Функции отрисовки для растровых изображений, геометрических объектов и текста.
- Подготовка к использованию графического содержимого, созданного с помощью GDI или Direct3D.
В этом разделе представлен обзор объектов, составляющих API Direct2D. Он содержит следующие подразделы:
- Файлы заголовков Direct2D
- Интерфейсы Direct2D
- Интерфейс ID2D1Factory
- Отрисовка целевых объектов
- Ресурсы рисования
- Рисование текста
- Примитивы 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.
Связанные темы