多媒體技術13DirectX編程入門_第1頁
多媒體技術13DirectX編程入門_第2頁
多媒體技術13DirectX編程入門_第3頁
多媒體技術13DirectX編程入門_第4頁
多媒體技術13DirectX編程入門_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第 13 章 DirectX 編程入門DirectX 是微軟公司為編寫游戲和其他高性能多媒體應用程序而開發(fā)的一組高級的Windows低層API,它包含了對圖(圖形、視頻和三維動畫)、聲音(聲效與音樂)、輸入 設備和網(wǎng)絡游戲等的支持。本章先概述 DirectX 的基本內容, 然后介紹 DirectX 的主要組件 Direct3D 和 DirectSound 的基本編程方法,并給出若干具體編程實例。13.1 DirectX 概述本節(jié)簡單介紹 DurectX 的發(fā)展歷史、版本和功能的演化、結構和模塊劃分。DurectX 是 Windows 的一種多媒體 API ,它在保持設備無關性的同時,可以讓應用

2、程序 直接控制多媒體設備,從而能充分利用硬件的功能,因此可獲得最高的性能。DurectX 自從推出以來,就始終處在快速發(fā)展的過程之中。它已經(jīng)經(jīng)歷了多個版本,其 模塊和功能也一直在不斷地增加和完善。DirectX 是一種基于 COM 的系統(tǒng),主要由硬件抽象層 HAL 和硬件模擬層 HEL 所構成。 DurectX 被分成若干個組件模塊,涵蓋了多媒體應用的方方面面。而且這些組件的數(shù)目、名 稱和功能,也是隨著其版本的演化而有所增減、改變和加強。13.1.1 歷史微軟公司于1990年5月推出的Windows 3.0大獲成功,它是一種與設備無關的具有圖形 用戶界面(GUI)的操作系統(tǒng)。后來又于1992年

3、3月推出Windows 3.1,提供了對多媒體的 支持。不過 Windows的與設備無關的設計思想,雖然使得 Windows向程序員提供了一個獨 立于硬件的軟件開發(fā)優(yōu)秀平臺,但它不讓應用程序直接操作顯卡和聲卡等多媒體硬件,這樣 就降低了多媒體應用程序(特別是計算機游戲)的運行效率,例如限制了動畫的幀率、不提 供混音功能等。所以當時的 Windows并不是一個可以開發(fā)和運行高效多媒體程序(如 3D游 戲)的理想環(huán)境,逼迫 PC游戲開發(fā)商只好繞開 Windows而仍舊開發(fā)DOS下的游戲。為了改變這種難堪的局面,促使游戲界放棄DOS而使用Windows,微軟需要在設備無關性與高性能之間取得某種平衡,

4、決定為Windows添加一種高性能的動畫機制(以及后來的 輸入與音響等),因此于1995年推出了 Game SDK,后來改名為DirectX。其中的Direct 指 可以直接訪問多媒體硬件;X指它的不同組成部分,如 Direct3D、DirectSound、DirectInput 和 DirectPlay 等。13.1.2版本與功能因為DirectX必須支持多媒體設備的最新技術和功能,而多媒體硬件(尤其是顯卡的3D性能)和技術始終處在高速發(fā)展過程中,所以DirectX的技術和版本也同樣在不斷地發(fā)展和演變,其中發(fā)展最快的是3D接口部分。下面列出DirectX的主要版本的發(fā)布時間、弓I入的新模塊和

5、特性:1.01995 年 9 月 30 日: DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup;2.01996年6月5日:引入Direct3D (次版本有2.0a);3.01996年 9月 15 日:支持 MMX、為 DirectSound 補充 DirectSound3D API (次版 本有3.0a);4.0無此版本號;5.0 1997年7月16日:有許多改進,如受力反饋控制器、多顯示器支持、新的游戲 控制面板、用戶界面的全面改進等(次版本有5.1和5.2);6.01998年8月7日:添加新的3D特性(如添加DXUT框架)、

6、支持AMD公司 的3DNow!技術、性能較5.0有提高。在1999年2月3日推出的6.1版中,添加了DirectMusic 模塊;7.0 1999年9月22日:改進3D圖形和聲音、性能更快,為 Direct3D API引入硬件 傳送、光照和紋理壓縮、以及硬件加速,引入D3DX工具庫。使用Creative公司的EAX 技術改進3D聲音的算法(次版本有7.0a和7.1);8.0 2000年9月30日:將 DirectDraw與Direct3D完全集成在一起、其中 Direct3D 的性能有了本質上的飛躍(引入頂點/像素shader著色引擎/光照模型卜支持硬件點精靈 和三維體紋理),將DirectM

