DirectX基礎(chǔ)(ZT)
1、什么是DirectX ?

微軟的DirectX軟件開(kāi)發(fā)工具包(SDK)提供了一套優(yōu)秀的應(yīng)用程序編程接口(APIs),這個(gè)編程接口可以提供給你開(kāi)發(fā)高質(zhì)量、實(shí)時(shí)的應(yīng)用程序所需要的各種資源。DirectX技術(shù)的出現(xiàn)將極大的有助于發(fā)展下一代多媒體應(yīng)用程序和電腦游戲。

總的說(shuō)來(lái),使用DirectX的主要有兩個(gè)好處:1、為軟件開(kāi)發(fā)者提供硬件無(wú)關(guān)性;2、為硬件開(kāi)發(fā)提供策略。

1、為軟件開(kāi)發(fā)者提供硬件無(wú)關(guān)性

微軟開(kāi)發(fā)DirectX,其最主要的目的之一是促進(jìn)在Windows操作系統(tǒng)上的游戲和多媒體應(yīng)用程序的發(fā)展。在DirectX出現(xiàn)以前,主要的游 戲開(kāi)發(fā)平臺(tái)是MS-DOS,游戲開(kāi)發(fā)者們?yōu)榱耸顾麄兊某绦蚰軌蜻m應(yīng)各種各樣的硬件設(shè)備而絞盡腦汁。自從有了DirectX,游戲開(kāi)發(fā)者們便可以獲益于 Windows平臺(tái)的設(shè)備無(wú)關(guān)性,而又不失去直接訪問(wèn)硬件的特性。DirectX主要的目的就是提供象MS-DOS一樣簡(jiǎn)潔的訪問(wèn)硬件的能力,來(lái)實(shí)現(xiàn)并且 提高基于MS-DOS平臺(tái)應(yīng)用軟件的運(yùn)行效果,并且為個(gè)人電腦硬件的革新掃除障礙。

另一方面,微軟公司開(kāi)發(fā)DirectX是為了在當(dāng)前或今后的計(jì)算機(jī)操作系統(tǒng)上提供給基于Windows平臺(tái)的應(yīng)用程序以高表現(xiàn)力、實(shí)時(shí)的訪問(wèn)硬件的 能力。DirectX在硬件設(shè)備和應(yīng)用程序之間提供了一套完整一致的接口,以減小在安裝和配置時(shí)的復(fù)雜程度,并且可以最大限度的利用硬件的優(yōu)秀特性。通過(guò) 使用DirectX所提供的接口,軟件開(kāi)發(fā)者可以盡情的利用硬件所可能帶來(lái)的高性能,而不用煩惱于那些復(fù)雜而又多變的硬件執(zhí)行細(xì)節(jié)。

一個(gè)高表現(xiàn)力的基于Windows平臺(tái)的游戲?qū)⒌靡嬗谝韵聨追N技術(shù):

專為提高圖形運(yùn)算及快速反應(yīng)能力而設(shè)計(jì)的加速卡(Accelerator cards)
即插即用以及其它Windows軟硬件
內(nèi)建于Windows的通信服務(wù), 包括DirectPlay

2、為硬件開(kāi)發(fā)提供策略

DirectX的另外一個(gè)重要的目的是給硬件廠商提供開(kāi)發(fā)策略,他們可以從高性能程序的開(kāi)發(fā)者和獨(dú)立的硬件供應(yīng)商(independent hardware vendors IHVs)那里得到反饋。所以,在DirectX 程序員參考書(shū)中有時(shí)可能會(huì)提供那些還不存在的硬件加速設(shè)備的技術(shù)細(xì)節(jié)。在很多時(shí)候,軟件可以模擬這些特性,在另外一些情況下,軟件根據(jù)硬件的指標(biāo)判斷出其 特性,并且可以忽略那些硬件并不支持的性能。

已經(jīng)和將要實(shí)現(xiàn)的顯示設(shè)備的特性包括:

覆蓋(Overlays),由于它的被支持,在圖形設(shè)備接口中,窗口中的換頁(yè)(page flipping)將成為可用。換頁(yè)是用來(lái)在整個(gè)屏幕上顯示畫面的雙緩沖(double-buffer)方案。
精靈引擎(Sprite engines),使精靈(不規(guī)則圖形)覆蓋更容易。
插補(bǔ)延展(Stretching with interpolation),它可以更有效的保存顯示內(nèi)存,因?yàn)樗梢允剐》嬅嫜诱沟秸麄€(gè)屏幕。
Alpha 融合(Alpha blending),它可以在硬件像素層(hardware-pixel level)上混合顏色。
帶有透視修正(perspective-correct)貼圖的3D加速器,它允許你在3D表面上貼圖。比如,你可以在用3D軟件制作的城堡的走廊里貼上磚塊的位圖來(lái)顯示出透視效果。
為3D圖象進(jìn)行的位操作將 Z 方向考慮在內(nèi)。

