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