DirectX

DirectX（Direct eXtension，缩写：DX），是由微软公司建立的一系列专为多媒体以及游戏开发之应用程序界面（API）。旗下包含Direct3D、Direct2D、DirectCompute等等多个不同用途的子部分，因为这一系列API皆以Direct字样开头，所以DirectX（只要把X字母替换为任何一个特定API的名字）就成为这一巨大的API系列的统称。目前最新版本为DirectX 12，随附于Windows 10与Windows 11操作系统之上。

DirectX被广泛用于Microsoft Windows、Microsoft Xbox电子游戏开发，并且只能支持这些平台。除了游戏开发之外，DirectX亦被用于开发许多虚拟三维图形相关软件。Direct3D是DirectX中最广为应用的子模块，所以有时候这两个名词可以互相代称。

DirectX主要基于C++编程语言，并遵循COM架构。

## 元件

DirectX组成的元件有：

- Direct3D：主要用于绘制3D图形。
- Direct2D：主要提供2D动画的硬件加速，为DirectDraw的替代者。
- DirectWrite：主要字体显示API，提供使用GPU令字体显示更为平滑，类似ClearType（只支援于Windows Vista/7/8/8.1以上）。
- DirectInput：用于结合键盘、鼠标、摇杆，或其它的游戏控制器。
- DXGI：为特定图形API与图形内核之间提供了一个映射，从而也能与用户模式的Windows Display Driver Model驱动程序交互。
- XInput：主要用于Xbox360的控制器。
- XAudio2：主要用于低延迟游戏音频播放。
- XACT：音频函数库和引擎，现已不支持Windows。
- DirectCompute：GPU通用计算API。
- DirectXMath：针对游戏优化的高速数学运算API，特别支持单精度浮点运算及矩阵运算，使用SSE2指令集。
- DirectSetup：用于DirectX元件的安装，以及检查DirectX的版本。
- DirectX媒体对象化：支援资料流物件，像是编码、解码和效果。
- DirectML：利用GPU加速的机器学习和人工智能 API。
- DirectX Raytracing：实时光线追踪API。
- DirectSR：由GPU提供的实时图像缩放技术，可允许开发者更方便的调用DLSS、FSR、XeSS等API。
- DirectStorage：一种允许GPU直接读取NVMe设备的API，已在Xbox上实现。
- Media Foundation：为Windows平台提供统一的多媒体影音解决方案，取代了DirectX Media。

### 废弃元件

这些元件曾经也是DirectX的一员，但现在微软只提供最低程度的维护，也不再建议使用。

- DirectDraw：用于绘制2D图形（不建议使用，虽然目前仍有大量的使用者），已被Direct2D取代。
- DirectInput：用于结合键盘、鼠标、摇杆，或其它的游戏控制器，自8.0之后就不再更新，从DirectX 9开始在XBOX内由XInput取代。
- DirectPlay：用于网络游戏连线沟通，配合DirectInput使用，自8.0后就不再更新。
- DirectSound：用于录音，记录波形音效已被XAudio2取代。
- DirectMusic：用于DirectMusic Producer的录音。
- DirectX Media：包含DirectAnimation可用于2D的网页动画，DirectShow可支援多媒体录音以及资料流媒体，DirectX在网页上的转换，还有Direct3D可保留3D图像更清晰的解析。DirectShow亦包含有DirectX插件用于音频信号处理以及DirectX视频加速加速影音播放，已被Media Foundation取代。

## 历史

1994年末，微软即将推出新一代操作系统Windows 95。决定新操作系统的最终价值的因素在于究竟新系统能运行哪些程序。微软的三个员工：Craig Eisler、Alex St. John、Eric Engstrom十分关心这个问题，因为不少游戏程序员更喜欢在DOS系统下编写游戏，这意味着，没有多少人愿意为WIN95编写游戏，新操作系统不会获得多少成功。

