天天看點

微軟 DirectX—昨天,今天,明天!(轉載)

現在遊戲的種類與數量幾乎呈爆炸式增長,遊戲的制作水準也不斷提高,那麼玩家在欣賞遊戲中那絢麗的效果時,有沒有想過是什麼造就了這一切兀空饩褪荄irectX!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“具有多項令人興奮的全新功能特征”:

微軟 DirectX—昨天,今天,明天!(轉載)

Direct3D圖形渲染管道

•Vertex Shader 2.0和Pixel Shader 2.0

    在DirectX9中,Vertex Shader和Pixel Shader的版本更新到了2.0,它們都支援64或甚至128位浮點色彩精度。浮點色彩在動态和精度上的增加給圖像品質帶來質的飛躍,這樣在DirectX9中你可以輕易實作電影級别般逼真的效果!

DirectX8和DirectX9的對比參數:

微軟 DirectX—昨天,今天,明天!(轉載)

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

微軟 DirectX—昨天,今天,明天!(轉載)

        Vertex Shader 1.0                           VertexShader 2.0

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

微軟 DirectX—昨天,今天,明天!(轉載)

Pixel Shader 1.4

微軟 DirectX—昨天,今天,明天!(轉載)

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等,下載下傳的相關頁面

微軟 DirectX—昨天,今天,明天!(轉載)

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的目錄,

微軟 DirectX—昨天,今天,明天!(轉載)

                         設定包含檔案(Include)

微軟 DirectX—昨天,今天,明天!(轉載)

                         設定庫檔案(Lib)

第二步:添加連結所需的庫檔案

如下圖所示菜單操作,添加相應的庫檔案,如dxguid.lib、d3d9.lib、d3dx9.lib等,不同的程式需要不同的庫檔案,但是dxguid.lib是必須要包含的。

微軟 DirectX—昨天,今天,明天!(轉載)

    其他辦法:在設定了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的基本模型架構:

微軟 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将給我們帶來前所未有的、更加震撼的視聽沖擊,讓我們拭目以待!

繼續閱讀