7、usic與 DirectSound更緊密地集成在一起構成 DirectX Audio ,更新了 DirectInput 與 DirectPlay,添加了 DirectShow、拋棄了其余的 DirectX Media 模塊。 2001年11月11日推出的8.1版,被集成在 Windows XP中銷售,該版本添加了從 DirectShow分離出的DMO( DirectX Media Objects媒體對象)組件模塊。它還支持許 多新的圖形特性,如像素著色引擎的1.21.4版、動態(tài)/高分辨率紋理、新3D擴展方法等(次版本有 8.0a、8.1、8.1a和 8.1b);9.0 2002年12月24日:

8、添加許多新特性到 DirectX Graphics和DirectShow中,例 如將DirectDraw的功能并入到Direct3D之中,支持頂點和像素著色引擎的新版本2.0和3.0,弓I入裁剪測試、位移貼圖和多元紋理,支持128位浮點著色精度和根據(jù)顯示器應用程序Windows TAPIWindows API 子系統(tǒng) (GDI、MMAPI、MCI、)DirectX自動調整丫值等。也添加若干 新特性至U DirectInput、Windows驅動程序接口PC硬件子系統(tǒng)DirectPlay、DirectSound 和 DirectMusic中。(次版本有 9.0a、9.0b 和 9.0c)。Dir