DOS允许直接访问显卡、键盘、鼠标、声卡以及其他系统硬件设施。而Windows 95出于保护存储系统的目的，限制了对硬件的直接访问，取而代之的是一套更加规范标准的访问方法。微软需要一种方法让程序员在WIN95中也能编写出高效的程序。此时，离新系统发布不到几个月了。St. John和Engstrom联合解决了这个问题，他们将解决方案称为DirectX。

DirectX的第一个版本作为Windows Games SDK发布于1995年9月，它作为Windows API的一部分用以替换Windows 3.1中的DCI和WinGAPI。ATI的一个开发团队为微软带来了基本的游戏图像技术，微软方面，DirectX由专门的团队负责开发，Eisler为团队领导，而St. John和Engstrom则成为主程序设计师。

DirectX出现之前，微软已经将OpenGL包括在Windows NT系统中，而在当时，OpenGL对硬件要求严苛，这限制了一些工程师和CAD用户。Direct3D就作为OpenGL的代替品被加入DirectX。随着硬件技术的发展，OpenGL成为行业标准，一场“战役”发生在DirectX的支持者和OpenGL的支持者之间，而且前者只支持Windows平台，而后者支持多平台。在实际应用中，游戏开发者常常两者同时使用，因为DirectX支持许多OpenGL所不支持的功能，比如音效和输入装置。而选择混合使用OpenGL和OpenAL的队伍也在壮大。

由此衍生出的“特别DirectX”也作为微软Xbox和Xbox 360的图形API，这套API由微软和NVIDIA公司共同开发，Xbox API和DirectX 8.1比较相似，但跟其他主机科技一样不能更新，Xbox版本也叫做DirectXbox，但由于商业销售缘故，还是被简称为Xbox。

2002年，微软发布了DirectX 9，它支持最新的顶点阴影着色器2.0版本，又于2004年4月将shader model 3.0（SM 3.0）加入了DirectX 9.0c。

2005年4月，DirectShow从DirectX移除，加入到Microsoft Platform SDK。

2010年6月7日发布的DirectX SDK是最后独立发布的SDK版本，之后的DirectX SDK被整合进新版的Microsoft Windows SDK里。例如DirectX 11.2 SDK被放在Windows Software Development Kit (SDK) for Windows 8.1里。

### 发布历史

DirectX版本｜版本编号｜操作系统｜日期｜备注

DirectX 1.0｜4.02.0095｜1995年9月30日

DirectX 2.0｜未知｜1996年

DirectX 2.0a｜4.03.00.1096｜Windows 95和NT 4.0｜1996年6月5日

DirectX 3.0｜4.04.00.0068｜1996年9月15日

4.04.00.0069｜之后的DirectX 3.0加入了Direct3D 4.04.00.0069｜1996年

DirectX 3.0a｜4.04.00.0070｜Windows NT 4.0 SP3 ｜1996年12月｜最后支持Windows NT 4.0的版本

DirectX 3.0b｜4.04.00.0070｜1996年12月｜3.0a的一个小更新纠正了一个日文版本下的漏洞

DirectX 4.0｜从未发布

DirectX 5.0｜4.05.00.0155 (RC55)｜Windows NT 5.0的测试版本｜1997年7月16日

DirectX 5.2｜4.05.01.1600 (RC00)｜为Windows 95发布的版本｜1998年5月5日

4.05.01.1998 (RC0)｜只用于Windows 98｜1998年6月25日

DirectX 6.0｜4.06.00.0318 (RC3)｜Windows CE上的Dreamcast版本｜1998年8月7日

DirectX 6.1｜4.06.02.0436 (RC0)｜1999年2月3日

DirectX 6.1a｜4.06.03.0518 (RC0)｜只用于Windows 98 SE｜1999年5月5日

DirectX 7.0｜4.07.00.0700 (RC1)｜1999年9月22日

4.07.00.0700｜Windows 2000｜2000年2月17日

DirectX 7.0a｜4.07.00.0716 (RC0)｜2000年3月8日

4.07.00.0716 (RC1)｜2000年

