Windows 中的图形 API

Windows Vista 包括对全新的显示驱动程序模型的支持,该模型是自 Windows 98 引入 Windows 驱动程序模型 (WDM) 以来视频驱动程序设计的主要修订版。 此重新设计的模型反映了视频硬件从 2D 光栅操作和 GDI 应用程序到具有固定功能图形硬件的 3D 游戏的演变,最后演变为支持各种高性能图形应用程序的现代可编程图形处理单元 (GPU) 。 Windows 7 和 Windows 8通过提供其他图形功能和 API 在 Windows Vista 图形基础结构上构建。 本文讨论 Windows 图形功能和 API。

背景

自 Windows 早期以来,用于图形编程的主要 API 一直是图形设备接口 (GDI) 。 此 API 旨在处理许多 2D 输出设备,它构成了 Windows 用户界面体验的基础。 DirectDraw 和 Direct3D 作为替代 API 引入,以支持全屏游戏和 3D 呈现作为当时现有硬件的扩展。 与 GDI 的交互很复杂。 这种设计限制了传统 GDI 元素与 Direct3D 元素的有效混合。 Windows XP 版本的 WDM(称为 XPDM)反映了 GDI 和 Direct3D (图 1) 。

图 1. Windows XP 中的图形 API

xpdm

多年来,3D 视频卡的功能已大幅增长,绝大多数硬件都专用于此功能。 新的驱动程序模型,Windows 显示驱动程序模型 (WDDM) ,将 GPU 和 Direct3D 置于最前沿,允许创建全新的体验 3D 桌面,该体验将 GDI 的 2D 世界与现代可编程 GPU 的强大功能无缝融合。 使用 WDDM 时,视频硬件完全由 Direct3D 驱动,所有其他图形接口通过新的以 Direct3D 为中心的驱动程序模型与视频硬件通信 (请参阅图 2) 。

图 2. Windows Vista 中的图形 API

wddm

有关 WDDM 的详细信息,请参阅 MSDN 上的 Windows Vista 显示驱动程序模型 (WDDM) 设计指南

Direct3D 9

DirectX 版本 9 于 2002 年首次针对 Windows 发布,并在 2003 年和 2004 年进行了后续更新。 此 API 表示 DirectX 技术经过十年的发展,引入了更强大的 Direct3D 着色器编程模型,以及成千上万的交付游戏支持的成熟度。 Direct3D 9 是 Windows Vista 上的主要图形界面。 它仍然是用于编写需要在各种现有硬件和 Windows 版本上运行的 3D 游戏和应用程序的理想 API。 使用 Direct3D 9 接口的应用程序隐藏了新驱动程序模型的详细信息,但在后台,操作系统正在充分利用新功能来提供真正的 GPU 多任务、更高效的资源管理和可靠的性能。

为了确保与旧版 Windows 完全兼容,即使使用新的 Windows Vista 显示驱动程序模型,也必须模拟旧驱动程序模型的一些怪癖。 例如,当全屏应用程序失去焦点时,它必须假定它已丢失视频内存中的所有资源, (VRAM) 并重新加载它创建为非托管资源的所有资源,即使新的驱动程序模型以透明方式处理资源而不将其从设备上下文中逐出。 即使是托管资源类型与默认资源类型的概念也特定于旧的驱动程序模型。 另一个示例是,当分配非托管 (默认池) 资源超过可用 VRAM 量时,预期会失败,即使新的驱动程序模型可以提供几乎无限量的虚拟视频内存。 由于这些要求,在 Windows Vista 上运行的 Direct3D 应用程序仍会收到这些错误条件。 因此,它们使用基本 Direct3D 9 接口来充分利用新驱动程序模型的某些功能的能力受到限制。

虽然随 Windows Vista 一起提供的新系统将包括带有 WDDM 驱动程序的视频卡,并且许多常用视频卡的新驱动程序也包含在框中,但 Windows Vista 继续支持使用较旧的 XPDM 驱动程序进行升级和企业版的功能。 在使用旧驱动程序模型的系统上,必须使用 Direct3D 9 和更早版本的接口,并且图形系统的操作与 Windows XP (图 1) 的操作非常相似。 应用程序需要 WDDM 才能使用 Direct3D 9Ex、Direct3D 10 及更高版本。

Direct3D 9Ex