9、ectX的最后一個以數(shù)字和 字母命名的版本是2004年8 月9日推出的9.0c,后來又 于2004年10月、2005年的2/4/6/8/10月分別推出了它的多個升級版。從 2005年12月推出的DirectX開始,其版 本的命名發(fā)生了變化:主版本號改為DX,次版本改為發(fā)布的年月。一般是每兩個月推 出一個新版本,因此也叫做 DirectX 9.0c的雙月更新(bimonthly update。當前最新 版本為2006年10月11日推出的DX October 2006。它們都包含了(于 2002年推出的 專為.NET框架設計的)托管(Managed) DirectX ,將原來DirectX多個分離

10、的COM模 塊集成到了一個容易使用的單一 CLR文件之中。10? : DirectX不會有第10版了,因為微軟公司已將 DirectX的功能集成進其新一 代操作系統(tǒng) Windows Vista中,而不再將其作為一個額外的模塊了。但是會有 Direct3D10,已于2006年12月13日隨Direct3D SDK的December 2006版一起發(fā)布,并被嵌入 到Windows Vista中。另外,作為學生和業(yè)余愛好者的 DirectX替代產品,微軟公司于 2004年3月24日宣布了用于托管運行環(huán)境下計算機游戲的設計、 開發(fā)和管理的框架和 工具集 XNA,并于 2006 年 12 月 11 日推

11、出了 XNA Framework Redistributable 和 XNAGame Studio Express的 1.0 版,可用于 Windows 和 Xbox 360 游戲的開發(fā)。13.1.3 結構DirectX是一種基于COM (Component Object Model,組件對象模型)的系統(tǒng),它既不 屬于驅動程序層,也不屬于應用層。DirectX的主要設計目標是在提供某種設備獨立性的同時 獲取高速度,為此微軟公司為 DirectX設計了如圖13-1所示的體系結構。其中:HAL = Hardware Abstract Layer (硬件抽象層)負責檢測本機的硬件功能,并以一種獨立于

12、設備的方圖13-1 DirectX子系統(tǒng) 式提供這些功能;HEL = Hardware Emulation Layer (硬件模擬層)負責提供 DirectX功能中本機硬件不支持部分的模擬實現(xiàn)。但是從8.0版起,DirectX就不再提供硬件模擬層 HEL 了,需要開發(fā)商、第三方或自 己來編寫一個 PSD (Pluggable Software Device可插式軟件設備)連到 DirectX提供的HEL 接口上,稱之為參考設備。但是現(xiàn)在很少有這樣的PSD可用,因此新版本的 DirectX是嚴重依賴于硬件的。13.1.4 組成DirectX由多個(COM組件)模塊組成,而且隨著版本的演化,這些模

13、塊也在不斷地增 減、合并和改變。最新的 DirectX組件的模塊構成如圖13-2所示,括號中的數(shù)字為該模塊被 首次引進(或移出)的版本號。下面是DirectX的主要組成模塊的簡單介紹:DirectX Graphics (圖形)包括 DirectDraw 和 Direct3D :DirectDraw (繪制)一一二維圖形繪制(高速位圖傳送/視頻與2D動畫)。 從9.0版起,DirectDraw已被集成到了 Direct3D之中。Direct3D(三維)三維圖形繪制。分成保留(retained)和立即(immediate)兩種模式(mode):保留模式是一種高層 API,建立在立即模式之上,使用

14、起來方便容易,但是效率不高,適合于初學者;立即模式則是一種底層 API, 使用復雜,但是其效率比保留模式高得多。大多數(shù) DirectX應用程序,特別 是計算機游戲,都是采用立即模式進行開發(fā)。自從6.0版以來,保留模式API 的發(fā)展停滯不前,而立即模式API的發(fā)展卻日新月異。不論是保留模式還是立即模式,Direct3D都是建立在 DirectDraw之上的。從9.0版起,Direct3D 包含了 DirectDraw,它像OpenGL 樣也具有二維圖形繪制的功能。Direct3D 的下一個版本為 Durect3D 10,為 Windows Vista的一個有機組成部分。D3DX (Direct3

15、D擴展)一一為Direct3D服務的實用工具庫,執(zhí)行公 共的數(shù)學計算和一些復雜的任務,包含若干簡化 3D模型使用的類,如 粒子系統(tǒng)(particle system)。D3DX由動態(tài)鏈接庫(DLL )提供。DXUT (編程框架) 建立在Direct3D API之上的樣例框架,也叫 通用文件框架,可以幫助程序員減少在繁瑣的平凡工作(如創(chuàng)建窗口、 創(chuàng)建設備、處理 Windows消息和設備事件等)上所花的時間。DirectXXNA(Xbox/Vista) DirectDraw (1.0);DirectSound (1.0)J DirectSound 3D (3.0)DirectX Audio (8.0

16、) |DirectMusic (6.1)Directlnput (1.0)| XACT (9.0c 2006.2)Xlnput (9.0c 2005.10)DirectPlay (1.0)= - 建議用 WinSocket 和 WinFirewall API 代替(9.0c)- -1 Xbox Live (Vista)Media Foundation (Vista)DirectSetup (1.0)DirectX Media Objects (8.1) 4并入(8.0)分出(8.1) 移入平臺sdkDirectShow (5.0)(9.0c 2005.4)并入(6.0)*LDTectX Med

17、ia_(5.0) 移入 WindowsMedia SDK (8.0)DirectAnimation (5.0)DirectX視頻加速(5.0)Direct3D 保留模式(5.0)DirectX Transform (5.0)圖13-2 DirectX的組成模塊DirectX Audio (音頻)包括 DirectSound 和 DirectMusic :DirectSound (聲音)一一主要針對波形音頻,底層接口。可用于開發(fā)播放 和捕捉波形音頻的高性能立體與三維(DirectSound 3D)音頻應用程序。在下一 代 DirectX 中,DirectSound 的功能將由 XACT( Mic

18、rosoft Cross-Platform Audio Creation Tool微軟跨平臺音頻生成工具)來代替。DirectMusic (音樂)一一主要針對 MIDI音樂,高層接口。為基于波形、 MIDI聲音或DirectMusic生成器所創(chuàng)造的動態(tài)內容之音樂和非音樂聲道提供 一個完整的解決方案。XACT (游戲音頻)XACT ( Microsoft Cross-Platform Audio CreationTool,微軟跨平臺音頻生成工具),是一種多人合作的音頻設計工具和相關 API,用于游戲的動態(tài)音頻開發(fā)。DirectInput (輸入)提供對各種輸入設備的支持,包括對受力反饋(forc

19、e-feedback)技術的全面支持。在下一代 DirectX 中,DirectInput 將被 Xlnput 代 替。DirectPlay (游戲)一一提供對多人網(wǎng)絡游戲的支持。在最新的DirectX版本中,微軟公司反對(deprecate使用DirectPlay,而建議改用 Windows Sockets和 Windows Firewall API 來代替。在下一代 DirectX 中,DirectPlay 可能會被 Xbox Live 代替。DirectSetup (安裝)提供DirectX組件的一次性調用安裝的一個簡單API (自 動安裝DirectX驅動程序)。DirectShow

20、(展示)一一提供多媒體(音視頻)流的高質量捕捉和重放。在8.0版之前,DirectShow是DirectX Media的一個組成模塊。到8.0版時,因為DirectX SDK 拋棄了 DirectX Media,所以才將 DirectShow 集成到了 DirectX 之中。在 DirectX 9.0c的2005年4月升級版中,DirectShow又被移出DirectX,放入微軟公司的平臺 SDK之中。DirectX Media Objects (媒體對象DMO) 基于COM的多媒體和數(shù)據(jù)流組件, 支持音視頻的編解碼器和特效。是在 DirectX的8.1版時,從DirectShow分出的, 其

21、功能類似于DirectShow的過濾器。DirectX Media (媒體)一一是一個用于流媒體應用的外部 API集合。在DirectX 6.0 之前,DirectX Media SDK 和 DirectX SDK 是兩個分離的 SDK。在 6.0版時 DirectX Media SDK被集成到 DirectX SDK之中。DirectX Media的運行模塊,被集成到 Windows 和 IE 之中。到了 8.0 版時,DirectX Media 又被 DirectX SDK 拋棄(其核 心模塊DirectShow被集成到了 DirectX之中),其功能被隨 Windows 2000 Ser

22、ver 推出的 Windows Media SDK所代替。DirectX Transform (變換)用于產生二、三維圖形的各種效果,如a混色和表面彎曲等。DirectAnimation (動畫)集成多種媒體類型來創(chuàng)建復雜動畫,并可用作網(wǎng)頁內容。DirectX Video Acceleration (視頻加速 DXVA )利用硬件加速二維視頻的解碼操作。Direct3D Retained Mode (保留模式)Direct3D的保留模式是一種高層API,建立在Direct3D立即模式之上,使用起來方便容易,但是效率不高, 適合于初學者。DirectShow (展示)一一支持音視頻流的高質量采集

23、和重放。13.1.5編程準備為了用VC編寫DirectX應用程序,必須先下載并安裝DirectX SDK,并進行必要的頭/庫文件路徑和鏈接庫的設置。下面以Windows XP中文版環(huán)境下的 Visual C+ 2005中文版和 DirectX 9.0c August 2006 SDK為例,介紹進行具體的DirectX編程之前,所需做的必要準備工作。下載并安裝DirectX SDK可以從微軟公司的官方網(wǎng)站(/windows/directx/ )下載最新的DirectX SDK,如 dxsdk_dec2006.exe448MB)。安裝完成后,會在安裝目

24、錄(缺省為“C:Program FilesMicrosoft DirectX SDK (December 2006) ”)中生成 Developer Runtime Documentation、 In elude、Lib、Redist、Samples和Utilities等多個子目錄。安裝時還會為 Win dows操作系統(tǒng) 生成名為“ Microsoft DirectX SDK (December 2006) ”的程序組,包含多個子程序組和程序。安裝程序會將DirectX SDK的幫助文檔,也安裝到Visual Studio 2005的幫助系統(tǒng)內,位 于其“目錄 /DirectX SDK (De

25、cember 2006)” 目錄之中,包含 “DirectX SDK (December 2006)C+ ”和DirectX SDK (December 2006) Man aged ”兩個幫助子目錄。設置包含和庫路徑在Visual Studio 2005中文版的IDE中,選“工具/選項”菜單項,打開“選項”對話框 (參見圖13-5)。圖 13-5 Visual Studio 2005的 “選項”對話框再選該對話框左邊的“項目和解決方案/VC+目錄”路徑,在右邊的“顯示以下內容的目錄”欄的下拉式列表框中,選“包含文件”項。按該欄下面的“新行”鈕匚,則在其下方的顯示欄中會出現(xiàn)新行,再按新行右端的

26、帶省略號的瀏覽鈕二,在彈出的“選擇目錄”對話框中,選擇 DirectX SDK 的 Include 目錄所在的路徑“ C:Program FilesMicrosoft DirectX SDK (August 2006)Include ”,然后按“打開”關閉“選擇目錄”對話框。結果參見圖13-6。圖13-6設置DirectX的“包含文件”的路徑可類似選擇庫文件”項,添加庫文件路徑C:Program FilesMicrosoft DirectX SDK(August 2006)Libx86”,結果參見圖13-7。最后,按“確定”鈕,關閉“選項”對話框。圖13-7設置DirectX的“庫文件”的路徑

27、注意,對DirectX的包含路徑和庫路徑的設置,對所有項目都有效。設置鏈接庫先創(chuàng)建一個DirectX應用程序的MFC單文檔項目(如DxTest),再在VS05的IDE中, 選“項目/屬性”,打開“ DxTest屬性頁”對話框。在左上角的“配置”欄中,選中“所有配 置”項;再選左邊的路徑“配置屬性 /鏈接器/輸入”,在右邊的“附加依賴項”欄中,添加 d3d9.lib d3dx9.lib d3dxof.lib dsound.lib dxguid.lib winmm.lib 等鏈接庫(在多個庫文件之間,用 空格分隔)。具體添加哪些DirectX庫,與具體應用程序所使用的 DirectX模塊有關,你也

28、可 以查看DirectX的庫目錄。最后,按“應用”鈕和“確定”鈕,關閉屬性頁對話框。參見圖13-8。圖13-8 設置DirectX的鏈接庫注意,對DirectX鏈接庫的設置,只對 VC05中當前打開的單個項目有效。在安裝了 DirectX SDK,并設置好文件路徑和鏈接庫后,就可以開始編寫具體的DirectX 應用程序了。DirectX的組件眾多、功能強大、編程復雜,完整的介紹需要幾本大部頭的專著才行, 本書只準備簡單介紹 DirectX的最主要模塊一一Direct3D和DirectSound編程的最基本內容。13.2 Direct3D 編程簡介Direct3D (直接三維)是 DirectX

29、的核心模塊,新版本的 Direct3D中還包含原來 DirectDraw模塊的2D功能。因此,現(xiàn)在的Direct3D是DirectX Graphics的唯一模塊,具有 DirectX (二、三維)圖形的全部功能。13.2.1流水線與設備Direct3D 用圖形流水線(graphics pipelin來處理和渲染場景(render scene,而 Direct3D 設備(device)是執(zhí)行變換(transformation)和光照(lighting )等操作的渲染部件。Direct3D圖形流水線可通過Direct3D圖形流水線來充分利用硬件性能,以提供高效處理和繪制Direct3D場景到顯示器

30、的能力。圖13-9為流水線(pipeline,管線/管道/流程)的組成模塊框圖。圖13-9 Direct3D圖形流水線Direct3D 設備Direct3D設備(device)是Direct3D的渲染部件,它封裝和存儲渲染狀態(tài)。另外,它還 執(zhí)行變換和光照等操作,并且光柵化圖像到表面(如屏幕)。在結構上,Direct3D設備包含變換模塊(transformation module)、光照模塊(lighting module)和光柵化器(rasterizer)。圖 13-10為 Direct3D 的設備架構(architecture)。當前,Direct3D有兩種主要的設備類型:HAL 設備(ha

31、l device)Direct3D設備架構變換模塊|光照模塊| 光柵化器圖13-10 Direct3D設備架構具有硬件加速的光柵化(rasterizatio n),可同時使用硬件和軟件的頂點處理進行著色(shadi ng)。參考設備(referenee device)由軟件驅動程序提供,現(xiàn)在主要用于性能測試。具有軟件特性的參考設備不一定能提供與硬件等同的性能,因此應用程序必須總是查詢設備的能力以確定其支持哪些特性。13.2.2基本編程過程Direct3D的基本編程過程如圖13-11所 示。下面各小節(jié)依次介紹 Direct3D編程的基 本步驟和方法。13.2.3創(chuàng)建和初始化對象為了使用Direc

32、t3D,你必須首先創(chuàng)建一 個應用窗口,然后再創(chuàng)建和初始化Direct3D對象。利用這些對象所實現(xiàn)的COM接口來操 作它們,以創(chuàng)建繪制場景所需的其它對象。如果進行MFC編程,則可以省略創(chuàng)建窗 口這一步,而直接使用視圖類所代表的客戶 區(qū)窗口。Direct3D對象、創(chuàng)建 Direct3D設備和圖13-11 Direct3D編程的基本過程F面介紹的是初始化Direct3D的內容,包括創(chuàng)建設置Direct3D設備的渲染(render著色)狀態(tài)等。創(chuàng)建Direct3D對象可使用全局函數(shù) Direct3DCreate9來創(chuàng)建Direct3D接口對象:IDirect3D9 * Direct3DCreate9(

33、/ 成功返回指向 IDirect3D9 接口的指針,失敗返回 NULLUINT SDKVersion / 必須為 D3D_SDK_VERSION);例如:IDirect3D9 * g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );創(chuàng)建Direct3D設備可使用IDirect3D9接口的CreateDevice方法來創(chuàng)建設備(尾參數(shù)的返回值):HRESULT CreateDevice( / 成功返回 D3D_OK( = 0)UINT Adapter, / 顯卡(display adapte)序號,D3DADAPTER_DEFAULT 為主顯卡D3DDEVTY

34、PE DeviceType, / 設備的枚舉類型,一般取為 D3DDEVTYPE_HAL HWND hFocusWindow,/ 焦點窗口句柄,可取為 this-m_hWndDWORD BehaviorFlags, /控制設備的創(chuàng)建行為之選項組合,可以采用硬件或軟件/ 的頂點處理,如 D3DCREATE_SOFTWARE_VERTEXPROCESSINGD3DPRESENT_PARAMETERS * pPresentationParameters, /指向展現(xiàn)參數(shù)結構/ D3DPRESENT_PARAMETERS 的指針I(yè)Direct3DDevice9 * ppReturnedDeviceln

35、teface / 代表被創(chuàng)建設備的/ IDirect3DDevice9返回接口的指針地址);其中,展現(xiàn)參數(shù)結構 D3DPRESENT_PARAMETERS的定義為:typedef struct D3DPRESENT_PARAMETERS / 展現(xiàn)參數(shù)結構UINT BackBufferWidth, BackBufferHeight; / 后臺緩沖區(qū)的寬高(以像素為單位),/對窗口模式可取為0,對全屏模式則必須與當前顯卡枚舉模式的一致D3DFORMAT BackBufferFormat; / 后臺緩沖區(qū)的格式,可取為/ D3DFMT_UNKNOWN ( = 0)UINT BackBufferCou

36、nt; /后臺緩沖區(qū)計數(shù),可取為 03,取0時等價于1D3DMULTISAMPLE_TYPE MultiSampleType; / 多樣本類型,一般取為/ D3DMULTISAMPLE_NONE ( = 0)DWORD MultiSampleQuality; / 多樣本質量水平,一般取 0D3DSWAPEFFECT SwapEffect; / 交換效果,可取為/ D3DSWAPEFFECT_DISCARD (= 1 )、D3DSWAPEFFECT_FLIP (= 2)/ 和 D3DSWAPEFFECT_C0PY (= 3 )等枚舉值HWND hDeviceWindow; /設備窗口的句柄,對窗

37、口模式可取為NULL ( = 0)BOOL Windowed; /應用程序在窗口 /全屏中運行時取 TRUE/FALSEBOOL EnableAutoDepthStencil; / 允許自動深度模板,為 TRUE 則由 Direct3D/來管理應用程序的深度緩沖區(qū)D3DFORMAT AutoDepthSte ncilFormat; / 自動深度模板格式,可取 / D3DFMT_D16、D3DFMT_D24S8 和 D3DFMT_D32 等枚舉值DWORD Flags; /表現(xiàn)標志 D3DPRESENTFLAG 常數(shù)之一,可取為 0UINT FullScreen_RefreshRate InHz

38、; /全屏時的屏幕刷新率,對窗口模式必須為0UINT Prese ntatio nln terval; /前后臺緩沖區(qū)交換的最大速率,可取為/ D3DPRESENT_INTERVAL_DEFAULT( = 0) D3DPRESENT_PARAMETERS;例如:/設置創(chuàng)建D3D設備用的表現(xiàn)結構D3DPRESENT_PARAMETERS d3dpp; / 定義表現(xiàn)結構變量ZeroMemory( &d3dpp, sizeof(d3dpp) ); / 內存清零d3dpp.Windowed = TRUE; / 窗口模式d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

39、/ 放棄交換效果 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; / 未知格式 d3dpp.EnableAutoDepthStencil = TRUE; / 允許自動深度模板 d3dpp.AutoDepthStencilFormat = D3DFMT_D16; / 16 位深度緩沖 LPDIRECT3DDEVICE9 g_pd3dDevice; / 定義 D3D 設備接口 的指針/創(chuàng)建D3D設備對象(獲取D3D設備接口的指針)g_pD3D-CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, this-m_hWnd

40、, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice );設置設備的渲染狀態(tài)利用IDirect3D9接口的CreateDevice方法所返回的設備接口 IDirect3DDevice9的指針, 可以調用該接口的設置渲染(render著色)狀態(tài)方法SetRenderState來初始化設備:HRESULT SetRenderState(/ 成功返回 D3D_OK( = 0)D3DRENDERSTATETYPE State, / 設備狀態(tài)DWORD Value / 設置值);其中,設備狀態(tài)State,可取D3DRENDERSTATE

41、TYPE 枚舉的任意值,女口 D3DRS_ZENABLE (允許 Z 緩沖)、D3DRS_FILLMODE (填充模式)、D3DRS_SHADEMODE (陰影模式)、 D3DRS_ALPHATESTENABLE (允許a測試)、D3DRS_CULLMODE (易V除模式)、D3DRS_FOGENABLE (允許霧化)、D3DRS_LIGHTING (光照)、D3DRS_DITHERENABLE (允許抖動)、 。例如:g_pd3dDevice-SetRe nderState( D3DRS_CULLMODE, D3DCULL_NONE ); / 關閉背面剔除g_pd3dDevice-SetRe

42、nderState( D3DRS_ZENABLE, TRUE ); / 允許 Z 緩沖圖13-12 3D圖元表面的三角網(wǎng)格g_pd3dDevice-SetRenderState( D3DRS_LIGHTING, FALSE ); / 關閉光照13.2.4創(chuàng)建場景三維場景是由若干物體(幾何對象)構成的, 復雜的幾何對象由多個簡單的圖元(點、線、三 角形和多邊形等)所組成,而圖元(primitive )又是頂點(vertex)的集合。3D圖元一般是一個多面體,通常用其表面的三角網(wǎng)格來表示,參見圖13-12。所以最基本的圖元是三角形和頂點。創(chuàng)建場景中的幾何對象,等價于建立表示該幾何體的頂點集合。因此

43、,必須先定義自己 的頂點結構并創(chuàng)建頂點緩沖區(qū),然后在鎖定頂點緩沖區(qū)后,再通過給頂點緩沖區(qū)中的各頂點 結構賦值來構造幾何對象,最后解鎖頂點緩沖區(qū)。定義頂點結構Direct3D使用一種FVF ( Flexible Vertex Format可變頂點格式)結構來定義頂點,以滿 足用戶的不同需要。在 FVF結構CUSTOMVERTEX 中,可以包含描述頂點的位置、RHW(reciprocal homogeneous W倒數(shù)齊次w,表示已變換頂點位置的齊次坐標 w分量)、法向、 大小和(漫射、鏡面反射)顏色等字段,具體內容由用戶根據(jù)需要自己來確定,但是各字段 之間的相對順序不能改變。其中,頂點的位置和法

44、向等字段,一般為三維點向量,可以用Direct3D的擴展三維向量 結構D3DXVECTOR3來表示:typedef struct D3DXVECTOR3 FLOAT x; FLOAT y; FLOAT z; D3DXVECTOR3; 其中的FLOAT為float的typedef類型,定義在windef.h頭文件中。而顏色一般采用 DWORD 的 typedef 定義類型 D3DCOLOR。例如:struct CUSTOMVERTEX /含位置、法向量和顏色的自定義頂點結構 D3DXVECTOR3 position; /未變換頂點的3D位置 D3DXVECTOR3 normal; /頂點的表面法

45、向量 D3DCOLOR color; / 顏色;或:struct CUSTOMVERTEX /含位置、顏色和紋理坐標的自定義頂點結構 D3DXVECTOR3 position; /未變換頂點的3D位置 D3DCOLOR color; / 顏色FLOAT tu, tv; / 紋理坐標;或:struct CUSTOMVERTEX /含位置齊次坐標和顏色的自定義頂點結構 FLOAT x, y,乙rhw; /已變換頂點的3D位置 DWORD color; / 顏色;用戶在定義了自己的頂點結構類型后,還需要定義一個對應的(宏)常量,來描述該結構的字段內容。該(宏)常量由若干表示頂點格式的標志位符號常量(

46、參見表13-1)的位或組合而成。表13-1頂點數(shù)據(jù)格式標志符號常量值數(shù)據(jù)類型描述D3DFVF XYZ0x002float, float, float未轉換的頂點坐標D3DFVF XYZRHW0x004float, float, float, float已轉換的頂點坐標D3DFVF XYZB150x006/8/a/c/e1- 3 個 float含權重i的頂點坐標D3DFVF XYZW0x4002float, float, float, float已轉換和裁剪的頂點坐標D3DFVF NORMAL0x010float, float, float頂點的法線D3DFVF PSIZE0x020float點

47、大小D3DFVF DIFFUSE0x040DWORD(ARGB)漫射顏色D3DFVF SPECULAR0x080DWORD(ARGB)鏡面反射顏色D3DFVF TEX080x08001- 4 個 floati重紋理映射例如:#defi ne D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)或:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)或:const DWORD FVF = (D3DFVF_XYZRHW | D3DF

48、VF_DIFFUSE);創(chuàng)建頂點緩沖區(qū)在定義了頂點結構后,就可以創(chuàng)建頂點緩沖區(qū)了,這可以由IDirect3DDevice9接口的CreateVertexBuffer 方法來完成:HRESULT CreateVertexBuffer( / 成功返回 D3D_OK( = 0)UINT Length, / 緩沖區(qū)的字節(jié)大小,一般為n*sizeof (CUSTOMVERTEX)DWORD Usage, /緩沖區(qū)用法的附加屬性標志,一般為0DWORD FVF, /頂點結構格式常量D3DPOOL Pool, /緩沖區(qū)所在的內存池類型(D3DPOOL枚舉值) IDirect3DVertexBuffer9*

49、ppVertexBuffer, / 返回被創(chuàng)建的頂點緩沖區(qū)指針 HANDLE* pSharedHandle / 保留,設為 NULL);其中,內存池類型D3DPOOL枚舉的定義為:typedef enum D3DPOOL /內存池類型枚舉D3DPOOL_DEFAULT = 0, / AGP 存儲器或顯存D3DPOOL_MANAGED = 1, / AGP 存儲器或顯存,且在系統(tǒng)內存中還有一份拷貝D3DPOOL_SYSTEMMEM = 2, / 系統(tǒng)內存D3DPOOL_SCRATCH = 3, /系統(tǒng)內存中的臨時池 D3DPOOL_FORCE_DWORD = 0x7fffffff / 未使用(強

50、制該枚舉被編譯成 32位) D3DPOOL;例如:g_pd3dDevice-CreateVertexBuffer( 100 * sizeof (CUSTOMVERTEX), 0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL );或: g_pd3dDevice-CreateVertexBuffer( 3 * sizeof (CUSTOMVERTEX), 0, FVF, D3DPOOL_MANAGED, &g_pVB, NULL );構造點集創(chuàng)建三維場景中的幾何對象,需要計算和構造描述該幾何對象的點集。具體做法是:先 定義一個頂點指針(用于操

51、作頂點數(shù)組);再調用Lock方法來獲取頂點緩沖區(qū)的首地址(賦 值給頂點指針),并鎖定該區(qū)域僅供當前操作使用;然后利用該頂點指針,將計算的頂點結 構值填入頂點緩沖區(qū),從而構造出幾何對象;最后調用Unlock方法解鎖頂點緩沖區(qū)。IDirect3DVertexBuffer9 接口的 Lock 和 Un lock 方法的定義為:HRESULT Lock( / 成功返回 D3D_OK( = 0)UINT OffsetToLock, /鎖定的偏移地址UINT SizeToLock, /鎖定的字節(jié)數(shù)VOID * ppbData, /返回被鎖定的緩沖區(qū)頭的指針DWORD Flags /鎖定方式標志,可為0或下

52、列符號常量的組合:/ D3DLOCK_DISCARD、D3DLOCK_NO_DIRTY_UPDATE、/ D3DLOCK_NOSYSLOCK、D3DLOCK_READONLY、/ D3DLOCK_NOOVERWRITE);HRESULT Unlock(); / 成功返回 D3D_OK( = 0)例如:CUSTOMVERTEX* pVertices;g_pVB-Lock( 0, 0, (void* )&pVertices, 0 );/給頂點緩沖區(qū)中的各頂點結構賦值(構造幾何對象的點集)g_pVB- Un lock();1325矩陣變換描述單個物體(3D幾何對象)一般采用的是本地相對坐標。因此,在

