DirectX--昨天、今天、明天

現在遊戲的種類與數量幾乎呈爆炸式增長,遊戲的製作水平也不斷提高,那麼玩家在欣賞遊戲中那絢麗的效果時,有沒有想過是什麼造就了這一切呢?這就是DirectX!DirectX這個詞對玩家來說似乎並不陌生,現在的很多遊戲說明裏都有“該遊戲需要DirectX….以上版本支持”此類的話,甚至3DS Max啓動時的加速模式選項中也有DirectX身影。那麼DirectX究竟是什麼呢?現在就讓我們揭開它面上這層神祕的面紗,一探究竟吧。

一、初識DirectX
DirectX是Microsoft開發的基於Windows平臺的一組API,它是爲高速的實時動畫渲染、交互式音樂和環境音效等高要求應用開發服務的。從Windows 95開始,人們就開始接觸DirectX2.0,WindowsNT4.0裏面則是DirectX3.0a,但是沒有DirectX4的版本。到了Windows98,它就是Windows家族操作系統中不可缺少的核心成員之一。Windows 98中集成了DirectX5,Windows2000中集成了DirectX 6,Windows Me中集成了DirectX 7,而Windows XP天生就帶了DirectX 8.1。

微軟開發了DirectX標準平臺,並且根據硬件製造廠商和遊戲廠商合作共同更新升級DirectX的標準。硬件製造商按照此標準研發製造更好的產品,遊戲開發者根據這套標準開發遊戲。也就是說,無論硬件是否支持某種特效,只要DirectX標準中有,遊戲開發者就可以把它寫到遊戲中,當這個遊戲在硬件上運行,如果此硬件根據DirectX標準把這個效果做到了此硬件驅動程序中,驅動程序駕馭其硬件算出結果,用戶就可以欣賞到此效果。這就是“硬件設備無關性”,是DirectX真正意義所在。

通常,Windows對硬件訪問的管制非常嚴格,用通常的辦法不易訪問,但DirectX通過“硬件抽象層(HAL)”給予了開發人員直接訪問硬件的能力,HAL不僅解決了硬件及兼容性問題,而且開發人員可以利用它直接訪問計算機的某些硬件設備,例如顯示設備的直接顯存控制和渲染,鍵盤、鼠標和遊戲杆的控制的直接訪問控制,音頻設備的直接音頻混合與輸出能力等等,因此開發人員可以充分利用硬件加速將程序的性能優化到一個新的高度,如果目標機器不支持相應的硬件加速,DirectX還可以仿真加速器以提供強大的多媒體環境。DirectX家族包含的成員有Direct3D、DirectDraw、DirectInput、DirectMusic、DirectPlay、DirectSound和DirectShow。

二、DirectX全家福

通過上面的介紹,相信讀者對DirectX已經有一個大概的瞭解。下面就讓我們逐一認識它們吧。

1、Direct3D、DirectDraw和DirectGraphics
DirectDraw是DirectX家族中的元老,它爲高速的2D渲染提供了良好的支持,由於其具備直接顯存訪問和位快傳送的能力,使得2D圖形的繪製速度相對GDI有了一個質的飛躍,其渲染速度甚至有上百倍的差距。在現在回憶當初玩“紅色警戒”和“Diablo”的時候,大家可不要忘了DirectDraw的功勞。

DirectDraw在DirectX3.0時就已經接近極致,但是隨着PC圖形技術的飛速發展,人們逐漸不再滿足於2D的圖形效果,而通過2D技術實現僞3D模擬又非常損失效率,這種需求直接導致了Direct3D的誕生,早期的Direct3D技術不甚完善,相對於2D技術還有一定的差距,直到圖形加速卡支持硬件3D特效後,Direct3D才逐漸步入正軌,慢慢顯示出它的性能優勢來。下面讓我們來回顧一下歷史,看看

Direct3D的“成長過程”:
DirectX6中的Direct3D添加了如下新特性:
* 幾何形體的靈活頂點格式定義
* 幾何形體的頂點緩衝存儲
* 支持多紋理渲染
* 自動紋理管理
* 可選深度緩衝(使用Z Buffer或W Buffer)
* 通過凹凸環境貼圖(BUMPENVMAP)爲反光面和水波特效提供逐像素的渲染和貼圖能力