標(biāo)準(zhǔn)2兆顯示內(nèi)存,這在3D游戲中是最小需求。
壓縮標(biāo)準(zhǔn),這將允許你在顯存中儲(chǔ)存更多的信息。這個(gè)標(biāo)準(zhǔn)不論是在軟件還是硬件中執(zhí)行都會(huì)相當(dāng)快。它將被用在貼圖中并且包含透明壓縮。

將要被包括的聲音設(shè)備的新特性包括:

硬件及其外設(shè)可以提供空間環(huán)繞立體聲效果。
聲卡上內(nèi)置音頻內(nèi)存。
音頻-視頻一體卡可共享其上的內(nèi)存。
另外,視頻回放將得益于今后的與DirectX相兼容硬件加速設(shè)備。今后的DirectX版本中的一個(gè)特性是將支持硬件加速YUV視頻解碼。


--------------------------------------------------------------------------------

2、DirectX的組件

DirectX SDK為基于Windows平臺(tái)的應(yīng)用程序提供了以下幾個(gè)組件。

DirectDraw :通過(guò)直接訪問(wèn)顯示硬件來(lái)提供高級(jí)的圖象處理能力。
DirectSound :它提供了軟硬件的低延遲聲音混頻(low_latency sound mixing)和回放(Playback),硬件加速,以及直接訪問(wèn)音頻設(shè)備的能力。
DirectPlay :它明確的提供了通用環(huán)境連接能力(generalized communication capabilities),來(lái)簡(jiǎn)化你應(yīng)用程序之間的通訊服務(wù)。
Direct3D :它為主流的桌上型計(jì)算機(jī)和Internet用戶提供實(shí)時(shí)的、交互的3D技術(shù)。
DirectInput :它簡(jiǎn)化你的應(yīng)用程序訪問(wèn)鼠標(biāo)、鍵盤和操縱桿設(shè)備的能力。
DirectSetup :一套簡(jiǎn)單的API向你提供安裝DirectX部件的功能。
AutoPlay :它也是Win95操作系統(tǒng)的一個(gè)特性,當(dāng)你在光驅(qū)內(nèi)放上光盤,指定的應(yīng)用程序會(huì)自動(dòng)執(zhí)行。

--------------------------------------------------------------------------------

3、關(guān)于DirectDraw

DirectDraw是DirectX SDK大家族中的一員,也是其中最主要的一個(gè)部件。DirectDraw允許程序員直接的操作顯存、硬件位圖映射以及硬件覆蓋和換頁(yè)技術(shù)。它在提供這些功 能的同時(shí),也使其與現(xiàn)在的基于Microsoft Windows的應(yīng)用程序和設(shè)備驅(qū)動(dòng)程序相兼容。

DirectDraw是一個(gè)軟件接口,它在提供直接訪問(wèn)顯示設(shè)備的同時(shí),與Windows圖形設(shè)備接口(GDI)相兼容。DirectDraw不是 一個(gè)高層的圖形程序編程接口,它為游戲和Windows子系統(tǒng)軟件(例如:3D圖形包和數(shù)字視頻編碼)提供了一種與設(shè)備無(wú)關(guān)的途徑,以獲得訪問(wèn)特定的顯示 設(shè)備的某些高級(jí)特性的能力。

DirectDraw適用于種類眾多的的顯示設(shè)備,從簡(jiǎn)單的SVGA顯示器到提供裁剪、縮放、和支持非RGB顏色格式的高級(jí)硬件實(shí)現(xiàn)設(shè)備。設(shè)計(jì)這樣 的接口是為了讓你的應(yīng)用程序能夠列舉低層硬件的能力,并且對(duì)那些支持的硬件加速特性加以利用。那些在硬件設(shè)備中不能實(shí)現(xiàn)的特性,DirectX將仿真出 來(lái)。

DirectDraw提供了以下幾個(gè)優(yōu)點(diǎn),這些好處在以前只有那些專為特定顯示設(shè)備所寫的軟件才能利用。

支持雙緩沖和換頁(yè)圖形
訪問(wèn)、控制顯示卡的位圖映射
支持3D z-buffers (z緩存)
支持z方向(z-ordering)硬件輔助覆蓋。
訪問(wèn)圖形縮放硬件
仿真訪問(wèn)標(biāo)準(zhǔn)的和增強(qiáng)的顯示設(shè)備內(nèi)存空間
DirectDraw 的任務(wù)是用與設(shè)備無(wú)關(guān)的途徑來(lái)提供依賴于設(shè)備的訪問(wèn)顯示內(nèi)存的方法。本質(zhì)上,DirectDraw管理顯示內(nèi)存。你的應(yīng)用程序只需要懂得那些一般的關(guān)于硬 件與設(shè)備有關(guān)的知識(shí),比如RGB和YUV色彩格式和兩條光柵線之間的pitch(寬距) 。在需要利用位轉(zhuǎn)換或操作調(diào)色板寄存器時(shí),你不需要為調(diào)用過(guò)程中的細(xì)節(jié)而煩惱。使用DirectDraw,你可以方便的操作顯示內(nèi)存,充分的利用不同類型 的顯示設(shè)備的位轉(zhuǎn)換和顏色壓縮能力,而不需要依賴于某一個(gè)特定的硬件。

