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:

輸入組裝（Input Assembler）：從程式裡讀取頂點，並將程式提供的資料裝進流水線。
頂點著色引擎（Vertex Shader）: 每次處理一個頂點，比如變換、貼圖、光照。
幾何著色器（Geometry Shader）: Shader Model 4.0 引進了幾何著色器，使用 Shader 資源來處理點、線、面的幾何座標變換，一次最多處理六個點，快速地將模型類似的頂點結合起來進行運算。此一過程無需 CPU 參與。
流輸出（Stream Output）：將 Vertex Shader 和 Pixel Shader 處理完成的資料輸出給使用者。
光柵化（Rasterizer）: 把算完的頂點轉成畫素，再將畫素（pixels）輸出給 pixel shader. 這裡亦可執行其他工作，像是切割非視覺性的畫素，或者對頂點進行插值以得到畫素資料。
畫素著色引擎（Pixel Shader）：決定最後要往渲染目標（render targe）寫入的畫素顏色，同時也可以計算一個準備寫到深度緩衝區的深度值。
輸出混合（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 功能類似。

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 畫三角形：

// A 3-vertex polygon definition

D3DLVERTEX v3;

// Vertex established

v0=D3DLVERTEX (D3DVECTOR (0.f, 5.f, 10.f), 0x00FF0000, 0, 0, 0 );

// Vertex established

v1=D3DLVERTEX (D3DVECTOR (0.f, 5.f, 10.f), 0x0000FF00, 0, 0, 0 );

// Vertex established

v2=D3DLVERTEX (D3DVECTOR (0.f, 5.f, 10.f), 0x000000FF, 0, 0, 0 );

// Function call to draw the triangle

pDevice->DrawPrimitive (D3DPTTRIANGLELIST, D3DFVFLVERTEX, v, 3, 0);

用 Direct3D 11 畫三角形：

struct Vertex {float x, y, z; D3DCOLOR color;};

Vertex triangle = {{ 0.f, 5.f, 10.f, 0x00FF0000},

{0.f, 5.f, 10.f, 0x0000FF00},

{0.f, 5.f, 10.f, 0x000000FF}

};

//set Flexible Vertex Format

pDevice->SetFVF (D3DFVFXYZ | D3DFVFDIFFUSE);

// Draw - UP stands for 'user pointer', that is data

//that is provided through a pointer and not through buffers

pDevice->DrawPrimitiveUP (D3DPT_TRIANGLELIST, 1, triangle, sizeof (Vertex));