DirectX7中的Direct3D添加了以下新特性:
* 硬件座標轉換和燈光(T&L)支持
* 立方體表面的環境貼圖
* 幾何渲染
* 改進的紋理渲染
* 自動紋理座標生成、紋理轉換、投影紋理和任意麪裁剪
* D3DX實用庫
* 支持Intel MMX架構、Intel單指令多數據流(SIMD)、SSE?和 AMD? 3DNow?架構。

DirectX的版本到了8.0的時候,雖然它依然保持着向前的兼容性,但是它的結構發生了巨大的變化,3D圖形處理技術逐漸統一在Vertex Shader和Pixel Shader。Vertex Shader被用來描述和修飾3D物體的幾何形狀,同時也用來控制光亮和陰影;Pixel Shader則用來操縱物體表面的色彩和外觀。Direct3D和DirectDraw合二爲一,DirectX家族誕生了一個新的成員-----DirectGraphics。同時也增添了很多令人激動的特性:
* 完全集成DirectDraw與Direct3D
簡化程序初始化過程並提高數據分配和管理的性能,這將減少內存消耗。同時,集成後的圖形應用編程接口(API)允許並行的頂點輸入流以達到更加靈活的渲染。
* 可編程頂點處理語言
允許你編寫定製的着色器,如變形和漸變動畫,矩陣調色板蒙皮,用戶定義的光照模型,一般環境映射,可編程幾何體或者任何其他開發者定義的算法。
* 可編程像素處理語言
允許你編寫定製的硬件着色器,例如通用紋理組合公式,逐像素光照(凹凸貼圖),適用於實現照片(真實)級鏡面效果的逐像素環境貼圖或者任何其他開發者定義的算法。
* 支持多重採樣渲染
允許全場景反走樣和多重採樣效果,例如運動模糊及景深(鏡頭的聚焦效果)。
* 點精靈
允許高性能的粒子系統渲染,例如火花、爆炸、雨、雪等等。
* 3-D空間紋理
允許範圍衰減,實現逐像素級光照及空間大氣效果,甚至是更復雜的幾何圖形應用。
* 支持高維圖元
對來自主要的3-D創作工具的3-D內容,增強其外觀並簡化內容映射。
* 高級技術
包含了用於輸出Direct3D蒙皮網格的三維內容創建工具插件,使用了Direct3D多種不同技術,多分辨率層次細節(LOD)幾何,還有高維表面數據。
* 索引頂點混合
擴展了幾何混合的支持,允許通過指定使用一個矩陣索引把矩陣應用於頂點混合處理。
* 擴充了Direct3DX實用庫
包含了大量的新函數。Direct3DX實用庫是一個位於Direct3D之上的輔助層,用於簡化3-D圖形開發者的常規工作。它包括了一個蒙皮庫,支持對網格的操作,還有組裝頂點與像素着色器的功能。
DirectX每一次升級都會有重大的內核結構改變,它會給我們帶來巨大的視覺衝擊。DirectX7核心的T&L引擎到DirectX9乾脆被拋棄了。因此對於圖形芯片開發商、遊戲開發商以及廣大用戶而言,DirectX 9的確是一項“絕無僅有的優越圖形技術”。DirectX 9“具有多項令人興奮的全新功能特徵”:
Direct3D圖形渲染管道
* Vertex Shader 2.0和Pixel Shader 2.0
在DirectX9中,Vertex Shader和Pixel Shader的版本升級到了2.0,它們都支持64或甚至128位浮點色彩精度。浮點色彩在動態和精度上的增加給圖像質量帶來質的飛躍,這樣在DirectX9中你可以輕易實現電影級別般逼真的效果!
DirectX8和DirectX9的對比參數:


Vertex Shader 2.0引入了流程控制,增加了條件跳轉、循環和子程序。Vertex程序現在最多可以由1024條指令組成(之前只能用128條指令),增加的指令帶來更加複雜和強大的表現,新的操作如正弦、餘弦及其他強大的函數運算大大簡化了代碼的編寫,並且能夠表現更加複雜的效果。
 
Vertex Shader 1.0 **************************VertexShader 2.0

