簡介
Direct 3D是基於微軟的通用對象模式COM(Common Object Mode)的3D圖形API。它是由微軟(Microsoft)一手樹立的3D API規範,微軟公司擁有該庫著作權,它所有的語法定義包含在微軟提供的程式開發組件的幫助檔案、原始碼中。Direct3D是微軟公司DirectX SDK集成開發包中的重要部分,適合多媒體、娛樂、即時3D動畫等廣泛和實用的3D圖形計算。自1996年發布以來,Direct3D以其良好的硬體兼容性和友好的編程方式很快得到了廣泛的認可,現在幾乎所有的具有3D圖形加速的主流顯示卡都對Direct3D提供良好的支持。但它也有缺陷,由於是以COM接口形式提供的,所以較為複雜,穩定性差,另外,目前只在Windows平台上可用。★
Direct3D(簡稱:D3D)是微軟公司在Microsoft Windows作業系統上所開發的一套3D繪圖編程接口,是DirectX的一部分,目前廣為各家顯示卡所支援。與OpenGL同為電腦繪圖軟體和電腦遊戲最常使用的兩套繪圖編程接口之一。
Direct3D的抽象概念包括:devices, swap chains和resources。
有4種device type,D3DDEVTYPE定義了設備類型。
•HAL(hardware abstraction layer):使硬體加速。
•reference:應用程式請求一個reference設備。
•null reference:當系統沒有裝SDK,但是應用程式請求一個reference設備的時候,它就返回一個null reference。
•可插拔的軟體(Pluggable software);設備通過RegisterDevice設備方法提供。
Device
每一個設備至少要有一個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:資源所分配的內部存儲器空間類型。
Pipeline
Graphics pipeline process
Direct3D 10 API定義了vertices, textures, buffers,以及state組群轉換到螢幕上的流程。這樣的流程被描述成rendering pipeline有著許多不同的stages. The different stages of the Direct3D 10 pipelineare:
Input Assembler:從程式里讀取vertex data並將程式提供的vertex buffer倒進pipeline.
頂點著色引擎(Vertex Shader): Performs operations on a single vertex at a time,像是transformations, skinning,或lighting.
幾何著色器(Geometry Shader): Shader Model 4.0引進了幾何著色器,使用Shader資源來處理點、線、面的幾何坐標變換,一次最多處理六個點,快速地將模型類似的頂點結合起來進行運算。此一過程無需CPU參與。
Stream Output:將Vertex Shader和Pixel Shader處理完成的數據輸出給用戶。
Rasterizer: Converts primitives into pixels,再將像素(pixels)輸出給pixel shader. The Rasterizer亦可運行其他工作,像是切割非視覺性的像素,or interpolating vertex data into per-pixel data.
像素著色引擎(Pixel Shader):決定最後的像素顏色(pixel colour)to be written to the render target and can also calculate a depth value to be written to the depth buffer.
Output Merger:接收來自於pixel shader的slice,進行傳統的Stencil測試和Depth測試,整並各種不同的輸出數據,用以創建最後之結果。
1.Input Assembler
2.頂點著色引擎(Vertex Shader): Performs operations on a single vertex at a time,像是transformations, skinning,或lighting.
3.幾何著色器(Geometry Shader): Shader Model 4.0引進了幾何著色器,使用Shader資源來處理點、線、面的幾何坐標變換,一次最多處理六個點,快速地將模型類似的頂點結合起來進行運算。此一過程無需CPU參與。
4.Stream Output
5.Rasterizer
6.像素著色引擎(Pixel Shader):決定最後的像素顏色(pixel colour)to be written to the render target and can also calculate a depth value to be written to the depth buffer.
7.Output Merger
顯示模式
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。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 7Desktop 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->DrawPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, v,3,0);
用Direct3D 11畫三角形:
structVertex{floatx, 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 FormatpDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);// Draw - UP stands for 'user pointer', that is data// that is provided through a pointer and not through bufferspDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1, triangle,sizeof(Vertex));
注釋
^Direct3D Resources -Memory pool.
^Direct3D 9.0 pipeline diagram.
^Direct3D 10 pipeline stages.
^Direct3D 7 introduces DirectDraw Surface (.dds) format.
^HLSL in Direct3D 9.0.
^Microsoft Presents DirectX 10.1 Details at SIGGRAPH. 2007-08-07[2007-08-27].
^DirectX SDK: Direct3D 10.1 Features.
1.^
2.^
3.^
4.^
5.^
6.^
7.^
參見
•WinG
•OpenGL
•HLSL
•WDDM
外部連結
•DirectX website
•DirectX 10: The Future of PC GamingTechnical article discussing the new features of DirectX 10 and their impact on computer games
顯示▼隱藏▲
|
相關事件
1995年2月,微軟收購了英國的Rendermorphics公司,將RealityLab 2.0技術發展成Direct3D標準,並整合到Microsoft Windows中,Direct3D在DirectX 3.0開始出現。後來在DirectX 8.0發表時與DirectDraw編程接口合併並改名為DirectX Graphics。