DirectX 7.1｜4.07.01.3000 (RC1)｜只用于Windows Me｜2000年8月14日｜2D与3D元件分离的最后一版（IDirectDraw7与IDirect3D7）

DirectX 8.0｜4.08.00.0400 (RC10)｜2000年11月12日｜2D与3D元件整合的第一个版本（IDirectGraphic8）与Vertex Shader与Pixel Shader

DirectX 8.0a｜4.08.00.0400 (RC14)｜最后支持Windows 95的版本｜2001年2月5日

DirectX 8.1｜4.08.01.0810｜Windows XP，Windows Server 2003和Xbox特别版｜2001年10月25日

4.08.01.0881 (RC7)｜这个版本用于更早的操作系统（Windows 98, Windows Me和Windows 2000）｜2001年11月8日

DirectX 8.1a｜4.08.01.0901（RC?）｜2002年｜这个版本升级了Direct3D（D3d8.dll）

DirectX 8.1b｜4.08.01.0901 (RC7)｜2002年6月25日｜这个版本修正了DirectShow在Windows 2000上的一个漏洞（Quartz.dll）

DirectX 8.2｜4.08.02.0134 (RC0)｜和DirectX 8.1b一样，但包含了DirectPlay 8.2｜2002年

DirectX 9.0｜4.09.00.0900 (RC4)｜2002年12月19日｜（IDirectGraphic9）与HLSL

DirectX 9.0a｜4.09.00.0901 (RC6)｜2003年3月26日

DirectX 9.0b｜4.09.00.0902 (RC2)｜2003年8月13日

DirectX 9.0c｜4.09.00.0903｜只用于Windows XP SP2

4.09.00.0904 (RC0)｜2004年8月4日

4.09.00.0904｜Windows XP SP2，Windows Server 2003 SP1，Windows Server 2003 R2和Xbox 360｜2004年8月6日

DirectX 9.0c - 双月更新｜4.09.00.0904 (RC0)｜2006年10月更新是最后支持Windows 98、Windows Me和Windows 2000的版本。2005年12月更新和2006年2月更新增加了对XML的支持｜两月更新一次，开始于2004年10月，直到现在，最新版本：DirectX 9.0c Redist Jun 2010（2010年6月）

DirectX 10.0｜6.00.6000.16386｜Windows Vista｜2006年11月30日｜开始导入DXGI（DirectX Graphics Infrastructure）架构

DirectX 10.1｜6.00.6001.18000｜Windows Vista Service Pack 1与Windows Server 2008｜2008年2月4日

DirectX 11｜6.01.7600.16385｜Windows 7，Windows Server 2008 R2｜2009年7月22日｜与Windows 7 RTM一同释出

6.01.7601.17514｜Windows 7 SP1，Windows Server 2008 R2 SP1｜2010年11月23日｜KB976932，与Windows 7 SP1一同释出

6.00.6002.18107｜Windows Vista SP2，Windows Server 2008 SP2｜2009年10月26日｜KB971512

DirectX 11.1｜6.02.9200.16384｜Windows 8｜2012年10月26日｜与Windows 8一同释出，Windows 7 SP1升级后部分支持

DirectX 11.2｜6.03.9600.16384｜Windows 8.1、Windows RT 8.1、Windows Server 2012 R2｜2013年10月18日｜包含于操作系统，无独立程序包

DirectX 12｜10.00.10240.16384｜Windows 10｜2015年1月18日｜包含于操作系统，无独立程序包，并支持Xbox One

DirectX 12 Ultimate｜10.00.19041.0928｜Windows 10 build 19042｜2020年11月10日｜加入DirectX Raytracing Tier 1.1 光线追踪，VRS（可变速率着色），Mesh Shader，Sampler Feedback（取样器反馈）

## 兼容性

硬件制造商要为每款硬件产品编写驱动程序来支持DX，甚至一些硬件商只编写DX的驱动，这意味着要使用这款硬件就必须安装DX，早期的DirectX版本自带了所有支持DX硬件的驱动程序，后来用户可以通过自动更新系统下载适合的驱动。

