Windows 中的图形 API
Windows Vista 支持全新的显示驱动程序模型,这是自 Windows 98 引入 Windows 驱动程序模型 (WDM) 以来对视频驱动程序设计的重大修改。 这一重新设计的模型反映了视频硬件从二维光栅操作和 GDI 应用到使用固定功能图形硬件的三维游戏,最后到支持各种高性能图形应用的现代可编程图形处理器 (GPU) 的演变过程。 Windows 7 和 Windows 8 以 Windows Vista 图形基础结构为基础,提供了更多图形功能和 API。 本文讨论 Windows 图形功能和 API。
- Background
- Direct3D 9
- Direct3D 9Ex
- Direct3D 10
- Direct3D 10.1
- Direct3D 11
- Direct3D 11.1
- OpenGL
- 应用程序兼容性、GDI 和旧版 Direct3D
- 建议
背景
自 Windows 诞生之初,图形编程的主要 API 就是图形设备接口 (GDI)。 此 API 设计用于处理众多 2D 输出设备,是 Windows 用户界面体验的基础。 DirectDraw 和 Direct3D 作为支持全屏游戏和 3D 呈现的替代 API 被引入,作为对当时现有硬件的扩展。 与 GDI 的互动非常复杂。 这种设计限制了传统 GDI 元素与 Direct3D 元素的有效混合。 Windows XP 版本的 WDM 被称为 XPDM,它反映了 GDI 和 Direct3D 并存的特性(请参阅图 1)。
图 1. Windows XP 中的图形 API
多年来,3D 显卡的性能大幅提升,绝大多数硬件都专用于这一功能。 新的驱动程序模型 Windows 显示驱动程序模型 (WDDM) 将 GPU 和 Direct3D 带到了最前沿,允许创建一种全新的体验 - 3D 桌面,从而将 GDI 的 2D 世界与现代可编程 GPU 的强大功能完美融合。 借助 WDDM,视频硬件完全由 Direct3D 驱动,所有其他图形接口都通过新的以 Direct3D 为中心的驱动程序模型与视频硬件通信(请参阅图 2)。
图 2. Windows Vista 中的图形 API
有关 WDDM 的详细信息,请参阅 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 应用程序接口的轻微扩展,它公开了虚拟化资源分配、新的丢失设备语义以及在 Windows Vista 上运行时可用的其他一些新功能。 通过创建该扩展对象,Direct3D 9 API 使用了新的语义,因此要求应用程序使用不同的逻辑(因此也是不同的代码路径)来创建、管理资源,并针对新的情况处理错误。 此 API 仅适用于 Windows Vista,并且需要使用 WDDM 驱动程序。 由于 Direct3D 9Ex 使用与 Direct3D 9 不同的 API 和驱动程序代码路径,因此支持该 API 需要对应用程序进行额外的测试。
创建新的 Direct3D 9Ex API 的主要原因是,在保持现有 Direct3D 应用程序兼容性的同时,允许完全访问 WDDM 的新功能。 新的 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 接口的示例、标头或库。 有关 Direct3D 9Ex 的详细信息,请参阅适用于 Windows Vista 的 DirectX。
Direct3D 10
为了充分发挥新的 Windows Vista 驱动程序模型和下一代硬件的潜力,我们创建了全新版本的 Direct3D API。 WDDM 消除了现有图形系统中对性能的一些限制,而 Direct3D 10 则更进一步,消除了现有 Direct3D API 中的设计瓶颈,并大大简化了 GPU 的编程任务。
除少数固定功能外,新的 API 完全取消了其他所有功能,取而代之的是可编程结构,大大简化了内部实现。 Direct3D 以前版本中的数百个功能位已被完全取消,取而代之的是一套定义明确、包含丰富功能的软件,其中只有少数几种特定资源格式的可选使用场景。 在新的 API 中,CPU 密集型资源的创建和验证现在有了明确的语义。 这使得性能行为的可预测性大大提高,并大大减少了每次绘制的开销。 资源可以重新配置为多种形式,以便在不同阶段高效使用,而且功能集对格式使用场景的限制要少得多。 此外,还有新的块压缩法线贴图纹理格式。
在新的 API 中,着色器常量和设备状态都是显式资源,可以在硬件上实现更高效的缓存,并大大简化驱动程序验证。 可编程着色器模型已在顶点和像素着色器中实现统一,并通过定义明确的计算模型和运算符集使其更具表现力。 此外,还新增了几何着色器阶段,可在顶点着色器阶段之后对基元进行操作。 GPU 在顶点和几何着色器阶段的工作结果可以流式传输到视频 RAM 中重复使用,从而可以在 CPU 互动最少的情况下进行极其复杂的多通道 GPU 交互。
所有这些增强功能都支持下一代图形技术,并扩展了应用程序将工作卸载到 GPU 的能力。 通过卸载,可以实现更复杂的基于 GPU 的角色皮肤绘制、加速变形技术、阴影体积生成和挤出、完全基于 GPU 的粒子和物理系统、将更复杂的材质组合成高效的大型绘制批次、程序化细部处理、实时光线追踪位移贴图、单通道立方体贴图生成以及更多技术,同时释放 CPU 资源,用于更复杂的应用。
为了在 Direct3D 10 中提供这种级别的创新,旧硬件不能作为新接口的部分实现。 显卡要么能支持所有新功能,要么就不是支持 Direct3D 10 的显卡。 因此,Direct3D 9 可以驱动 DirectX7 时代的硬件,但存在许多功能缺失和使用限制,而 Direct3D 10 只能在新一代显卡上运行。 应用程序要支持旧版视频硬件,还必须支持 Direct3D 9 接口。 Direct3D 的未来版本将以第 10 版为基础,将其扩展到新版本的应用程序接口,同时确保 Direct3D 10 功能的严格超集。
有关 Direct3D 10 的详细信息,请参阅 Direct3D 10。
Direct3D 10.1
Windows Vista Service Pack 1 通过 Direct3D 10.1 扩展了 Direct3D 10 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 级显卡、某些支持有限功能的 10level9 功能级别的 Direct3D 9 显卡以及最新一代的 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.2、Direct2D 设备上下文,以及对 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 相同的 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 功能级别。
- 在 Windows Vista、Windows 7 和 Windows 8 上使用 Direct3D 11,充分利用新一代视频硬件的优势。 Windows 商店应用必须使用 Direct3D 11 或更高版本。