DirectDraw給運(yùn)行于Windows 95和Windows NT 4.0或更高版本的計(jì)算機(jī)提供了一個(gè)高性能的的游戲圖象引擎。


--------------------------------------------------------------------------------

4、為什么要使用DirectDraw?

無(wú)庸置疑,人們之所以利用DirectDraw來(lái)開(kāi)發(fā)各種游戲以及多媒體應(yīng)用軟件,是因?yàn)镈irectDraw可以為他們的應(yīng)用程序帶來(lái)許多強(qiáng)大的功能提升。

DirectDraw可以充分評(píng)估視頻硬件的能力,只要可能,它就會(huì)對(duì)其某一特性加以利用。例如,如果你的顯卡支持硬件Blit, DirectDraw就會(huì)將位圖映射這一操作分派給顯卡來(lái)完成,極大的提升運(yùn)行速度。此外,當(dāng)某硬件不支持某項(xiàng)特性時(shí),DirectDraw還提供了硬件 仿真層(HEL)以完成這項(xiàng)操作。
DirectDraw的硬件抽象層(HAL)提供了一個(gè)統(tǒng)一的接口,通過(guò)它,開(kāi)發(fā)者可以直接的操作顯示存儲(chǔ)器和視頻存儲(chǔ)器,從系統(tǒng)硬件中獲取最大的表現(xiàn)能力。
DirectDraw運(yùn)行于Windows95操作系統(tǒng)之上,從系統(tǒng)所提供的32位內(nèi)存尋址和平面內(nèi)存模型中獲益。DirectDraw將視頻和系統(tǒng)存儲(chǔ)器視為整塊的空間,而不是碎片的集合。如果你曾使用過(guò)區(qū)段偏移尋址,你將很快就喜愛(ài)上這種“平面”內(nèi)存模型。
對(duì)于全屏模式的應(yīng)用程序,DirectDraw使得多后臺(tái)緩存的換頁(yè)操作變得極為容易。
支持窗口和全屏模式應(yīng)用程序的裁減。
支持3-D z緩存。
支持帶z軸方向的硬件輔助覆蓋。
可訪問(wèn)圖象縮放硬件。
可同時(shí)訪問(wèn)標(biāo)準(zhǔn)的和增強(qiáng)的顯示設(shè)備內(nèi)存區(qū)。
其它的特性,包括動(dòng)態(tài)改變調(diào)色板、獨(dú)占訪問(wèn)硬件、和分辨率切換等等。
合理和有效的利用DirectDraw的這些特性將使開(kāi)發(fā)者很容易就能夠?qū)懗霰然跇?biāo)準(zhǔn)的Windows GDI應(yīng)用程序,甚至MS-DOS應(yīng)用程序還要優(yōu)秀的作品。


--------------------------------------------------------------------------------

5、DirectX 5.0的新特性


DirectX5.0版本比3.0版擁有更多的創(chuàng)新和新特性(注意:并不存在4.0版)。盡管這樣,你用以前版本寫的DirectX應(yīng)用程序同樣可以不加修改的運(yùn)行于DirectX5.0環(huán)境中。以下將介紹的是DirectX 5.0中DirectDraw接口的新特性。

首先,DirectDraw支持Windows98和Windows NT 5.0的多顯示器系統(tǒng)。例如,在多顯示器環(huán)境下,同一臺(tái)電腦使用兩套不同的顯示設(shè)備和顯示器,用戶可以將不同的畫面顯示在兩個(gè)顯示屏幕上,甚至將一個(gè)窗口 從一個(gè)顯示器拖拽到另一個(gè)顯示器上。DirectDraw5.0支持這樣一個(gè)系統(tǒng),允許應(yīng)用程序在這樣的環(huán)境中直接的訪問(wèn)和操縱硬件加速特性。

其次,DirectDraw已經(jīng)使視頻端口(Video-port)具有新的性能,它允許應(yīng)用程序直接控制數(shù)據(jù)流從一個(gè)硬件視頻端口流向一個(gè)位于顯存中的DirectDraw頁(yè)面上。這樣,使得視頻圖象的輸入和輸出對(duì)DirectDraw來(lái)說(shuō)都變得極為便利和快速。