DX10之前的所有DirectX版本都保持向下相容性，即新版本相容旧版本，例如安装了DX9的电脑，依然可以执行由DX6编写的程式码。安装了DX11/12的电脑，依然可以执行由DX9C编写的程式码，不过小部分依然需要安装DX9C。

## 各种版本

### .NET Framework

2002年间，微软发布一个兼容.NET Framework的DX版本，因而允许程序员充分利用.NET的特性编写DX程序，这套API被称为Managed DirectX（MDX）。2005年微软在DirectX 9.0c版本上开发一套正对.NET平台的Managed API，即Direct 9.0 for Managed Code 1.0（简称Managed DirectX）。

2005年12月、2006年2月、4月、8月，微软相继发布DirectX的更新版本，使之支持.NET 2.0框架。然而.NET 2.0版本至今只是个测试版。

GDC 2006期间，微软终止开发Managed DirectX，改推出了XNA framework，是一组基于Managed DirectX，帮助程序员更轻松的编写游戏的框架，将DirectX，Shader，高级着色器语言（HLSL）以及其他工具整合到一起。2006年12月11日，微软对Windows XP提供免费的XNA Game Studio Express RTM的下载服务。

### DirectX 10

Windows Vista及以上的操作系统才支持DirectX 10（也就是说，DirectX 9是最后一个支援Windows XP的版本），比起之前的版本，DX10做了重大的变动：增加了XInput用以处理XBOX 360手柄的支持，DirectSound将被XACT替换。DirectX 10也减少了对音效硬件加速的支持，更多的使用CPU来运算音效。

Direct3D 10.1是DirectX 10的改进版，随Vista SP1发布。

### DirectX 11

DirectX 11是DirectX 10的改良，只对效能和扩展性进行最佳化，主要改进在提供Shader Model 5.0，加入对MSAA的直接采样控制。大幅改进多执行绪效能，提供三个独立的界面。进一步提高纹理压缩，镶嵌（tessellation）处理的效能，并加入Compute Shader（DirectCompute）来支援GPGPU，提供新版HLSL语言。

DirectX 11.1是DirectX 11的改进版，随Windows 8发布。Windows 7 SP1升级后部分支持。

DirectX 11.2是DirectX 11.1的改进版，随Windows 8.1发布。

### DirectX 12

DirectX 12将更好支援多核心、多执行绪的最佳化，降低GPU处理瓶颈，并强化跨平台功能，可有效支援微软各式平台，并提升硬件功耗表现。随Windows 10 出货并支持Xbox One。

2019年3月13日，微软于DirectX Developer Blog表示，未来魔兽世界8.1.5的游戏更新将使Windows 7 平台用户也能体验 DirectX 12的多线程渲染优势，并提高游戏效能。且未来陆续也会有其他厂商推出相关更新，将更多的 D3D12 游戏移植到 Windows 7。

## DirectX标志的变更

纵观DX的各个版本，X都是一个核辐射警告标志或一只螺旋桨叶片。这个设计引发了不小的争议，因为DX计划的原名叫做“曼哈顿计划”，这个名称来源于美国的核武器研制计划，最终美国使用核武器轰炸了日本的广岛和长崎，这在暗示DX产品要替代日本在电子游戏方面的霸主地位。这一说法被微软公开否定，微软表示这只是出于艺术设计的考虑。

## 其他API

- Metal
- Mantle
- SDL
- OpenMAX
- OpenML
- OpenGL
- OpenAL

## 外部链接

- Microsoft's MSDN文档&资源中心
- DirectSetup Documentation
- GameDev'关于DX的资料
- OpenGL 3 & DirectX 11: The War Is Over: Introduction - Tom's Hardware
- 中关村在线 - 见证3D进化之路－DirectX发展历史回顾
- DirectX知识库 / 程式设计俱乐部

## 基本资料

- 内置于：Windows 95 OSR2、Windows NT 4.0、及之后所有版本
- 类型：应用程序接口
- related_components：Direct2D、Direct3D、DirectWrite、XAudio2、XInput