強大的可編程Pixel Shader是實現具有電影質量級別效果的真正精華所在。Pixel Shader 2.0可以支持高級程序語言和彙編語言,開發人員還可以將其彙編代碼嵌入較高級的程序語言中。前一版的Pixel Shader語言被限制爲只能使用最多6個材質和28條指令,而2.0版則將這一上限提升至最大16材質和160條指令,也新增了很多強化的運算和操作。

Pixel Shader 1.4

Pixel Shader 2.0

此外各種Shader工具的大力協助,如nVidia的Cg語言和ATI的RenderMonkey,使得實時圖形渲染的質量飛速提高,nVidia和ATI官方的Demo就足以說明這一點。DirectX9中也改進了部分接口定義,Vertex Shader和Pixel Shader分別單獨提供了一個接口,而且提供了常見圖形的繪製接口,如線段的繪製等,這進一步減輕了開發人員的負擔。

* 浮點型色彩和32位幀緩衝格式

目前大多數色彩表示法(如RGB)用8位整數表示紅、綠、藍色,也許對於顯示來說這已經足夠了,但在運算中似乎還遠不夠。由於整數沒有小數部分,因此當它們經過Pixel Shader極其複雜的數學運算後,就會產生較大的誤差,這可能導致色彩明顯失真。而DirectX9支持數種浮點色彩格式,使得其精度有了很大提高。同時DirectX9支持精確到每像素32位的幀緩衝格式,能夠表現出4倍於目前亮度等級的數量,這使得圖像看上去更加清晰和自然。

除此以外,DirectX9還提供位移貼圖(displacement maps)以及改進的設備模擬等特性的支持,並且毫無意外地,DirectX9 SDK中也進一步擴展了Direct3DX實用庫,提高了開發效率。
2、DirectSound、DirectMusic和DirectX Audio

在DirectX中DirectSound和DirectMusic可以統稱DirectX Audio。一個好的遊戲是不能沒有聲音的,DirectX Audio負責了遊戲中的音效控制。不僅僅是遊戲,很多需要高質量音效的地方都有它們的影子,我們經常在一些播放軟件的設置面板中看見是否使用DirectSound支持的選項。

DirectX Audio做的不僅僅只是簡單地對聲音的回放。它提供了一個完整的系統,能夠利用硬件加速的功能動態地操縱控制音軌和聲道(soundtrack)。

如果你想在你的程序中使用DirectMusic和DirectSound,你就能夠獲得以下功能:
* 讀入且播放例如MIDI, WAVE, 以及DirectMusic Producer run time等格式的聲音文件。
* 同時對多個聲音資源進行混音播放。
* 對播放的聲軌進行高精度時間控制。
* 可以動態地變更播放節拍與節奏,甚至實時地動態控制一些MIDI事件。
* 使用DLS合成器(DirectX Audio自帶的波表合成器),你的程序就可以確保在不同的計算機上聽到相同的MIDI聲音。你的程序能夠播放不受類別限制,各試各樣樂器的聲音,使用DirectX Audio,你甚至還能夠創造出獨一無二的樂器聲音類別並將它發佈。
* 把聲音做3D定位,創造出3D的環境聲響。
* 可以非常容易地實現例如變調、迴響,以及別的聲音特效。
* 能使用數量超過16個的MIDI音軌。DirectX Audio突破了從前只能使用16個MIDI音軌的限制,它把同時回放大數量的音軌變成爲了可能,而這個數量僅僅只是受到了你的聲音硬件合成器能力的限制。
* 播放位於不同的Audiopaths上的聲音段(segments),效果就可以各自實現在每一段聲音裏。
* 實現在不同的端口(port)之間捕捉MIDI數據及流("thru")。
* 從話筒或者別的輸入設備中捕捉聲音數據。

如果使用DirectMusic Producer或類似程序中的源文件,你還能夠做到
* 在聲音的回放期間能夠做更多的控制,例如動態選擇不同的音效變化器(variations)或切換不同的和旋級數。
* 精確地定時重放音樂。
* 利用變化器(variations)播放聲音(wave)
* Audiopaths利用Map performance channels可以使相同的聲音段在channel的不同部分產生完全不同的播放效果。
* 動態地創造出全新的音樂片段,這不需要專門算法庫,僅僅需要你的作曲能力而已。
* 動態地將存在的音樂片段進行組合過渡。
* 在聲音回放時端,程序可以獲得存在於特殊節拍點的各類聲音特效的信息。

