背景
本文尝试对Windows系统中的一些Graphic相关的概念进行介绍和厘清。
windows图形基础架构简介
Windows 为图形提供了多个 API,下图显示了这些 API。
上图出自微软官方https://learn.microsoft.com/en-us/windows/win32/learnwin32/overview-of-the-windows-graphics-architecture
- 图形设备接口 (GDI) 是 Windows 的原始图形接口。 GDI 首先针对 16 位 Windows 编写,然后针对 32 位和 64 位 Windows 进行了更新。
- GDI+ 作为 GDI 的后续版本在 Windows XP 中引入。 GDI+ 库是通过包装平面 C 函数的一组 C++ 类访问的。 .NET Framework还在 System.Drawing 命名空间中提供 GDI+ 的托管版本。
- Direct3D 支持三维图形。
- Direct2D 是适用于二维图形的新式 API,是 GDI 和 GDI+ 的继任者。
- DirectWrite是文本布局和光栅化引擎。 可以使用 GDI 或 Direct2D 绘制光栅化文本。
- DirectX 图形基础结构 (DXGI) 执行低级别任务,例如为输出演示帧。 大多数应用程序不直接使用 DXGI。 相反,它充当图形驱动程序和 Direct3D 之间的中间层。
自 Windows 诞生之初,图形编程的主要 API 就是图形设备接口 (GDI)。 此 API 设计用于处理众多 2D 输出设备,是 Windows 用户界面体验的基础。
该图出自微软官方https://learn.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista
新的驱动程序模型——Windows 显示驱动程序模型 (WDDM) 将 GPU 和 Direct3D 带到了最前沿,允许创建一种全新的体验 - 3D 桌面,从而将 GDI 的 2D 世界与现代可编程 GPU 的强大功能完美融合。 借助 WDDM,视频硬件完全由 Direct3D 驱动,所有其他图形接口都通过新的以 Direct3D 为中心的驱动程序模型与视频硬件通信。
该图出自微软官方https://learn.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista
有关 WDDM 的详细信息,请参阅 Windows Vista 显示驱动程序模型 (WDDM) 设计指南。
GDI
图形设备接口 (GDI) 是 Windows 的原始图形接口。 GDI 首先针对 16 位 Windows 编写,然后针对 32 位和 64 位 Windows 进行了更新。
GDI+ 作为 GDI 的后续版本在 Windows XP 中引入。
DXGI
Microsoft DirectX 图形基础结构 (DXGI) 的主要目标是管理可以独立于 DirectX 图形运行时的低级别任务。 DXGI 为将来的图形组件提供通用框架;利用 DXGI 的第一个组件是 Microsoft Direct3D 10。
在早期版本的 Direct3D 中,Direct3D 运行时中包含低级别任务,例如硬件设备的枚举、向输出呈现的帧、控制 gamma 以及管理全屏切换。 这些任务现在在 DXGI 中实现。
DXGI 的目的是与内核模式驱动程序和系统硬件通信,如下图所示。
该图出自微软官方https://learn.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi
应用程序可以直接访问 DXGI,也可以在 D3D11_1.h、D3D11.h、D3D10_1.h 或 D3D10.h 中调用 Direct3D API,以处理与 DXGI 的通信。 如果应用程序需要枚举设备或控制如何将数据呈现给输出,则可能需要直接使用 DXGI。
DirectX/Direct3D
Direct3D 9
Direct3D 9 是 Windows Vista 的主要图形接口
Direct3D 9Ex
Direct3D 9Ex 接口提供了对标准 Direct3D 9 应用程序接口的轻微扩展。 此 API 仅适用于 Windows Vista,并且需要使用 WDDM 驱动程序。 创建新的 Direct3D 9Ex API 的主要原因是,在保持现有 Direct3D 应用程序兼容性的同时,允许完全访问 WDDM 的新功能。
Direct3D 10
WDDM 消除了现有图形系统中对性能的一些限制,而 Direct3D 10 则更进一步,消除了现有 Direct3D API 中的设计瓶颈,并大大简化了 GPU 的编程任务。
为了在 Direct3D 10 中提供这种级别的创新,旧硬件不能作为新接口的部分实现。 显卡要么能支持所有新功能,要么就不是支持 Direct3D 10 的显卡。 因此,Direct3D 9 可以驱动 DirectX7 时代的硬件,但存在许多功能缺失和使用限制,而 Direct3D 10 只能在新一代显卡上运行。 应用程序要支持旧版视频硬件,还必须支持 Direct3D 9 接口。 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 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.1
Windows 8 通过 Direct3D 11.1 扩展了 Direct3D 11 API。 Direct3D 11.1 支持功能级别 11、10_x 和 9_x 的所有现有硬件,以及新的 11_1 功能级别。
Direct3D 12
Direct3D 12 比以前的任何版本都更快更高效,Direct3D 12 提供的硬件抽象级别比以前的版本低。 Direct3D 12 提供更丰富的场景、更多的对象、更复杂的效果,并且能全面利用现代 GPU 硬件。
兼容性
现有图形接口(如 GDI、GDI+ 和旧版 Direct3D)可在 Windows Vista 和 Windows 7 上继续运行,但会尽可能进行内部重映射。Windows Vista、Windows 7 和 Windows 8 继续支持与 Windows XP 相同的 Direct3D 和 DirectDraw 接口,可追溯到 DirectX 第 3 版(Direct3D 的保留模式除外,该模式已被移除)。 与 Windows XP Professional x64 Edition 一样,较新版本 Windows 上的 64 位本地应用程序只能使用 Direct3D9、 或更新的接口。 高性能应用程序应使用 Direct3D 9 或更高版本,以确保与硬件能力最接近。
OpenGL
Windows Vista、Windows 7 和 Windows 8 提供与 Windows XP 相同的 OpenGL 支持,允许显卡制造商为 OpenGL 提供可安装的客户端驱动程序 (ICD),以提供硬件加速支持。 请注意,此类 ICD 需要更新版本才能完全支持 Windows Vista、Windows 7 或 Windows 8。 如果没有安装 ICD,系统在大多数情况下会退回到 OpenGL v1.1 软件层。
OpenGL演进历史:https://neil3d.github.io/3dengine/gl-brief-history.html
DirectX、Direct3D、Direct2D、DXGI的关系
DirectX(Direct eXtension,缩写:DX)是由微软公司创建的一系列专为多媒体以及游戏开发的应用程序接口。
DirectX组成的组件有:
- Direct3D:主要用于绘制3D图形。
- Direct2D:主要提供2D动画的硬件加速,为DirectDraw的替代者。
- DirectWrite:主要字体显示API,提供使用GPU令字体显示更为平滑,类似ClearType(只支持于Windows Vista/7/8/8.1以上)。
- DirectInput:用于结合键盘、鼠标、摇杆,或其它的游戏控制器。
- XInput:主要用于Xbox360的控制器。
- XAudio2:主要用于低延迟游戏音频播放。
- DirectCompute:GPU通用计算API。
- DirectXMath:针对游戏优化的高速数学运算API,特别支持单精度浮点运算及矩阵运算,使用SSE2指令集。
- DirectSetup:用于DirectX组件的安装,以及检查DirectX的版本。
- DirectX Media:包含DirectAnimation可用于2D的网页动画,DirectShow可支持多媒体录音以及资料流媒体,DirectX在网页上的转换,还有Direct3D可保留3D图像更清晰的解析。DirectShow亦包含有DirectX插件用于音频信号处理以及DirectX视频加速加速影音播放。
- DirectX媒体对象化:支持资料流对象,像是编码、解码和效果。
由此可见,DirctX是许多API的一个集合,它里面包含Direct3D和Direct2D。
关于Direct2D、Direct3D和DXGI的关系,直接参考这张图:
即DXGI提供了更底层的接口。
参考
浅谈window桌面GUI技术及图像渲染性能测试实践
浅谈DWM原理
Overview of the Windows Graphics Architecture
Graphics APIs in Windows
DXGI overview