Direct3D（簡稱：D3D）是微軟公司在 Microsoft Windows 作業系統上所開發的一套 3D 繪圖程式設計介面，是 DirectX 的一部份，目前廣為各家顯示卡所支援。與 OpenGL 同為電腦繪圖軟體和電腦遊戲最常使用的兩套繪圖程式設計介面之一。 1995 年 2 月，微軟收購了英國的 Rendermorphics 公司，將 RealityLab 20 技術發展成 Direct3D 標準，並整合到 Microsoft Windows 中，Direct3D 在 DirectX 30 開始出現。後來在 DirectX 80 發表時與 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 depthstencil。 資源有 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 40 引進了幾何著色器，使用 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 10、DirectX 20 和 DirectX 30。DirectX 10 推出時，只包括 DirectDraw、DirectPlay、DirectInput、DirectSound 四部分，DirectX 20 內附了 Direct 3D，但功能有限，無法與 OpenGL、3dfx 等 API 函式相提並論。1996 年 9 月釋出的 Direct 30 被認為是 DirectX 的第一套完整版本。不久，DirectX 30 更新 30a、30b，版號從 404000068 增加到了 404000069，僅是附加了一個被稱為 Direct3D 的元件，這正是 Keondjian 的傑作。當時的 Direct3D 有兩種模式，一是 Retain 模式，另一個是 Immediate 模式，皆以 COM 建構而成。1996 年 Westwood 工作室釋出以 DirectX 開發的即時戰略遊戲《紅色警戒》，大賣 1200 萬套。 DirectX 40 並未推出就有 DirectX 50。1997 年 6 月推出 DirectX 50，加入 DrawPrimitive API，加入了對 MMX 的支援，不久微軟又推出支援 D3D 加速卡的 DirectX 50a 版和 51 版、52 版。 Direct3D 60，1998 年秋微軟推出，引進多重貼圖（multitxture）以及 stencil buffer Direct3D 70 引進硬體座標轉換以及光影計算（Hardware Transform and Lighting），並支援dds 檔。 Direct3D 80 引進了可程式設計管道（Programable Function Pipeline）的概念，Direct3D 在 80 版以前只能工作在固定管道（Fixed Function Pipeline）的模式下。2001 年微軟正式發表的 Direct3D 80 支援處理頂點的 Vertex Shader，以及處理畫素的 Pixel Shader。使 Direct3D 的技術正式超越勁敵 OpenGL。DirectX 8 中的著色器是用低階著色器語言（Low Level Shading Language）編寫的。 Direct3D 90 使用 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 101 Direct3D 101 是 Direct3D 100 的小型的更新，2007 年 8 月微軟釋出 Direct3D 101 以及 Shader Model 41 的測試版本。Direct3D 101 規定幾個更多影像質量標準為圖表供營商，給予開發商對影像質量（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 技術是 DX101 的超集，支援 DX110、DX101100、DX939291 等。 Windows 7 Desktop Windows Manager 將會支援 Direct3D 101 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 20，Vista 將使用 SM 20 來渲染桌面。 範例 用 Direct3D 9 畫三角形： A 3vertex polygon definition D3DLVERTEX v 3 Vertex established v 0D3DLVERTEX D3DVECTOR 0f 5f 10f 0x00FF0000 0 0 0 Vertex established v 1D3DLVERTEX D3DVECTOR 0f 5f 10f 0x0000FF00 0 0 0 Vertex established v 2D3DLVERTEX D3DVECTOR 0f 5f 10f 0x000000FF 0 0 0 Function call to draw the triangle pDeviceDrawPrimitive D3DPT_TRIANGLELIST D3DFVF_LVERTEX v 3 0 用 Direct3D 11 畫三角形： struct Vertex float x y z D3DCOLOR color Vertex triangle 0f 5f 10f 0x00FF0000 0f 5f 10f 0x0000FF00 0f 5f 10f 0x000000FF set Flexible Vertex Format pDeviceSetFVF D3DFVF_XYZ D3DFVF_DIFFUSE Draw UP stands for user pointer that is data that is provided through a pointer and not through buffers pDeviceDrawPrimitiveUP D3DPT_TRIANGLELIST 1 triangle sizeof Vertex 注釋 參見 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 Category 計算機圖形學 Category 三維計算機圖形學 CategoryDirectX Category 繪圖函式庫 Category3D 圖形應用程式介面