Direct3D

**Direct3D**（簡稱：**D3D**）是微軟公司在 Microsoft Windows 作業系統上所開發的一套 3D 繪圖編程介面，是 DirectX 的一部份，目前廣為各家顯示卡所支援。與 OpenGL 同為電腦繪圖軟體和電腦遊戲最常使用的兩套繪圖編程介面之一。

1995 年 2 月，微軟收購了英國的 Rendermorphics 公司，將 RealityLab 2.0 技術發展成 Direct3D 標準，並整合到 Microsoft Windows 中，Direct3D 在 DirectX 3.0 開始出現。後來在 DirectX 8.0 發表時與 DirectDraw 編程介面合併並改名為 DirectX Graphics。

## 架構

Direct3D 與 Windows GDI 是同層級組件。Direct3D 裝置有二種不同的操作模式：windowed 和 exclusive。在 windowed 模式下，必須使用 back buffer。在 Exclusive 模式下，Direct3D 直接呼叫顯示卡驅動程式，而不通過 GDI。

Direct3D 的抽象概念包括：devices, swap chains 和 resources。

有 4 種 device type，D3DDEVTYPE 定義了裝置類型。

* HAL（hardware abstraction layer）：使硬體加速。
* reference：應用程式請求一個 reference 裝置。
* null reference：當系統沒有裝 SDK，但是應用程式請求一個 reference 裝置的時候，它就返回一個 null reference。
* 可插拔的軟體（Pluggable software）；裝置通過 RegisterDevice 裝置方法提供。

每一個裝置至少要有一個 swap chain. 一個 swap chain 可用來產生一個或多個 back buffer surfaces。彩現目標（render target）也是 back buffer surface。back buffer 是屬於彩現（render）的部份。所有的 back buffer 都是合理的 render target，但是並非所有 render target 都是 back buffer。surface 是一種資源，包含一個矩形集合的像素資料，如 color, alpha, depth/stencil。

資源有 4 個屬性：

* Type：資源的類型，如頂點緩衝區（vexert buffer），或一個彩現目標（render target）。
* Usage：資源的用途，如紋理（texture）或彩現目標，是一系統的旗標所組成，每個旗標佔 1 bits。
* Format：資料的格式，如一個二維表面的像素格式。例如，D3DFMT\_R8G8B8 的值是一個 24 bits 的顏色深度（colour depth，8 bits 是紅色，8 bits 綠色以及 8 bits 是藍色）。
* Pool：資源所分配的內部記憶體空間類型。

## 管道

Direct3D 10 API 定義了 vertices（頂點）, textures（紋理）, buffers（緩衝區），以及 state 群組轉換到螢幕上的流程。這樣的流程被描述成 rendering pipeline（彩現管線），其中有著許多不同的階段. Direct3D 10 彩現管線的各階段包括： are:

1. 輸入組裝（**Input Assembler**）：從程式裡讀取頂點，並將程式提供的資料裝進管線。
2. 頂點著色引擎（Vertex Shader）: 每次處理一個頂點，比如變換、貼圖、光照。
3. 幾何著色器（Geometry Shader）: Shader Model 4.0 引進了幾何著色器，使用 Shader 資源來處理點、線、面的幾何坐標變換，一次最多處理六個點，快速地將模型類似的頂點結合起來進行運算。此一過程無需 CPU 參與。
4. 流輸出（**Stream Output**）：將 Vertex Shader 和 Pixel Shader 處理完成的資料輸出給使用者。
5. 光柵化（**Rasterizer**）: 把算完的頂點轉成像素，再將像素（pixels）輸出給 pixel shader. 這裡亦可執行其他工作，像是切割非視覺性的像素，或者對頂點進行插值以得到像素資料。
6. 像素著色引擎（Pixel Shader）：決定最後要往彩現目標（render targe）寫入的像素顏色，同時也可以計算一個準備寫到深度緩衝區的深度值。
7. 輸出混合（**Output Merger**）：接收來自於 pixel shader 的 slice，進行傳統的 Stencil 測試和 Depth 測試，整併各種不同的輸出資料，用以建立最後之結果。

