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

微軟的DirectX軟件開發工具包(SDK)提供了一套優秀的應用程序編程接口(APIs),這個編程接口可以提供給你開發高質量、實時的應用程序所需要的各種資源。DirectX技術的出現將極大的有助于發展下一代多媒體應用程序和電腦游戲。

總的說來,使用DirectX的主要有兩個好處:1、為軟件開發者提供硬件無關性;2、為硬件開發提供策略。

1、為軟件開發者提供硬件無關性

微軟開發DirectX,其最主要的目的之一是促進在Windows操作系統上的游戲和多媒體應用程序的發展。在DirectX出現以前,主要的游 戲開發平臺是MS-DOS,游戲開發者們為了使他們的程序能夠適應各種各樣的硬件設備而絞盡腦汁。自從有了DirectX,游戲開發者們便可以獲益于 Windows平臺的設備無關性,而又不失去直接訪問硬件的特性。DirectX主要的目的就是提供象MS-DOS一樣簡潔的訪問硬件的能力,來實現并且 提高基于MS-DOS平臺應用軟件的運行效果,并且為個人電腦硬件的革新掃除障礙。

另一方面,微軟公司開發DirectX是為了在當前或今后的計算機操作系統上提供給基于Windows平臺的應用程序以高表現力、實時的訪問硬件的 能力。DirectX在硬件設備和應用程序之間提供了一套完整一致的接口,以減小在安裝和配置時的復雜程度,并且可以最大限度的利用硬件的優秀特性。通過 使用DirectX所提供的接口,軟件開發者可以盡情的利用硬件所可能帶來的高性能,而不用煩惱于那些復雜而又多變的硬件執行細節。

一個高表現力的基于Windows平臺的游戲將得益于以下幾種技術:

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

2、為硬件開發提供策略

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

已經和將要實現的顯示設備的特性包括:

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

標準2兆顯示內存,這在3D游戲中是最小需求。
壓縮標準,這將允許你在顯存中儲存更多的信息。這個標準不論是在軟件還是硬件中執行都會相當快。它將被用在貼圖中并且包含透明壓縮。

將要被包括的聲音設備的新特性包括:

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


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

2、DirectX的組件

DirectX SDK為基于Windows平臺的應用程序提供了以下幾個組件。

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

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

3、關于DirectDraw

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

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

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

DirectDraw提供了以下幾個優點,這些好處在以前只有那些專為特定顯示設備所寫的軟件才能利用。

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

DirectDraw給運行于Windows 95和Windows NT 4.0或更高版本的計算機提供了一個高性能的的游戲圖象引擎。


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

4、為什么要使用DirectDraw?

無庸置疑,人們之所以利用DirectDraw來開發各種游戲以及多媒體應用軟件,是因為DirectDraw可以為他們的應用程序帶來許多強大的功能提升。

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


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

5、DirectX 5.0的新特性


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

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

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

除此之外,DirectDraw的HEL(硬件仿真層)現在可以充分利用Pentium MMX處理器所帶來的多媒體性能的提升。當你第一次創建頁面的時候,DirectDraw會測試你的電腦芯片是否支持MMX。而在一臺非Pentium MMX級別電腦上,這個測試會在調試程序的時候給出一個良性的異常信息,而這個異常并不會影響到你的應用程序執行的穩定性。

DirectDraw接口現在還支持離屏頁面的寬度大于主頁面的寬度。你可以創建這些頁面而不用顧及它的大小,而在以前的版本中,你經常會為了不使頁面寬度大于主頁面而將其分割開來。

DirectDraw接口現在已經能夠支持高級圖形端口(AGP)構架。在裝備了AGP顯卡的系統中,DirectDraw程序開發者將從AGP顯卡的大容量和高傳輸速率中獲益。


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

6、部件對象模型(COM)

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

部件對象模型(Component Object Model, COM)是OLE 的基礎。COM 為OLE提供了編程模型和二進制標準。COM定義并實現了軟部件(如應用程序、數據對象、控件及服務)機制,并把它們統稱為“對象”。每個軟部件對象由數 據以及訪問數據的函數組成,訪問軟部件對象數據的函數的集合稱為“接口”。

從這里可以看出,COM 的設計與C++類非常相似,即一個軟部件對象具有一個內部數據結構和一組外部接口函數,允許通過接口函數對數據進行訪問。因此Microsoft公司把根 據COM執行的對象統稱為Windows對象。但Windows對象與C++中的對象有明顯的差別,Windows對象中沒有公共數據,也沒有成員函數, 因此不能直接訪問數據,也就是說數據是全封裝的。

對象的提供者或服務器必須指明一個或多個接口的定義,每個接口都是相互關聯的一組函數,執行對象的一個特性。每個對象的一個用戶(或稱為“客戶”) 必須擁有一個接口指針才能訪問對象。當客戶有了這個指針后,就可以使用這個對象而無需知道對象的含義,即使客戶運行在不同的進程、不同的機器、不同的操作 系統、由不同的軟件開發而使用不同的語言,或者版本不同。

DirectX SDK接口被創建在COM編程層次表中很基礎的一層。每一個代表設備的對象的接口,比如IDirectDraw、IDirectSound、和 IDirectPlay,是直接從IUnknown OLE接口中派生下來的。這些基本對象的創建被操作于在該對象的動態連接庫中,要比用Win32中專門用來創建COM對象的 CoCreateInstance函數要好得多。

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