這些功能適用於常常只使用主音頻流(mainstream)的程序。如果程序只要實現一些基本簡單的功能,開發者將DirectX Audio設計得非常易用,很適合初學者。DirectX Audio也是可擴展的。好的程序可以利用虛函數(virtual)繼承設計出新的類,例如:

* 支持新的聲音格式文件。
* 音軌可以包含各類數據。
* 處理信息的工具 - 比方說,可以截取記錄實現變換,或者將要顯示的歌詞置入聲音片段文件。
* 自定義的音序器(sequencer)。
* 自定義的合成器(synthesizer)。
* 效果過濾器。(Effects filters)。

值得一提的是,在DirectX9中加入了DirectMP3和DirectCD兩個功能模塊,它們使得主流的音頻播放也能夠通過DirectX與其調用程序更好地結合在一起。

3、 DirectInput

在DirectX這個大家族中,DirectInput掌管着“行爲控制權”。與Winodows事件響應相比,DirectInput可以直接訪問硬件,直接從輸入緩衝區內檢索數據,從而獲得比響應Windows消息更快的速度。此外DirectInput也對力反饋遊戲杆(Force Feedback)提供了良好支持。
4、 DirectPlay

網絡底層程序的開發向來是令開發者頭痛的一件事,而DirectPlay似乎兼顧了速度與易用性兩個方面,在網絡遊戲這樣一類對速度和效率要求較高的軟件來說,針對遊戲優化設計的DirectPlay顯然是一個比較好的選擇。DirectPlay提供了一個額外的層,使你的遊戲和網絡底層相隔。並且,你的遊戲可以非常簡單地使用DirectPlay API,並使用DirectPlay管理網絡通訊。DirectPlay提供的特性,使多人遊戲在開發中得到了很多簡化。其中包括:
* 創建和管理點對點、客戶/服務會話(Session)
* 在一個會話中管理用戶(User)和組(Group)
* 管理在不同網絡平臺上進行會話的成員之間發送的消息
* 使遊戲在大廳(Lobby)中互動
* 使用戶可以進行語音交互

5、 DirectShow

作爲DirectX中的又一重要成員,DirectShow提供了Windows平臺下高質量的媒體捕獲和回放能力,支持很多格式:ASF、MPG、AVI、MP3和WAV。DirectShow支持使用WDM設備或老式視頻設備進行視頻捕獲。當有硬件支持的環境下,它會在使用視頻或音頻時自動選擇是否使用硬件加速。

DirectShow簡化了媒體回放、格式轉換和捕獲任務。同時,當應用程序需要自定義底層流媒體解決方案時,它也提供直接流訪問控制的功能。

你可以用DirectShow編寫DVD播放器、視頻編緝程序、AVI到 ASF轉換器、MP3播放器和數字視頻捕獲程序等等。

三、.NET架構的挑戰-----Managed DirectX
不知大家發現沒有,安裝了DirectX9 SDK後它的文檔裏似乎悄悄多了一個不小的板塊,那就是Managed DirectX。那麼這個神祕的傢伙究竟是幹什麼的呢?

.NET Framework的發表打響了Microsoft .NET戰略的第一槍,ASP.NET、Web Service等詞也伴隨着.NET 技術的普及幾乎變得家喻戶曉。大家已經知道DirectX是基於COM技術的,而COM技術主要是爲本地機服務的,在本地機上DirectX可以儘量把硬件的性能發揮到極限,但是它在.NET的網絡時代是不是就無法施展它原有的威力呢?答案肯定是“否”。現在,DirectX已經成爲Windows核心API的一部分,而Microsoft表示不會再提供更多的Win32API,今後的Windows API可能將全部集成到.NET Framework中去,那麼DirectX到哪裏去了呢?原來它早就已經改頭換面,與.NET Framework達成了“默契”,這也就是Managed DirectX的由來。