53、渲染之前,需要將它們都轉換為描述場景的統(tǒng)一世界空間(world space坐標,這對應于世界矩陣變換。為了將三維場景顯示在二維屏幕上, 還需要選擇一個觀察點(眼睛/攝像機)和觀察角度 (方向/坐標)(對應于觀察坐標矩陣變換),并將3D場景投影到一個2D平面(屏幕)上(對應于投影矩陣變換),還要將超出屏幕的部分去掉(裁剪),也可以將場景投射到屏幕 的某個矩形區(qū)域中(視口縮放)。參見圖 13-13。變換引擎圖13-13 Direct3D的變換引擎F面依次對這些變換加以介紹,這需要首先介紹Direct3D中的矩陣定義和變換方法。矩陣與變換在 Direct3D 中,定義了矩陣(matrix)結構 D3

54、DXMATRIX :typedef struct D3DXMATRIX / 矩陣結構struct /注意,C/C+的變量名可以下劃線開頭(但不能以數(shù)字開頭)FLOAT _11; FLOAT _12; FLOAT _13; FLOAT _14;FLOAT _21; FLOAT _22; FLOAT _23; FLOAT _24;FLOAT _31; FLOAT _32; FLOAT _33; FLOAT _34;FLOAT _41; FLOAT _42; FLOAT _43; FLOAT _44;_11_12_13_14 D3DXMATRIX;_21_22_23_24對應于4*4的浮點矩陣:_3

55、1_32_33_3441424344在Direct3D中,還定義了一個對Intel P4 CPU運算進行了優(yōu)化的16字節(jié)對齊的矩陣結構(從D3DXMATRIX 派生的C+結構對象):typedef struct _D3DXMATRIXA16 : public D3DXMATRIX / 16字節(jié)對齊矩陣結構_D3DXMATRIXA16();_D3DXMATRIXA16( CONST FLOAT * f);_D3DXMATRIXA16( CONST D3DMATRIX & m);_D3DXMATRIXA16( FLOAT _11, FLOAT _12, FLOAT _13, FLOAT _14,FLOAT _21, FLOAT _22, FLOAT _23, FLOAT _24,FLOAT _31, FLOAT _32, FLOAT _33, FLOAT _34, FLOAT _41, FLOAT _42, FLOAT _43, FLOAT _44 );void* operator n ew(size_t s);void* operator n ew(size_t s);void operator delete(void* p);void operator delete(void* p);struct _D3DXMATRIXA16 & operato

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論