Direct3D 9Ex 接口提供对标准 Direct3D 9 API 的轻微扩展的访问权限,该扩展公开虚拟化资源分配、新的丢失设备语义,以及 Windows Vista 上运行时可用的一些其他新功能。 通过创建此扩展对象,Direct3D 9 API 使用新的语义,因此要求应用程序使用不同的逻辑 (因此使用不同的代码路径,) 用于资源创建、管理和新类型条件的错误处理。 此 API 仅在 Windows Vista 上可用,并且需要 WDDM 驱动程序。 因为与 Direct3D 9 相比,Direct3D 9Ex 使用单独的 API 和驱动程序代码路径,因此支持此 API 需要应用程序的其他测试用例。

创建新的 Direct3D 9Ex API 的主要原因是允许完全访问 WDDM 的新功能,同时保持现有 Direct3D 应用程序的兼容性。 新的 3D 桌面和许多特定于 Windows Vista 的应用程序使用此版本的 Direct3D 9,但在较旧的 XPDM 驱动程序上运行时,它们不起作用。 由于缺少对 WDDM 的支持,Direct3D 9Ex API 永远不会出现在较旧版本的 Windows 上,因此标准 Direct3D 9 接口涵盖更广泛的系统集。 对于可以利用下一代视频硬件的高性能应用程序,全新的 Direct3D 版本 10 提供了许多 Direct3D 9Ex 未公开的新功能。 因此,对于游戏和大多数其他应用程序,建议使用 Direct3D 9 或 Direct3D 10 API。

注意

DirectX SDK 不提供 Direct3D 9Ex 接口的示例、标头或库。 MSDN 库和 Windows SDK (以前称为平台 SDK) 包含可用的文档、标头和库。

 

有关 Direct3D 9Ex 的详细信息,请参阅 MDSN 上的 DirectX for Windows Vista

Direct3D 10

为了充分实现新的 Windows Vista 驱动程序模型和下一代硬件的潜力,我们创建了一个全新的 Direct3D API 版本。 虽然 WDDM 消除了现有图形系统中对性能的一些限制,但 Direct3D 10 通过消除现有 Direct3D API 中的设计瓶颈,进一步简化了 GPU 编程任务。

新 API 完全消除了除一些固定函数之外的所有方面,将它们替换为可编程构造,并大大简化了内部实现。 以前版本的 Direct3D 中的数百个功能位已被完全消除,并替换为一组定义完善的包含功能,这些功能仅具有特定资源格式的几个可选使用方案。 CPU 密集型资源创建和验证现在在新 API 中具有显式语义。 这允许更可预测的性能行为,并大大减少每次绘制的开销。 可以将资源重新配置为多个形式,以便在各个阶段高效使用,并且功能集对格式的使用方案施加的限制要小得多。 还有新的块压缩法线贴图纹理格式。

在新 API 中,着色器常量和设备状态是显式资源,允许在硬件上实现更高效的缓存,并大大简化了驱动程序验证。 可编程着色器模型已跨顶点着色器和像素着色器统一,并且通过定义完善的计算模型和运算符集更具表现力。 此外,还添加了一个新的几何着色器阶段,用于在顶点着色器阶段之后对基元进行操作。 GPU 在管道的顶点和几何着色器阶段的工作结果可以流式传输到视频 RAM 以供重复使用,从而允许极其复杂的多传递 GPU 操作,且 CPU 交互最少。

所有这些增强功能都支持下一代图形技术,并扩展应用程序将工作卸载到 GPU 的能力。 卸载允许更复杂的基于 GPU 的字符外观、加速变形技术、阴影体积生成和延伸、粒子和物理系统(完全基于 GPU、更复杂的材料组合成高效的大型绘制批处理、程序细节、实时光线跟踪位移映射、单通道立方体映射生成和更多技术),同时为更复杂的应用程序释放 CPU 资源。

若要在 Direct3D 10 中提供这种创新级别,旧硬件不能表示为新接口的部分实现。 视频卡要么能够支持所有新功能,要么不是支持 Direct3D 10 的卡。 因此,虽然 Direct3D 9 可能驱动许多缺少功能和使用限制的 DirectX7 时代硬件,但 Direct3D 10 仅适用于新一代视频卡。 要使应用程序支持较旧的视频硬件,它还必须支持 Direct3D 9 接口。 未来版本的 Direct3D 将在版本 10 的基础上生成,将其扩展到 API 的新版本,同时确保 Direct3D 10 功能的严格超集。

有关 Direct3D 10 的详细信息,请参阅 Direct3D 10

Direct3D 10.1

Windows Vista Service Pack 1 使用 Direct3D 10.1 扩展 Direct3D 10 API,该 API 添加了可选接口和附加着色器模型,以支持支持 Direct3D 10.1 的视频卡的新硬件功能。 能够支持 Direct3D 10.1 的所有硬件也完全支持 Direct3D 10 的所有功能,并且游戏开发人员可以使用 Direct3D 10.1 的其他功能(如果可用)。