Managed DirectX 實質上是對DirectX進行了一個輕量級的封裝,Microsoft在2003年10月初發布了Microsoft DirectX 9.0 SDK Update (Summer 2003),其中就着重改進了Managed DirectX部分。一方面使它能與.NET Framework緊密集成,可供.NET 平臺下的其他語言調用 (如C#);另一方面對DirectX程序編寫進行了進一步簡化,使得DirectX向RAD開發的方向又邁進了一大步,畢竟ASP.NET、WinForm這些東西是在網絡上運行的。如此我們可以試想將來可以在網頁上看到有硬件加速支持的絢麗的3D動畫實時演示,這將是多麼令人激動的事啊!
四、開發環境的支持與配置

在進行DirectX開發之前,我們需要下載並安裝相應版本的DirectX SDK,這個可以從Microsoft的官方站點上免費獲得,最新的DirectX 9.0 SDK Update(Summer 2003)大約是185MB,相關的還有DirectX9 SDK for Pocket PC 、DirectX9 Meltdown、DirectX9 SDK Extras等,下載的相關頁面是http://msdn.microsoft.com/directx。

下載了相應的SDK後,我們就可以開始利用它進行DirectX開發了。

1、Microsoft Visual Studio 6.0/.NET/.NET 2003中的配置
因爲DirectX是Microsoft的產品,所以在Visual Studio系列中,DirectX開發所需的配置顯得格外簡單,下面以最新的Microsoft Visual Studio .NET 2003爲例說明。

第一步:配置Include和Library的目錄, 
設置包含文件(Include)

設置庫文件(Lib)

第二步:添加鏈接所需的庫文件
如下圖所示菜單操作,添加相應的庫文件,如dxguid.lib、d3d9.lib、d3dx9.lib等,不同的程序需要不同的庫文件,但是dxguid.lib是必須要包含的。

其他辦法:在設置了Include和Library文件路徑後,我們還可以使用在程序首部加入以下語句變相實現相應庫文件的鏈接。

#pragma comment (lib,"dxguid.lib")

#pragma comment (lib,"d3d9.lib")

........

2、Borland C++ Builder 5/6/X中的配置
很不幸,自DirectX8.0 SDK起,Microsoft就不再提供Borland編譯器支持的庫文件。Borland C++ Builder是一款非常優秀的RAD開發工具,它在開發桌面應用程序上的便捷性令人歎爲觀止,那麼是不是就無法在C++ Builder中進行DirectX開發了呢?這似乎有點可惜。但是Borland自有它的高招,既然標準的DirectX SDK中不提供Borland版的庫文件,那我就自己做!方法如下:

首先,在C++Builder安裝目錄下的bin子目錄中,我們可以找到一個名爲implib.exe的文件;其次,打開 MSDOS命令行窗口,輸入:implib [庫文件名] [源DLL文件名],即可成成相應鏈接所需的庫文件。

例如:從d3d9.dll中導出編譯所需的d3d9.lib,並將生成的d3d9.lib保存到C盤根目錄下。

implib c:/d3d9.lib c:/windows/system32/d3d9.dll

這樣我們就得到了所需的lib文件,然後將它和原來SDK中所提供的.h文件混合使用,就可以在C++ Builder中進行夢寐以求的DirectX開發了,此方法在C++ Builder X和DirectX9 SDK Update(Summer 2003)環境下測試通過。(在上述環境下似乎不需要dxguid.lib編譯也能通過)
五、DirectX的未來
DirectX的基本模型架構: 


DirectX9 ****************************DirectX10
在現有的DirectX 8和DirectX 9中,可編程頂點着色和像素渲染是分開來的兩個單元,也就是說,GPU生產廠家需要在GPU中劃分兩個區域來存放Vertex Shader陣列和Pixel Shader貼圖流水線,那麼,能否把這兩者整合在一起呢?可以!那就是DirectX 10!如圖所示,預計DirectX10中的Vertex Shader和Pixel Shader將會合併成一個Integrated Shader單元。


六、結束語

正如本文所展現的歷代DirectX的發展史,及其一步步改進的足跡,DirectX的確在媒體技術上佔有至關重要的地位,它是一代又一代媒體技術發展的催化劑。可以預見,未來的DirectX將給我們帶來前所未有的、更加震撼的視聽衝擊,讓我們拭目以待!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章