除此之外,DirectDraw的HEL(硬件仿真層)現(xiàn)在可以充分利用Pentium MMX處理器所帶來(lái)的多媒體性能的提升。當(dāng)你第一次創(chuàng)建頁(yè)面的時(shí)候,DirectDraw會(huì)測(cè)試你的電腦芯片是否支持MMX。而在一臺(tái)非Pentium MMX級(jí)別電腦上,這個(gè)測(cè)試會(huì)在調(diào)試程序的時(shí)候給出一個(gè)良性的異常信息,而這個(gè)異常并不會(huì)影響到你的應(yīng)用程序執(zhí)行的穩(wěn)定性。

DirectDraw接口現(xiàn)在還支持離屏頁(yè)面的寬度大于主頁(yè)面的寬度。你可以創(chuàng)建這些頁(yè)面而不用顧及它的大小,而在以前的版本中,你經(jīng)常會(huì)為了不使頁(yè)面寬度大于主頁(yè)面而將其分割開(kāi)來(lái)。

DirectDraw接口現(xiàn)在已經(jīng)能夠支持高級(jí)圖形端口(AGP)構(gòu)架。在裝備了AGP顯卡的系統(tǒng)中,DirectDraw程序開(kāi)發(fā)者將從AGP顯卡的大容量和高傳輸速率中獲益。


--------------------------------------------------------------------------------

6、部件對(duì)象模型(COM)

DirectX是基于COM的一套軟件編程接口。

部件對(duì)象模型(Component Object Model, COM)是OLE 的基礎(chǔ)。COM 為OLE提供了編程模型和二進(jìn)制標(biāo)準(zhǔn)。COM定義并實(shí)現(xiàn)了軟部件(如應(yīng)用程序、數(shù)據(jù)對(duì)象、控件及服務(wù))機(jī)制,并把它們統(tǒng)稱為“對(duì)象”。每個(gè)軟部件對(duì)象由數(shù) 據(jù)以及訪問(wèn)數(shù)據(jù)的函數(shù)組成,訪問(wèn)軟部件對(duì)象數(shù)據(jù)的函數(shù)的集合稱為“接口”。

從這里可以看出,COM 的設(shè)計(jì)與C++類非常相似,即一個(gè)軟部件對(duì)象具有一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)和一組外部接口函數(shù),允許通過(guò)接口函數(shù)對(duì)數(shù)據(jù)進(jìn)行訪問(wèn)。因此Microsoft公司把根 據(jù)COM執(zhí)行的對(duì)象統(tǒng)稱為Windows對(duì)象。但Windows對(duì)象與C++中的對(duì)象有明顯的差別,Windows對(duì)象中沒(méi)有公共數(shù)據(jù),也沒(méi)有成員函數(shù), 因此不能直接訪問(wèn)數(shù)據(jù),也就是說(shuō)數(shù)據(jù)是全封裝的。

對(duì)象的提供者或服務(wù)器必須指明一個(gè)或多個(gè)接口的定義,每個(gè)接口都是相互關(guān)聯(lián)的一組函數(shù),執(zhí)行對(duì)象的一個(gè)特性。每個(gè)對(duì)象的一個(gè)用戶(或稱為“客戶”) 必須擁有一個(gè)接口指針才能訪問(wèn)對(duì)象。當(dāng)客戶有了這個(gè)指針后,就可以使用這個(gè)對(duì)象而無(wú)需知道對(duì)象的含義,即使客戶運(yùn)行在不同的進(jìn)程、不同的機(jī)器、不同的操作 系統(tǒng)、由不同的軟件開(kāi)發(fā)而使用不同的語(yǔ)言,或者版本不同。

DirectX SDK接口被創(chuàng)建在COM編程層次表中很基礎(chǔ)的一層。每一個(gè)代表設(shè)備的對(duì)象的接口,比如IDirectDraw、IDirectSound、和 IDirectPlay,是直接從IUnknown OLE接口中派生下來(lái)的。這些基本對(duì)象的創(chuàng)建被操作于在該對(duì)象的動(dòng)態(tài)連接庫(kù)中,要比用Win32中專門用來(lái)創(chuàng)建COM對(duì)象的 CoCreateInstance函數(shù)要好得多。

特別的是,DirectX SDK對(duì)象模型為每一個(gè)設(shè)備提供一個(gè)主要的對(duì)象。其它的設(shè)備對(duì)象是由這個(gè)主要對(duì)象派生下來(lái)的。例如,DirectDraw對(duì)象代表顯示設(shè)備。你可以用它來(lái) 創(chuàng)建代表顯存的主頁(yè)面(DirectDrawSurface)對(duì)象,和代表硬件調(diào)色板的調(diào)色板(DirectDrawPalette)對(duì)象;相似的, DirectSound對(duì)象代表聲卡,并且創(chuàng)建DirectSoundbuffer對(duì)象來(lái)代表聲卡上的聲音數(shù)據(jù)。