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。




目录






  • 1 架構


  • 2 管道


  • 3 顯示模式


  • 4 歷史


  • 5 Direct3D 10


  • 6 Direct3D 10.1


  • 7 Direct3D 11


  • 8 Direct3D 12


  • 9 Direct3D 與 Windows Vista


  • 10 範例


  • 11 注釋


  • 12 參見


  • 13 外部連結





架構




抽象層


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設備方法提供。




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[1]:资源所分配的内部記憶體空间类型。



管道




Graphics pipeline process


Direct3D 10 API定義了vertices(顶点), textures(纹理), buffers(缓冲区),以及state群組轉換到螢幕上的流程。這樣的流程被描述成rendering pipeline(渲染流水线),其中有著許多不同的阶段. Direct3D 10 渲染流水线的各阶段包括:[2] are:[3]



  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.0DirectX 2.0DirectX 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檔[4]


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[5],有助於著色器的編寫和所產生程式碼的效率,並且大幅地縮短設計時間。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)的更多控制[6][7]。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畫三角形:


 // A 3-vertex polygon definition
D3DLVERTEX v[3];
// Vertex established
v[0]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x00FF0000, 0, 0, 0 );
// Vertex established
v[1]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x0000FF00, 0, 0, 0 );
// Vertex established
v[2]=D3DLVERTEX( D3DVECTOR(0.f, 5.f, 10.f), 0x000000FF, 0, 0, 0 );
// Function call to draw the triangle
pDevice->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 },
{ 0.f, 5.f, 10.f, 0x000000FF }
};
// set Flexible Vertex Format
pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
// 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));


注釋





  1. ^ Direct3D Resources - [[Memory pool]]. (原始内容存档于2008-05-09).  网址-维基内链冲突 (帮助)


  2. ^ Direct3D 9.0 pipeline diagram. 


  3. ^ Direct3D 10 pipeline stages. 


  4. ^ Direct3D 7 introduces DirectDraw Surface (.dds) format. 


  5. ^ HLSL in Direct3D 9.0. (原始内容存档于2010-08-27). 


  6. ^ Microsoft Presents DirectX 10.1 Details at SIGGRAPH. 2007-08-07 [2007-08-27]. (原始内容存档于2007-09-09). 


  7. ^ DirectX SDK: Direct3D 10.1 Features. 




參見



  • 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





Popular posts from this blog

Y

Mount Tamalpais

Indian Forest Service