Direct3D

Direct3D是微軟公司在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定義了裝置型別。每一個裝置至少要有一個swap chain.一個swap chain可用來產生一個或多個back buffer surfaces。渲染目標的部份。所有的back buffer都是合理的render target，但是並非所有render target都是back buffer。surface是一種資源，包含一個矩形集合的畫素資料，如color, alpha, depth/stencil。資源有4個屬性：管道.Direct3D 10 API定義了vertices，其中有著許多不同的階段. Direct3D 10 渲染流水線的各階段包括： are:顯示模式.Direct3D有兩種display modes:歷史.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年秋微軟推出，引進多重貼圖以及stencil bufferDirect3D 7.0引進硬體座標轉換以及光影計算，並支援.dds檔。Direct3D 8.0引進了可程式設計管道編寫的。Direct3D 9.0使用HLSL編寫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新特色：Direct3D 10.1.Direct3D 10.1是Direct3D 10.0的小型的更新，2007年8月微軟釋出Direct3D 10.1以及Shader Model 4.1的測試版本。Direct3D 10.1規定幾個更多影象質量標準為圖表供營商，給予開發商對影象質量的更多控制。XAudio 2 將取代DirectSound，成為最新的跨平臺音訊API。Direct3D 11.Direct3D 11架構於Direct3D 10的基礎之上，但相較於Direct3D 10只支援Vista作業系統, Direct3D 11更可以支援Windows 7及Windows Vista。Direct3D 11新增以下的功能：其他還有物件導向化的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技術，使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 與 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 definitionD3DLVERTEX v[3];// Vertex establishedv[0]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x00FF0000, 0, 0, 0 );// Vertex establishedv[1]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x0000FF00, 0, 0, 0 );// Vertex establishedv[2]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x000000FF, 0, 0, 0 );// Function call to draw the trianglepDevice-&gt;DrawPrimitive( D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, 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 },// set Flexible Vertex FormatpDevice-&gt;SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);// Draw - UP stands for 'user pointer', that is data// that is provided through a pointer and not through bufferspDevice-&gt;DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, triangle, sizeof(Vertex));