## 顯示模式

Direct3D 有兩種 display modes:

* 全螢幕模式（Fullscreen mode）: 全螢幕是指畫面全部被 Direct3D 所佔據，不會再顯示其他的視窗畫面。目前市面上發展的遊戲軟體多採用此模式。
* 視窗模式（Windowed mode）: 視窗模式是指可以有多個視窗同時出現在螢幕上。

## 歷史

1992 年，Servan Keondjian 開創 RenderMorphics 公司，成立了一個 Reality Lab 實驗室，專事 3D 圖形技術及 API 技術研究。有兩種版本的 API 被釋出。1995 年 2 月微軟買下 RenderMorphics，由 Keondjian 在 Windows 95 上開發 3D 圖形引擎，主持 Direct3D 專案的開發。

Window 95 推出之時，微軟一口氣發表了 **DirectX 1.0**、**DirectX 2.0** 和 **DirectX 3.0**。DirectX 1.0 推出時，只包括 DirectDraw、DirectPlay、DirectInput、DirectSound 四部分，DirectX 2.0 內附了 Direct 3D，但功能有限，無法與 OpenGL、3dfx 等 API 函式相提並論。1996 年 9 月發布的 Direct 3.0 被認為是 DirectX 的第一套完整版本。不久，DirectX 3.0 更新 3.0a、3.0b，版號從 4.04.00.0068 增加到了「4.04.00.0069」，僅是附加了一個被稱為 Direct3D 的組件，這正是 Keondjian 的傑作。當時的 Direct3D 有兩種模式，一是 Retain 模式，另一個是 Immediate 模式，皆以 COM 建構而成。1996 年 Westwood 工作室發布以 DirectX 開發的即時戰略遊戲《紅色警戒》，大賣 1200 萬套。

**DirectX 4.0** 並未推出就有 **DirectX 5.0**。1997 年 6 月推出 DirectX 5.0，加入 DrawPrimitive API，加入了對 MMX 的支援，不久微軟又推出支援 D3D 加速卡的 DirectX 5.0a 版和 5.1 版、5.2 版。

**Direct3D 6.0**，1998 年秋微軟推出，引進多重貼圖（multitxture）以及 stencil buffer

**Direct3D 7.0** 引進硬體座標轉換以及光影計算（Hardware Transform and Lighting），並支援.dds 檔。

**Direct3D 8.0** 引進了可編程管道（Programable Function Pipeline）的概念，Direct3D 在 8.0 版以前只能工作在固定管道（Fixed Function Pipe-line）的模式下。2001 年微軟正式發表的 Direct3D 8.0 支援處理頂點的 Vertex Shader，以及處理像素的 Pixel Shader。使 Direct3D 的技術正式超越勁敵 OpenGL。DirectX 8 中的著色器是用低階著色器語言（Low Level Shading Language）編寫的。

**Direct3D 9.0** 使用 HLSL（全稱 High Level Shading Language）編寫 Vertex Shader 和 Pixel Shader，有助於著色器的編寫和所產生程式碼的效率，並且大幅地縮短設計時間。Windows Vista 推出 DirectX 的兩種新類型：Direct3D 9Ex 和 Direct3D 10。Direct3D 9Ex 是 DirectX 9 的擴充版，除了 Direct3D 9 外，還增加了 Windows Vista driver 部分新功能的應用程式而設計。Direct3D 9Ex 和 Direct3D 10 均構建於 WDDM 之上。只有透過 WDDM 才能在 Vista 上使用 Direct3D。

## Direct3D 10

Direct3D 10 相對 Direct3D 9 大量代碼重新編寫，Direct3D 10 著眼在高階繪圖程式，所有 render 都要寫 shader。但本質上功能並沒有太大改變，只能算是對舊 XP 時代的問題重新更正，提供更高的可程式化及資源運用，以適合 Vista 使用。

