Direct2D 提供与 Direct3D 类似的 API,用于 C 或 C++。 API 公开各种与绘图相关的功能:
- 使用 Direct2D、Direct3D 或 GDI 进行显示和屏幕外渲染的渲染目标。
- 用于管理绘图状态的对象,例如坐标空间转换和抗锯齿模式。
- 几何数据的表示形式,以及用于几何处理的函数。
- 位图、几何图形和文本的呈现功能。
- 使用 GDI 或 Direct3D 创建的图形内容的规定。
本主题概述了构成 Direct2D API 的对象。 它包含以下部分:
Direct2D 头文件
Direct2D API 由以下头文件定义。
| 头文件 | Description |
|---|---|
| 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 接口
Direct2D API 的根目录是 ID2D1Factory 和 ID2D1Resource 接口。 ID2D1Factory 对象创建 ID2D1Resource 对象,并用作使用 Direct2D 的起点。 所有其他 Direct2D 对象继承自 ID2D1Resource 接口。 有两种类型的 Direct2D 资源:独立于设备的资源和设备依赖的资源。
- 与设备无关的资源不与特定的呈现设备相关联,并且可以在应用程序的整个生命周期中持久存在。
- 设备相关资源与特定呈现设备相关联,如果删除该设备,则停止运行。
(有关资源和资源共享的详细信息,请参阅 资源概述。
ID2D1Factory 接口
ID2D1Factory 接口是使用 Direct2D 的起点。 使用 ID2D1Factory 实例化 Direct2D 资源。 若要创建 ID2D1Factory,请使用一个 CreateFactory 方法。
工厂定义一组 Create* 方法(其中 * 是资源名称的占位符),可以生成以下绘图资源:
- 呈现目标是呈现绘图命令的对象。
- 绘图状态块是存储绘图状态信息的对象,例如当前转换和抗锯齿模式。
- 几何图形是表示简单和可能复杂的形状的对象。
工厂可以创建的最有用的对象之一是 ID2D1RenderTarget,如以下部分所述。
渲染目标
呈现目标是继承自ID2D1RenderTarget接口的资源。 渲染目标用于创建绘图资源并执行绘图操作。 有多种类型的呈现目标可用于以下列方式呈现图形:
- ID2D1HwndRenderTarget 对象将内容呈现到窗口。
- ID2D1DCRenderTarget 对象渲染到 GDI 设备上下文。
- 位图渲染目标对象将内容渲染到屏幕外位图。
- DXGI 渲染目标对象渲染到 DXGI 图面,以用于 Direct3D。
由于呈现目标与特定呈现设备相关联,因此它是一个依赖于设备的资源,如果删除了设备,它将停止运行。
渲染目标特性
可以指定渲染目标是否应使用硬件加速,以及远程显示应由本地计算机还是远程计算机呈现。 可以为别名呈现或抗锯齿呈现设置渲染目标。 对于需要渲染大量基元的场景,开发人员可以在混叠模式下呈现二维图形,并使用 D3D 多重采样抗锯齿,以实现更高的可扩展性。
呈现目标还可以将绘图操作分组到由 ID2D1Layer 接口表示的层中。 在渲染帧时,图层可用于收集并组合绘图操作。 对于某些场景,这可以是呈现到位图呈现目标然后重用位图内容这一操作的有用替代方法,因为分层的分配成本比 ID2D1BitmapRenderTarget 低。
呈现目标可以创建新的与自身兼容的呈现目标,这对于中间屏幕外呈现非常有用,同时保留原始上设置的各种呈现目标属性。
还可以通过在 ID2D1GdiInteropRenderTarget 的呈现目标上调用 QueryInterface,从而在 Direct2D 呈现目标上使用 GDI 呈现器来呈现 GDI,后者具有可用于检索 GDI 设备上下文的 GetDC 和 ReleaseDC 方法。 仅当使用 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*Brush 方法之一(其中* 是某些画笔名称的占位符),例如 CreateRadialGradientBrush。 画笔可以与渲染目标的 Draw 和 Fill 方法一起使用,以对形状进行笔划或轮廓绘制,或用作不透明度掩码。
有关画笔的详细信息,请参阅 画笔概述。
几何
除了基本绘图基元(如点、矩形和椭圆),Direct2D 还提供用于描述简单和复杂形状的 ID2D1Geometry 接口。 继承自 ID2D1Geometry 的接口定义不同类型的形状,例如用于表示矩形的 ID2D1RectangleGeometry 、用于表示圆角矩形的 ID2D1RoundedRectangleGeometry ,以及表示椭圆的 ID2D1EllipseGeometry 。
可以使用 ID2D1GeometrySink 接口创建更复杂的形状,以指定由线条、曲线和弧组成的一系列图形。 ID2D1GeometrySink 传递到 ID2D1PathGeometry 的 Open 方法以生成复杂几何图形。 ID2D1SimplifiedGeometrySink 还可用于 DirectWrite API,以提取格式文本的路径轮廓进行艺术呈现。
几何图形接口通过扩大或简化现有几何图形,或生成多个几何图形的交集或并集来提供操作形状的方法。 它们还提供用于确定几何图形是相交还是重叠、检索边界信息、计算几何图形的区域或长度以及沿几何图形内插位置的方法。 Direct2D 还提供创建从几何图形分割的三角形网格的功能。
若要创建几何图形,请使用 ID2D1Factory::Create*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 为文本作提供比 GDI 更低的 CPU 使用率和更好的可伸缩性,因为有更多的 GPU 处理能力可用。
ID2D1RenderTarget::DrawText 专为处理最简单的场景而设计,用于呈现具有最少格式的 Unicode 文本字符串。 通过 ID2D1RenderTarget::D rawTextLayout 方法提供了更复杂的布局和版式灵活性,该方法使用 IDWriteTextLayout 对象指定要呈现的内容和格式。 IDWriteTextLayout 使你可以为文本和其他高级版式选项的子字符串指定单独的格式。
对于需要精确控制字形级布局的方案, 可以将 ID2D1RenderTarget::D rawGlyphRun 方法与 DirectWrite 提供的度量设施结合使用。
若要使用 DirectWrite API,请包含 dwrite.h 标头。 与 Direct2D 一样, DirectWrite 使用工厂 IDWriteFactory 创建文本对象。 使用 DWriteCreateFactory 函数创建工厂,然后使用其 Create 方法创建 DirectWrite 资源(如 IDWriteTextFormat)。
有关 DirectWrite 的详细信息,请参阅 DirectWrite 简介 主题。
Direct2D 基元
Direct2D 定义一组基元,这些基元类似于其他绘图 API 提供的基元。 它提供颜色结构、用于执行转换的矩阵结构,以及点、矩形、椭圆和大小结构的浮点和整数版本。 您通常会使用这些结构的浮点版本。
不使用工厂或呈现器目标来实例化 Direct2D 基元。 可以直接创建它们,或使用 d2d1helper.h 中定义的帮助程序方法创建它们。
相关主题