概要
閱讀本章,你需要前幾章的知識和C語言的知識,由於我們還要談到
組件對象模型(COM),它是
面向對象系統的基礎,你最好還要有一點兒C++的知識。沒有也不太要緊,我在講到這處時會照顧你的。反正你記住,使用DirectX並不需要多少C++的知識。開始吧!
DirectX軟體簡介
什麼是DirectX
DirectX是遊戲製作者的API(Application programming Interface)。它是一組允許你直接控制計算機硬體設備的軟體。如果你的硬體支持DirectX,並且你用
硬體加速你的程式,這就意味著一個字——快。不用擔心你的硬體知識,你不會真正的接觸到它們。我們是通過
硬體抽象層(HAL)和硬體仿真層(
HEL)來保證設備無關性和讓你的程式正常運行。
DirectX由很多組件構成,每一個都有特定的用途。組件
DirectDraw是最為重要的一個,因為所有的圖形都要用到它,它是2D圖形的引擎,3D圖形也同樣離不開它。DirectDraw是我們今天就要說的。其它的組件是:
DirectMusic:處理基於訊息的音樂數據。它支持樂器數字接口(MIDI)並為創建互動式音樂提供創作工具。
Direct3D:是一個三維圖形包,它提供一個高級的保留模式(Retained Mode)接口,這使得你能夠實現一個完整的三維圖形系統。它還包含一個低級的即時模式(Immediate Mode)接口,使得應用程式獲得對
渲染管線的完全控制。
DirectInput:為包括遊戲桿、滑鼠、鍵盤和遊戲控制器在內的
輸入設備提供支持。它還為反饋遊戲設備提供支持。
DirectSetup:為
DirectX提供了一個簡單的安裝過程。它簡化了更新顯示和音頻驅動程式的過程,並且確保沒有硬體或
軟體衝突的存在。
AutoPlay:讓你能夠製作一張一旦插入
驅動器就能自動安裝的光碟。AutoPlay並非DirectX所獨有,因為它是Microsoft Win32 API的一部分。
組件對象模型(COM)是DirectX的基礎,有一些技巧建立
COM對象——別問我怎么做——但你知道一點點還是有好處的。我只是簡單說一下,如果你有興趣,具體的細節就自己查資料吧!可能下一節你有些困惑,但不要緊,我所說的你不用太明白,畢竟我們的目的是使用COM對象,這可比創建容易多了。
功用
DirectX加強3D圖形和聲音效果,並提供設計人員一個共同的硬體驅動標準,讓遊戲開發者不必為每一品牌的硬體來寫不同的驅動程式,也降低用戶安裝及設定硬體的複雜度。從字面意義上說,Direct就是直接的意思,而後邊的X則代表了很多的意思,從這一點上我們就可以看出DirectX的出現就是為了為眾多軟體提供直接服務的。
舉個例子,
骨灰級玩家以前在DOS下玩遊戲時,可不像我們現在,安裝上就可以玩了,他們往往首先要先設定音效卡的品牌和型號,然後還要設定IRQ(中斷)、
I/O(輸入與輸出)、DMA(存取模式),如果哪項設定的不對,那么遊戲聲音就發不出來。這部分的設定不僅讓玩家傷透腦筋,而且對遊戲開發者來說就更頭痛了,因為為了讓遊戲能夠在眾多電腦中正確運行,開發者必須在遊戲製作之初,便需要把市面上所有
音效卡硬體數據都收集過來,然後根據不同的 API(套用編程接口)來寫不同的驅動程式,這對於遊戲製作公司來說,是很難完成的,所以說在當時多媒體遊戲很少。微軟正是看到了這個問題,為眾廠家推出了一個共同的應用程式接口——
DirectX,只要這個遊戲是依照
Directx來開發的,不管你是什麼顯示卡、音效卡、統統都能玩,而且還能發揮更佳的效果。當然,前提是你的顯示卡、音效卡的驅動程式也必須支持DirectX才行。
組件對象模型(COM)
COM接口是
DirectX技術的基礎,沒有COM就沒有DirectX。(不用擔心,你只需要對
COM技術有一個粗淺的了解就可以使用DirectX——只要你在編寫DirectX應用程式時遵循一定的步驟,甚至都可以在不了解COM的情況下使用DirectX。
DirectX的大多數API都是基於COM結構的。COM為軟體
模組化和
軟體重用提供了最堅實的基礎,它的最重要的概念就是接口(interface),接口是軟體重用的最基本方法。更專業的說,接口是一系列操作的規範描述,即接口規範。
· QueryInterface():此方法查詢新接口,並在新接口存在時返回之。
· AddRef():此方法在接口或其它應用程式連編到此
COM對象上時將
引用計數值遞加1。
· Release():此方法將COM對象的引用計數遞減1。當引用計數遞減到0時,該COM對象自動釋放。
所有COM對象都具有這三個方法。雖然
DirectX應用程式一般不需要考慮引用計數的問題,但引用計數確實是存在的,它已經由DirectX自動完成了。我們所要做的,就是創建DirectX對象,然後在使用完畢後調用
Release方法釋放引用。
設定
用
DirectX創建程式,你需要有三件主要的事要做。第一件事是
COM對象本身,它們包含在.
DLL檔案里,這些.DLL檔案需要在Windows里註冊,這在安裝DirectX軟體包時已經完成了。這些對象是我們創建DirectX應用程式時用到的接口,例如IdirectDraw。但這還不夠,因為在COM層上直接使用DirectX是令人沮喪的和乏味的。我們希望有更容易的辦法解決它。利用
靜態庫(.
LIB檔案)是個好辦法,它是DirectX軟體包的一部分,你可以從Microsoft免費獲得。它有一個“打包”函式使你工作更輕鬆。使用DirectX的不同組件,你需要連結不同的靜態庫。例如你要使用
DirectDraw組件,你就需要ddraw.lib。
最後,你還需要DrectX頭檔案,它包含函式原形、宏、常量和你需要用到的各種類型。對於DirectDraw,這個頭檔案是ddraw.h。要確認你使用了正確的
檔案版本,你還得讓編譯器包含軟體開發包的目錄。具體的做法是:
首先點擊Tool選單,選擇
Options,然後點擊Directories,在Show Directories for
組合框下拉選單中選擇Include files,增加一個新的目錄。將你的DirectX的路徑填入。(例如:C:DXSDKinclude)然後將它移到列表的第一位,使編譯時第一個尋找它(防止尋找老版本)。然後選擇Show Directories for組合框下拉選單中的Library files,方法同前,只是把include改成lib。現在,你已經設定完了DirectX。你仍然需要手動增加一些庫檔案到你的項目中,但先不急,我將在以後講它。我們將使用DirectX 7.0。
DirectX版本號
DirectX 5.0
微軟公司並沒有推出DirectX 4.0,而是直接推出了DirectX 5.0。此版本對Direct3D做出了很大的改動,加入了
霧化效果、
Alpha混合等3D特效,使
3D遊戲中的
空間感和真實感得以增強,還加入了S3的紋理
壓縮技術。同時,DirectX 5.0在其它各組件方面也有加強,在
音效卡、
遊戲控制器方面均做了改進,支持了更多的設備。因此,DirectX發展到DirectX 5.0才真正走向了成熟。此時的DirectX性能完全不遜色於其它3D API,而且大有後來居上之勢。
DirectX 6.0
DirectX 6.0推出時,其最大的競爭對手之一Glide,已逐步走向了沒落,而DirectX則得到了大多數廠商的認可。DirectX 6.0中加入了
雙線性過濾、
三線性過濾等最佳化3D
圖像質量的技術,遊戲中的3D技術逐漸走入成熟階段。
DirectX 7.0
DirectX 7.0最大的特色就是支持T&L,中文名稱是“坐標轉換和光源”。
3D遊戲中的任何一個物體都有一個坐標,當此物體運動時,它的坐標發生變化,這指的就是坐標轉換;3D遊戲中除了場景+物體還需要燈光,沒有燈光就沒有3D物體的表現,無論是實時3D遊戲還是3D影像渲染,加上燈光的3D渲染是最消耗資源的。雖然OpenGL中已有相關技術,但此前從未在民用級硬體中出現。在T&L問世之前,位置轉換和燈光都需要CPU來計算,CPU速度越快,遊戲表現越流暢。使用了T&L功能後,這兩種效果的計算用顯示卡的GPU來計算,這樣就可以把CPU從繁忙的勞動中解脫出來。換句話說,擁有T&L顯示卡,使用DirectX 7.0,即使沒有高速的CPU,同樣能流暢的跑3D遊戲。
DirectX 8.0
DirectX 8.0的推出引發了一場
顯示卡革命,它首次引入了“像素渲染”概念,同時具備像素渲染引擎(Pixel Shader)與
頂點渲染引擎(Vertex Shader),反映在特效上就是動態光影效果。同硬體T&L僅僅實現的固定光影轉換相比,VS和PS單元的靈活性更大,它使GPU真正成為了可程式的處理器。這意味著程式設計師可通過它們實現3D場景構建的難度大大降低。通過VS和PS的渲染,可以很容易的寧造出真實的水面動態波紋光影效果。此時DirectX的權威地位終於建成。
DirectX 9.0
2002年底,
微軟發布DirectX9.0。DirectX 9中PS單元的渲染精度已達到浮點精度,傳統的硬體T&L單元也被取消。全新的VertexShader(
頂點著色引擎)
編程將比以前複雜得多,新的VertexShader標準增加了
流程控制,更多的常量,每個程式的著色指令增加到了1024條。
PS 2.0具備完全可程式的架構,能對紋理效果
即時演算、動態紋理
貼圖,還不占用顯存,理論上對
材質貼圖的解析度的精度提高無限多;另外PS1.4隻能支持28個硬體指令,同時操作6個材質,而PS2.0卻可以支持160個硬體指令,同時操作16個材質數量,新的高精度浮點數據規格可以使用多重紋理貼圖,可操作的指令數可以任意長,電影級別的顯示效果輕而易舉的實現。
VS 2.0通過增加Vertex程式的靈活性,顯著的提高了老版本(DirectX8)的VS性能,新的控制指令,可以用通用的程式代替以前專用的單獨著色程式,效率提高許多倍;增加循環操作指令,減少工作時間,提高處理效率;擴展著色指令個數,從128個提升到256個。
增加對浮點數據的處理功能,以前只能對整數進行處理,這樣提高渲染精度,使最終處理的色彩格式達到電影級別。突破了以前限制PC圖形圖象質量在數學上的精度障礙,它的每條渲染流水線都升級為128位浮點顏色,讓遊戲程式設計師們更容易更輕鬆的創造出更漂亮的效果,讓
程式設計師編程更容易。
DirectX 10.0
DirectX 10
幾何渲染單元
在DirectX 10的圖形流水線體系中,最大的結構性變化就是在幾何處理階段增加了幾何
渲染單元(Geometry Shader)。幾何渲染單元被附加在頂點渲染單元之後,但它並不像頂點渲染單元那樣輸出一個個頂點,而是以圖元作為處理對象。圖元在層次上比頂點高一級,它由一個或多個頂點構成。由單個頂點組成的圖元被稱為“點”,由兩個頂點組成的圖元被稱為“線”,由三個頂點組成的圖元被稱為“三角形”。幾何渲染單元支持點、線、三角形、帶
鄰接點的線、帶鄰接點的三角形等多種圖元類型,它一次最多可處理六個頂點。藉助豐富的圖元類型支持,幾何
渲染單元可以讓
GPU提供更精細的模型細節。
幾何渲染單元賦予GPU自行創造新幾何物體、為場景添加內容的神奇能力。靈活的處理能力使GPU更加通用化,以往很多必須倚靠CPU才能完成的工作,現在完全可交由GPU處理。如此一來,CPU就有更多時間處理人工智慧、定址等工作。更令人驚喜的是,幾何渲染單元還讓物理運算的加入變得更簡單,DirectX 10可創建具備物理特性的盒子、模擬剛性物體,物理運算有望在它的帶領下逐漸走向普及。可以預見,藉助幾何渲染單元這一武器,
顯示卡性能將產生質的飛躍,我們也將體驗到速度更流暢、畫面更精美、情節更細緻的遊戲。
改進的API和驅動功效
我們知道,每一個遊戲角色、武器和景物在3D程式中都是一個Object(對象),而每一幀遊戲畫面就可能出現數百個Object。在顯示卡工作時,每一個Object都要從應用程式傳輸到API接口,然後通過顯示卡
驅動程式到達顯示卡。在現有的
DirectX體系中,任何一個Object進行操作或者渲染,都會導致系統資源的額外消耗,遊戲的Object越多,所耗費的傳遞時間就越長,造成的額外消耗也就越多。據統計,現有的DirectX 9圖形晶片在工作時,只有60%的性能用於運算3D程式,其餘40%的運算能力被白白浪費了!
為了改變這一現狀,DirectX 10在渲染程式中採用了動態索引功能,Object被
驅動程式自動載入,數據可以分類並連續輸入,這樣一來,單次傳輸的數據量就增加了,從而大大降低了額外耗費的時間。通過引入新的API及驅動程式,DirectX 10將
圖形晶片的執行效能提升至80%。在不增加
顯示卡硬體成本的前提下,顯示卡性能得到了大幅提升。
並行引擎支持技術
為了提升多塊顯示卡協作的工作效率,微軟在DirectX 10中提出了“Parallel Engine Support(並行引擎支持)”的概念,它可以預先把兩個GPU需要的數據分別傳輸到兩塊對應的GPU當中,幀渲染將完全由驅動控制和調配,兩塊顯示卡的工作強度可以獲得很好的平衡。而在目前主從卡的運作模式中,主卡要對從卡框架、渲染數量進行判定,而引入並行引擎支持技術後,主從卡的概念將消失,兩塊甚至多塊顯示卡的協作威力將充分體現。
DirectX 10最大的革新就是統一渲染架構(Unified Shader Architecture)。目前各類圖形硬體和API均採用分離渲染架構,即
頂點渲染和
像素渲染各自獨立進行,前者的任務是構建出含三維坐標信息的多邊形頂點,後者則是將這些頂點從三維轉換為二維,這樣便可以通過視覺欺騙在
螢幕上顯示出“三維”的場景。與此對應,GPU中也有專門的頂點
渲染單元和像素渲染單元來分別執行這兩項工作(由於工作量不同,這兩種渲染單元的數量不相等,頂點渲染單元通常只有像素渲染單元的1/3~1/2)。在過去幾年中,這種分離式設計對計算機圖形領域的發展做出了一定的貢獻。
不過,微軟認為這種分離渲染架構不夠靈活,不同的GPU,其像素渲染單元和頂點渲染單元的比例不一樣,軟體開發人員在編寫代碼時必須考慮這個比例,這就大大限制了開發人員自由發揮的空間。另外,不同的圖形遊戲或軟體對像素渲染和
頂點渲染的需求不一樣,導致GPU的運算資源得不到充分利用。為此,微軟在DirectX 10中提出了
統一渲染架構的思想:在相同物理類型的
渲染單元上執行不同類型的渲染程式。換句話說,只用一種渲染單元,讓它既能完成頂點渲染,也能完成像素渲染,甚至還能實現幾何渲染。這樣一來,渲染單元可以得到最大程度的利用,減少了資源閒置的情形。目前,Xbox 360的
顯示晶片Xenos就採用了統一渲染架構,該晶片一共有48個渲染單元,它們可全部用於頂點渲染或像素渲染,沒有固定分配比例。此外,ATI也打算在新一代的R600晶片中採用
統一渲染架構。
當然,統一渲染架構也並非完美無瑕。相對
頂點渲染來說,像素渲染將面臨大規模使用紋理所帶來的材質延遲,這是統一渲染架構急待解決的問題。據悉,
NVIDIA下一代的G80有可能繼續堅持分離式設計。到底是
統一架構好還是分離設計好?相信只有等G80和R600同台競技後,答案才會揭曉。不過有一點可以肯定,在
微軟的大力推動下,統一渲染架構是大勢所趨。
Vista
除統一渲染架構外,DirectX 10的另一大特色就是與Windows Vista緊密結合,Vista系統將調用GPU資源來渲染Aero Glass 3D界面,這樣圖形API就與作業系統核心高度整合在一起。舉個例子,當我們點擊應用程式時,CPU將立刻收到
驅動程式的指令,而
軟體界面渲染指令則通過DirectX 10直接傳送給GPU,這樣,
Vista就能與CPU和GPU同時溝通,讓3D界面渲染工作變得更高效。
相比之下,在DirectX 9環境中,Vista(軟體)界面的渲染工作就要“遲鈍”一些了:用戶點擊運行某個軟體,Vista將相應的指令傳送給CPU,要求CPU進行後續處理;CPU接到
運行指令的同時向GPU發出請求,要求GPU在
螢幕上渲染出界面。GPU(支持DirectX 9)識別Vista界面渲染指令後完成相應的工作(注意:DirectX 8
顯示卡無法完成渲染工作,必須讓CPU通過軟體模擬來實現,此時系統速度非常緩慢)。換句話說,在“DirectX 9顯示卡+
Vista”的平台中,CPU還是核心,GPU必須在CPU的控制下工作,而Vista系統也必須通過CPU來調用
GPU的資源。
DirectX9還有一個不足之處,那就是它只能進行單任務渲染,即無法同時完成兩個場景的渲染工作(如無法在運行遊戲的同時為軟體渲染3D界面),套用範圍受到極大的限制。而DirectX 10則允許GPU同時渲染多個不相關的3D場景,工作效率大為提高。因此,儘管DirectX 9顯示卡大都能驅動Vista華麗的Aero Glass視覺模式,但很多方面受到了限制,只有DirectX 10顯示卡才是Vista的理想“伴侶”。
SM 4.0
從DirectX 8開始,Shader Model(
渲染單元模式)在DirectX體系中的地位就日趨重要,其版本和渲染單元的規格也成為了決定顯示卡性能高低的關鍵因素(編註:關於Shader Model的具體介紹,請大家參閱本報今年第7期D15版)。隨著DirectX 10時代的到來,Shader Model也升級到了4.0版本。與眼下如日中天的Shader Model 3.0(以下簡稱SM 3.0)相比,Shader Model 4.0(以下簡稱SM 4.0)有哪些可喜的變化?
首先,
SM4.0中的
指令長度被提升到大於64K(即64×1024)的水平,這是SM 3.0規格(渲染指令長度允許大於512)的128倍。顯然,SM 4.0在為渲染出電影級別的遊戲畫面做準備。由於渲染指令長度大幅提升,SM 4.0中相應的暫存器規格也有所增強,如Constant暫存器採用16×4096陣列、tmp暫存器則有4096個、input暫存器採用16/32規格等,上述指標都比以前的DirectX有明顯的改進。其次,SM 4.0在紋理數量方面也有提高。DirectX 10允許程式設計師在渲染物體時使用128個紋理,而DirectX 9隻提供4/16規格,更多的紋理意味著物體表面精度更接近真實,遊戲開發者擁有更廣泛的選擇。
從上述情況不難看出,DirectX 10在性能方面的提升是巨大的,它將進一步解放CPU的資源。當然,我們也必須看到,DirectX 10對硬體(尤其是
顯示卡)的要求也更為苛刻,GPU在設計上也將更加複雜。