Direct3D
Direct3D
由微軟公司所制定的3D規格界面,與Windows 95和Windows NT操作系統兼容性好,可繞過圖形顯示介面(GDI)直接進行支持該API的各種硬體的底層操作,大大提高了遊戲的運行速度。
Direct3D 界面
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:資源所分配的內部存儲器空間類型。
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 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.0的小型的更新,2007年8月微軟發布Direct3D 10.1以及Shader Model 4.1的測試版本。Direct3D 10.1規定幾個更多圖像質量標準為圖表供營商,給予開發商對圖像質量(image quality)的更多控制。XAudio 2將取代DirectSound,成為最新的跨平台音頻API。
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上運行。
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
顯示▼隱藏▲ 查 論 編 微軟應用程序開發介面與框架 圖形介面 桌面窗口管理器·DirectX· Direct3D·GDI·WPF·Windows色彩系統·Windows Image Acquisition·Windows Imaging Component 音樂與音效 DirectSound·DirectMusic·DirectX外掛·XACT·Speech API 多媒體 DirectShow·DirectX Media Objects·DirectX Video Acceleration·Windows Media·Media Foundation·Image Mastering API·Video for Windows Web MSHTML·微軟XML剖析器·RSS Platform·JScript·VBScript·瀏覽器協助工具對象·XMLHTTP·SideBar小工具·TypeScript 數據訪問 數據訪問組件集·延伸存儲引擎·(Entity Framework) ·WCF Data Services·Microsoft Sync Framework·Jet資料庫引擎·OLE DB 網路 Winsock(LSP) ·Winsock Kernel·Filtering Platform·網路驅動程序介面規格(NDIS)·Windows Rally·智能型背景傳輸服務·Windows Vista 對等通信 API·Active Directory Service Interface 通信 信息 API·電話 API 管理 Win32 console·Windows Script Host·WMI·Windows PowerShell·工作調度程序·Offline Files·Shadow Copy·Windows Installer·Windows錯誤回報·事件記錄器·Common Log File System 組件與模型 COM·COM+·ActiveX·Distributed COM·.NET Framework 庫 MFC·ATL·WTL 驅動程序開發 Windows Driver Model(Broadcast Driver Architecture) ·Windows Driver Foundation(KMDF·UMDF) 安全性 Crypto API(CAPICOM) ·Windows CardSpace·Data Protection API·Security Support Provider Interface .NET .NET Framework·AJAX·Remoting·WPF·WF·WCF·Windows CardSpace·XNA·Silverlight·Task Parallel Library 軟體工廠 EFx Factory·Enterprise Library·複合用戶界面·CCF·CSF 進程間通信 MSRPC·具名管道·內存映射檔·動態數據交換·MailSlot 可協助性 Active Accessibility·用戶界面自動化 文字與多語系支持 Text Services Framework·Text Object Model·輸入法編輯器·語言介麵包·多語系用戶界面·Uniscribe 遊戲開發 Direct3D·D3DX·DirectSound·DirectInput·DirectPlay·DirectMusic·Managed DirectX·Microsoft XNA |
1995年2月,微軟收購了英國的Rendermorphics公司,將RealityLab 2.0技術發展成Direct3D標準,並整合到Microsoft Windows中,Direct3D在DirectX 3.0開始出現。後來在DirectX 8.0發表時與DirectDraw編程介面合併並改名為DirectX Graphics。