Direct3D 10 新特色：

* 全新的 graphics pipeline：
  * fixed pipeline 皆改成 programmable 的 shader，
  * 增加 geometry shader、stream out，
  * culling、cliping、blending 等 stage 合為 output merger stage
* 新的 resource type: constant buffer、texture array。Texture array 可容許最多 512 個 Texture。
* resource 引進 view 的概念
* guaranteed feature set
* GPU 呈現多工（multitasking）

## Direct3D 10.1

Direct3D 10.1 是 Direct3D 10.0 的小型的更新，2007 年 8 月微軟釋出 Direct3D 10.1 以及 Shader Model 4.1 的測試版本。Direct3D 10.1 規定幾個更多圖像品質標準為圖表供營商，給予開發商對圖像品質（image quality）的更多控制。XAudio 2 將取代 DirectSound，成為最新的跨平台音訊 API。

## Direct3D 11

Direct3D 11 架構於 Direct3D 10 的基礎之上，但相較於 Direct3D 10 只支援 Vista 作業系統，Direct3D 11 更可以支援 Windows 7 及 Windows Vista。Direct3D 11 新增以下的功能：

* 鑲嵌（Tessellation, 即曲面細分）
* 多執行緒彩現（Multithread Render）
* 計算著色器（Compute Shader）：支援 GPGPU，提供新版 HLSL 語言，與 nVidia 的 CUDA 或 OpenCL 功能類似。

其他還有物件導向化的 Shader Model 5 等功能。之前 DirectX 10 還是單執行緒，檔案存取與繪圖指令共享同一個執行緒，容易造成畫面遲緩的現象，與 DirectX 10 相比，Direct3D 11 有了更好的解決方案。

DirectX 11 的 pipeline 新增 Hull Shader、Tessellator、Domain Shader 來實現 tessellation, 可以快速讓成像 3D 的小三角型快速增加。至於 Computer Shader 則是 GPGPU 的實現，以 GPU 的平行處理能力與浮點運算能力來實現 CPU 的運算，能夠同時支援 ATI 以及 Nvidia 的顯示卡，不受繪圖流程的限制。DirectX11 還支援 Intel 的支援 Ray Tracing（光線跟蹤）與 Rasterization（光柵化）技術，使 3D 效果更真實，更加逼真。

以 Direct3D 開發 3D 圖形程式，可以採用 COM inteface，也可以採用.NET Framework 的方式，WPF 會使用 Direct3D 9 與 GPU。Direct3D 11 技術是 DX10.1 的超集，支援 DX11.0、DX10.1/10.0、DX9.3/9.2/9.1 等。

Windows 7 Desktop Windows Manager 將會支援 Direct3D 10.1 API。可將顯示卡帶寬的佔用率降低大約 50%。DirectX 11 可向下相容於 DirectX 10 的顯示卡，同時也能夠在 Windows 7 與 Vista 上執行。

## Direct3D 12

## Direct3D 與 Windows Vista

Vista 引入了 DirectX 的兩種新類型：Direct3D 9Ex 和 Direct3D 10。DirectX 10 僅適用於 Windows Vista，針對 Windows Vista 進行了全新構建，構建於 Vista 顯示器驅動程式模型 (WDDM) 之上，並引入新的硬體模式、繪圖管線和彩現特性，讓開發人員更接近硬體。一些由於遊戲需要 SM 2.0，Vista 將使用 SM 2.0 來彩現桌面。

## 範例

用 Direct3D 9 畫三角形：

用 Direct3D 11 畫三角形：

## 注釋

## 參見

* Wing
* OpenGL
* HLSL
* WDDM

## 外部連結

* DirectX website
* DirectX 10: The Future of PC Gaming（頁面存檔備份，存於網際網路檔案館） Technical article discussing the new features of DirectX 10 and their impact on computer games