注意

Direct3D 10.1 是 Windows 7 桌面版使用的图形 API。

 

注意

Windows 7 和 Windows Vista 更新向现有 Direct3D 10.1 API 添加了对 DXGI 1.1、10level9 功能级别和 WARP10 设备的支持。

 

Direct3D 11

Windows 7 支持基于 Direct3D 10.1 API 设计构建的新版 Direct3D Direct3D 11。 API 的新功能包括多线程渲染和资源创建、计算着色器、对 10level9 功能级别和 WARP10 软件渲染设备的支持,以及新的 Direct3D 11 类硬件功能,例如使用外壳 & 域着色器细化、BC6H 和 BC7 纹理压缩格式、着色器模型 5.0 和动态着色器链接。 新 API 可以使用现有的 Direct3D 10 和 10.1 类视频卡,一些 Direct3D 9 卡通过功能支持有限的 10level9 功能级别,以及最新一代 Direct3D 11 类视频卡。

除了 Direct3D 11 API 外,Windows 7 还包括 DXGI 1.1、Direct2D、DirectWrite,并支持 WDDM 1.1 驱动程序。

注意

Direct3D 11 和相关 API 也作为 Windows Vista 的更新提供 (请参阅 如何安装最新版本的 DirectX) 。

 

Direct3D 11.1

Windows 8使用 Direct3D 11.1 扩展 Direct3D 11 API。 Direct3D 11.1 支持 具有级别 11、10_x 和9_x支持的所有现有硬件,以及新的 11_1 功能级别。

除了 Direct3D 11.1 API 外,Windows 8还包括 DXGI 1.2Direct2D 设备上下文和对 WDDM 1.2 驱动程序的支持。

注意

如果希望 Windows 应用商店应用使用 DirectX 对 3D 图形进行编程,可以使用 Direct3D 11.1 API。 有关使用 DirectX 编程 3D 图形的详细信息,请参阅 使用 DirectX 的 3D 图形简介

 

适用于 Windows 7 的平台更新:对于安装了适用于 Windows 7 的平台更新的 Windows 7 或 Windows Server 2008 R2 上的 Direct3D 11.1 API,提供部分支持。 有关适用于 Windows 7 的平台更新的详细信息,请参阅 适用于 Windows 7 的平台更新

Opengl

Windows Vista、Windows 7 和 Windows 8 提供与 Windows XP for OpenGL 相同的支持,它允许视频卡制造商为 OpenGL 提供可安装的客户端驱动程序 (ICD) ,以提供硬件加速支持。 请注意,需要较新版本的此类 ICD 才能完全支持 Windows Vista、Windows 7 或 Windows 8。 如果未安装 ICD,系统在大多数情况下将回退到 OpenGL v1.1 软件层。

应用程序兼容性、GDI 和较旧版本的 Direct3D

Windows Vista、Windows 7 和 Windows 8 图形系统旨在支持各种硬件和使用方案,以支持新技术,同时继续支持现有系统。 现有图形接口(如 GDI、GDI+和较旧版本的 Direct3D)继续在 Windows Vista 和 Windows 7 上运行,但会尽可能在内部重新映射。 这意味着大多数现有 Windows 应用程序将继续工作。

Windows Vista、Windows 7 和 Windows 8继续支持与 Windows XP 相同的 Direct3D 和 DirectDraw 接口,回退到 DirectX (版本 3,Direct3D 的保留模式) 中删除。 与 Windows XP Professional x64 Edition 一样,较新版本 Windows 上的 64 位本机应用程序仅限于 Direct3D9、DirectDraw7 或更新的接口。 高性能应用程序应使用 Direct3D 9 或更高版本,以确保它们与硬件功能最匹配。

建议

为图形应用程序选择 API 时,请考虑以下建议:

  • 如果应用程序必须支持 Windows XP 或早期版本的 Windows,请使用 Direct3D 9。
  • 如果要支持使用 XPDM 驱动程序运行的 Windows Vista 或 Windows 7,请使用 Direct3D 9。 对于缺少 Direct3D 10 或更好视频硬件的 Windows Vista 或 Windows 7 系统,可以选择使用现有的 Windows XP Direct3D 9 代码路径,或通过 Direct3D 10.1 或 Direct3D 11 API 使用 10level9 功能级别。
  • 使用 Direct3D 11 利用 Windows Vista、Windows 7 和 Windows 8 上的下一代视频硬件。 Windows 应用商店应用必须使用 Direct3D 11 或更高版本。