培训
Direct2D API 概述
Direct2D 提供与 Direct3D 类似的 API,用于 C 或 C++。 API 公开各种与绘图相关的功能:
- 使用 Direct2D、Direct3D 或 GDI 进行显示和屏幕外渲染的呈现目标。
- 用于管理绘图状态的对象,例如坐标空间转换和抗锯齿模式。
- 几何数据的表示形式和用于几何处理的函数。
- 位图、几何图形和文本的呈现功能。
- 用于使用 GDI 或 Direct3D 创建的图形内容的预配。
本主题概述了构成 Direct2D API 的对象。 它包含以下部分:
Direct2D API 由以下头文件定义。
头文件 | 说明 |
---|---|
d2d1.h | 定义主 Direct2D API 的 C 和 C++ 版本。 |
d2d1helper.h | 定义 C++ 帮助程序函数、类和结构。 |
d2dbasetypes.h | 定义 Direct2D 的绘图基元,例如点和矩形。 此标头包含在 d2d1.h 中。 |
d2derr.h | 定义 Direct2D 的错误代码。 此标头包含在 d2d1.h 中。 |
d2d1_1.h | 定义适用于 Windows 8 和更高版本的主 Direct2D API 的 C 和 C++ 版本。 |
d2d1_1helper.h | 定义适用于 Windows 8 及更高版本的 C++ 帮助程序函数、类和结构。 |
d2d1effects.h | 定义适用于 Windows 8 和更高版本的 Direct2D API 的图像效果部分的 C 和 C++ 版本。 |
d2d1effecthelpers.h | 定义适用于 Windows 8 和更高版本的 Direct2D API 的图像效果部分的 C++ 帮助程序函数、类和结构。 |
若要使用 Direct2D,应用程序应包含 d2d1.h 头文件。
若要编译 Direct2D 应用程序,请将 d2d1.lib 添加到库列表。 可以在 适用于 Windows 7 的 Windows 软件开发工具包 (SDK) 中找到 d2d1.h 和 d2d1.lib。
以下部分介绍 Direct2D API 提供的一些常见接口。
Direct2D API 的根是 ID2D1Factory 和 ID2D1Resource 接口。 ID2D1Factory 对象创建 ID2D1Resource 对象,并用作使用 Direct2D 的起点。 所有其他 Direct2D 对象都继承自 ID2D1Resource 接口。 有两种类型的 Direct2D 资源:与设备无关的资源和与设备相关的资源。
- 与设备无关的资源不与特定呈现设备关联,并且可以在应用程序的生命周期内保留。
- 依赖于设备的资源与特定呈现设备相关联,如果该设备被删除,则停止工作。
(有关资源和资源共享的详细信息,请参阅 资源概述。)
ID2D1Factory 接口是使用 Direct2D 的起点。 使用 ID2D1Factory 实例化 Direct2D 资源。 若要创建 ID2D1Factory,请使用 CreateFactory 方法之一。
工厂定义一组可生成以下绘图资源的 CreateResource 方法:
- 呈现目标是呈现绘图命令的对象。
- 绘图状态块是存储绘图状态信息的对象,例如当前转换和抗锯齿模式。
- 几何图形是表示简单和可能复杂的形状的对象。
工厂可以创建的最有用的对象之一是 ID2D1RenderTarget,如下部分所述。
呈现器目标是从 ID2D1RenderTarget 接口继承的资源。 呈现器目标创建用于绘图的资源并执行绘图操作。 可通过以下几种呈现目标来呈现图形:
- ID2D1HwndRenderTarget 对象将内容呈现到窗口。
- ID2D1DCRenderTarget 对象呈现到 GDI 设备上下文。
- 位图呈现目标对象将内容呈现到屏幕外位图。
- DXGI 呈现目标对象呈现到 DXGI 图面,以便与 Direct3D 一起使用。
由于呈现器目标与特定呈现设备相关联,因此它是依赖于设备的资源,如果设备被删除,它将停止工作。
可以指定呈现目标是否应使用硬件加速,以及远程显示应由本地计算机还是远程计算机呈现。 可以为别名或抗锯齿呈现设置呈现目标。 对于具有大量基元的渲染场景,开发人员还可以在别名模式下呈现二维图形,并使用 D3D 多重采样抗锯齿实现更高的可伸缩性。
呈现目标还可以将绘图操作分组为 由 ID2D1Layer 接口表示的层。 图层可用于收集在呈现帧时要组合在一起的绘图操作。 在某些情况下,这可以是呈现到位图呈现目标,然后重用位图内容的有用替代方法,因为分层的分配成本低于 ID2D1BitmapRenderTarget。
呈现器目标可以创建与自身兼容的新呈现目标,这对于中间屏幕外呈现非常有用,同时保留对原始对象设置的各种呈现目标属性。
还可以通过在 ID2D1GdiInteropRenderTarget 的呈现目标上调用 QueryInterface,在 Direct2D 呈现目标上使用 GDI 呈现,该目标上具有 GetDC 和 ReleaseDC 方法,可用于检索 GDI 设备上下文。 仅当创建具有D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE标志的呈现目标时,才能通过 GDI 进行 呈现 。 这对于主要使用 Direct2D 呈现但具有扩展性模型或需要能够使用 GDI 呈现的其他旧内容的应用程序非常有用。 有关详细信息,请参阅 Direct2D 和 GDI 互操作性概述。
与工厂一样,呈现器目标可以创建绘图资源。 呈现器目标创建的任何资源都是依赖于设备的资源 (就像呈现目标) 一样。 呈现器目标可以创建以下类型的资源:
- 位图
- 画笔
- 图层
- 网格
若要呈现内容,请使用呈现目标绘图方法。 在开始绘制之前,请调用 ID2D1RenderTarget::BeginDraw 方法。 完成绘图后,调用 ID2D1RenderTarget::EndDraw 方法。 在这些调用之间,可以使用 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 传递到 ID2D1PathGeometry 的 Open 方法,以生成复杂的几何图形。 ID2D1SimplifiedGeometrySink 还可以与 DirectWrite API 一起使用,以提取用于艺术呈现的格式化文本的路径轮廓。
几何图形接口提供通过扩大或简化现有几何图形或通过生成多个几何图形的交集或联合来操作形状的方法。 它们还提供了用于确定几何图形是相交还是重叠、检索边界信息、计算几何图形的面积或长度以及沿几何图形内插位置的方法。 Direct2D 还提供创建从几何图形分割的三角形网格的功能。
若要创建几何图形,请使用 ID2D1Factory::Create*<Type>*Geometry 方法之一,例如 CreatePathGeometry。 几何图形是独立于设备的资源。
若要呈现几何图形,请使用呈现目标的 DrawGeometry 和 FillGeometry 方法。
有关几何图形的详细信息,请参阅 几何图形概述。
Direct2D 不提供用于加载或存储位图的方法;相反,它使你能够使用 Windows 图像处理组件 (WIC) 创建位图。 可以使用 WIC 加载位图资源,然后使用它通过 ID2D1RenderTarget::CreateBitmapFromWicBitmap 方法创建 ID2D1Bitmap。
还可以从通过其他方式设置的内存中数据创建位图。 创建位图后,可通过呈现目标 DrawBitmap 方法或使用位图画笔绘制该位图。
由于在硬件呈现目标上创建位图资源通常是一项成本高昂的操作,因此 Direct2D 可以使用 CopyFromBitmap、 CopyFromRenderTarget 和 CopyFromMemory 方法更新位图 (或部分位图) 的内容。 使用这些方法可能会节省与其他 GPU 纹理分配相关的成本。
Direct2D 旨在处理新文本 API 的文本操作,DirectWrite。 为了使使用 DirectWrite API 更简单,呈现目标提供了三种用于呈现DirectWrite文本资源的方法:DrawText、DrawTextLayout 和 DrawGlyphRun。 由于 Direct2D 将 GPU 用于 ClearType 文本呈现过程,因此 Direct2D 在文本操作中提供的 CPU 使用率低于 GDI,并且随着 GPU 处理能力的提高,可伸缩性更好。
ID2D1RenderTarget::D rawText 专为涉及以最小格式呈现 Unicode 文本字符串的最简单方案而设计。 ID2D1RenderTarget::D rawTextLayout 方法提供了更复杂的布局和版式灵活性,该方法使用 IDWriteTextLayout 对象指定要呈现的内容和格式。 使用 IDWriteTextLayout 可以为文本和其他高级版式选项的子字符串指定单独的格式。
对于需要精确控制字形级布局的方案,ID2D1RenderTarget::D rawGlyphRun 方法可与 DirectWrite 提供的度量设施结合使用。
若要使用 DirectWrite API,请包含 dwrite.h 标头。 与 Direct2D 一样,DirectWrite使用工厂 IDWriteFactory 来创建文本对象。 使用 DWriteCreateFactory 函数创建工厂,然后使用其 Create 方法创建DirectWrite资源 (如 IDWriteTextFormat) 。
有关DirectWrite的详细信息,请参阅DirectWrite简介主题。
Direct2D 定义一组类似于其他绘图 API 提供的基元。 它提供颜色结构、用于执行转换的矩阵结构,以及点、矩形、椭圆和大小结构的浮点和整数版本。 通常,可以使用这些结构的浮点版本。
不使用工厂或呈现目标来实例化 Direct2D 基元。 可以直接创建它们,也可以使用 d2d1helper.h 中定义的帮助程序方法来创建它们。