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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

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

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

3、供了一個獨立于硬件的軟件開發(fā)優(yōu)秀平臺,但它不讓應(yīng)用程序直接操作顯卡和聲卡等多媒體硬件,這樣就降低了多媒體應(yīng)用程序(特別是計算機游戲)的運行效率,例如限制了動畫的幀率、不提供混音功能等。所以當(dāng)時的Windows并不是一個可以開發(fā)和運行高效多媒體程序(如3D游戲)的理想環(huán)境,逼迫PC游戲開發(fā)商只好繞開Windows而仍舊開發(fā)DOS下的游戲。為了改變這種難堪的局面,促使游戲界放棄DOS而使用Windows,微軟需要在設(shè)備無關(guān)性與高性能之間取得某種平衡,決定為Windows添加一種高性能的動畫機制(以及后來的輸入與音響等),因此于1995年推出了Game SDK,后來改名為DirectX。其中的Dir

4、ect指可以直接訪問多媒體硬件;X指它的不同組成部分,如Direct3D、DirectSound、DirectInput和DirectPlay等。.2 版本與功能因為DirectX必須支持多媒體設(shè)備的最新技術(shù)和功能,而多媒體硬件(尤其是顯卡的3D性能)和技術(shù)始終處在高速發(fā)展過程中,所以DirectX的技術(shù)和版本也同樣在不斷地發(fā)展和演變,其中發(fā)展最快的是3D接口部分。下面列出DirectX的主要版本的發(fā)布時間、引入的新模塊和特性:n 1995年9月30日:DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup;n 1996年6月5日:引

5、入Direct3D(次版本有);n 1996年9月15日:支持MMX、為DirectSound 補充DirectSound3D API(次版本有);n 無此版本號;n 1997年7月16日:有許多改進,如受力反饋控制器、多顯示器支持、新的游戲控制面板、用戶界面的全面改進等(次版本有和);n 1998年8月7日:添加新的3D特性(如添加DXUT框架)、支持AMD公司的3DNow!技術(shù)、性能較有提高。在1999年2月3日推出的版中,添加了DirectMusic模塊;n 1999年9月22日:改進3D圖形和聲音、性能更快,為Direct3D API引入硬件傳送、光照和紋理壓縮、以及硬件加速,引入D3

6、DX工具庫。使用Creative公司的EAX技術(shù)改進3D聲音的算法(次版本有和);n 2000年9月30日:將DirectDraw與Direct3D完全集成在一起、其中Direct3D的性能有了本質(zhì)上的飛躍(引入頂點/像素shader著色引擎/光照模型、支持硬件點精靈和三維體紋理),將DirectMusic與 DirectSound更緊密地集成在一起構(gòu)成DirectX Audio,更新了DirectInput與DirectPlay,添加了DirectShow、拋棄了其余的DirectX Media模塊。2001年11月11日推出的版,被集成在Windows XP中銷售,該版本添加了從Direc

7、tShow分離出的DMO(DirectX Media Objects媒體對象)組件模塊。它還支持許多新的圖形特性,如像素著色引擎的版、動態(tài)/高分辨率紋理、新3D擴展方法等(次版本有、和);n 2002年12月24日:添加許多新特性到DirectX Graphics和DirectShow中,例如將DirectDraw的功能并入到Direct3D之中,支持頂點和像素著色引擎的新版本和,引入裁剪測試、位移貼圖和多元紋理,支持128位浮點著色精度和根據(jù)顯示器自動調(diào)整值等。也添加若干新特性到DirectInput、DirectPlay、DirectSound和DirectMusic中。(次版本有、和)。

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

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

10、和XNA Game Studio Express的版,可用于Windows和Xbox 360游戲的開發(fā)。Windows API應(yīng)用程序Windows API子系統(tǒng)(GDI、MMAPI、MCI、.)Windows驅(qū)動程序接口DirectXHELHALPC硬件子系統(tǒng)DirectX.3 結(jié)構(gòu)圖13-1 DirectX子系統(tǒng)DirectX是一種基于COM(Component Object Model,組件對象模型)的系統(tǒng),它既不屬于驅(qū)動程序?qū)樱膊粚儆趹?yīng)用層。DirectX的主要設(shè)計目標(biāo)是在提供某種設(shè)備獨立性的同時獲取高速度,為此微軟公司為DirectX設(shè)計了如圖13-1所示的體系結(jié)構(gòu)。其中:n HA

11、L = Hardware Abstract Layer(硬件抽象層)負責(zé)檢測本機的硬件功能,并以一種獨立于設(shè)備的方式提供這些功能;n HEL = Hardware Emulation Layer(硬件模擬層)負責(zé)提供DirectX功能中本機硬件不支持部分的模擬實現(xiàn)。但是從版起,DirectX就不再提供硬件模擬層HEL了,需要開發(fā)商、第三方或自己來編寫一個PSD(Pluggable Software Device可插式軟件設(shè)備)連到DirectX提供的HEL接口上,稱之為參考設(shè)備。但是現(xiàn)在很少有這樣的PSD可用,因此新版本的DirectX是嚴重依賴于硬件的。13.1.4 組成DirectX由多個

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

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

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

15、ic (6.1)DirectSound 3D (3.0)DirectInput (1.0)DirectPlay (1.0)DirectSetup (1.0)DirectX Media (5.0)DirectShow (5.0)DirectAnimation (5.0)DirectX視頻加速 (5.0)Direct3D保留模式 (5.0)DirectX Transform (5.0)并入(9.0)移入平臺SDK ( 2005.4)建議用WinSocket和WinFirewall API代替 ()并入(8.0)移入Windows Media SDK (8.0)XInput ( 2005.10)Xb

16、ox Live (Vista)Media Foundation (Vista)XACT ( 2006.2)XNA (Xbox/Vista)DirectX Media Objects (8.1)分出(8.1)并入(6.0)Direct3D立即模式 (2.0)D3DX (7.0) / DXUT(6.0)圖13-2 DirectX的組成模塊n DirectX Audio(音頻)包括DirectSound和DirectMusic:u DirectSound(聲音) 主要針對波形音頻,底層接口??捎糜陂_發(fā)播放和捕捉波形音頻的高性能立體與三維(DirectSound 3D)音頻應(yīng)用程序。在下一代Direc

17、tX中,DirectSound的功能將由XACT(Microsoft Cross-Platform Audio Creation Tool微軟跨平臺音頻生成工具)來代替。u DirectMusic(音樂) 主要針對MIDI音樂,高層接口。為基于波形、MIDI聲音或DirectMusic生成器所創(chuàng)造的動態(tài)內(nèi)容之音樂和非音樂聲道提供一個完整的解決方案。u XACT(游戲音頻) XACT(Microsoft Cross-Platform Audio Creation Tool,微軟跨平臺音頻生成工具),是一種多人合作的音頻設(shè)計工具和相關(guān)API,用于游戲的動態(tài)音頻開發(fā)。n DirectInput(輸入

18、) 提供對各種輸入設(shè)備的支持,包括對受力反饋(force-feedback)技術(shù)的全面支持。在下一代DirectX中,DirectInput將被XInput代替。n DirectPlay(游戲) 提供對多人網(wǎng)絡(luò)游戲的支持。在最新的DirectX版本中,微軟公司反對(deprecate)使用DirectPlay,而建議改用Windows Sockets和Windows Firewall API來代替。在下一代DirectX中,DirectPlay可能會被Xbox Live代替。n DirectSetup(安裝) 提供DirectX組件的一次性調(diào)用安裝的一個簡單API(自動安裝DirectX驅(qū)動程

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

20、ctShow的過濾器。n DirectX Media(媒體) 是一個用于流媒體應(yīng)用的外部API集合。在之前,DirectX Media SDK和DirectX SDK是兩個分離的SDK。在版時DirectX Media SDK被集成到DirectX SDK之中。DirectX Media的運行模塊,被集成到Windows和IE之中。到了版時,DirectX Media又被DirectX SDK拋棄(其核心模塊DirectShow被集成到了DirectX之中),其功能被隨Windows 2000 Server推出的Windows Media SDK所代替。u DirectX Transform(

21、變換) 用于產(chǎn)生二、三維圖形的各種效果,如混色和表面彎曲等。u DirectAnimation(動畫) 集成多種媒體類型來創(chuàng)建復(fù)雜動畫,并可用作網(wǎng)頁內(nèi)容。u DirectX Video Acceleration(視頻加速DXVA) 利用硬件加速二維視頻的解碼操作。u Direct3D Retained Mode(保留模式) Direct3D的保留模式是一種高層API,建立在Direct3D立即模式之上,使用起來方便容易,但是效率不高,適合于初學(xué)者。u DirectShow(展示) 支持音視頻流的高質(zhì)量采集和重放。 編程準(zhǔn)備為了用VC編寫DirectX應(yīng)用程序,必須先下載并安裝DirectX S

22、DK,并進行必要的頭/庫文件路徑和鏈接庫的設(shè)置。下面以Windows XP中文版環(huán)境下的Visual C+ 2005中文版和DirectX August 2006 SDK為例,介紹進行具體的DirectX編程之前,所需做的必要準(zhǔn)備工作。l 下載并安裝DirectX SDK可以從微軟公司的官方網(wǎng)站()下載最新的DirectX SDK,如dxsdk_dec(448MB)。安裝完成后,會在安裝目錄(缺省為“C:Program FilesMicrosoft DirectX SDK (December 2006)”)中生成Developer Runtime、Documentation、Include、L

23、ib、Redist、Samples和Utilities等多個子目錄。安裝時還會為Windows操作系統(tǒng)生成名為“Microsoft DirectX SDK (December 2006)”的程序組,包含多個子程序組和程序。安裝程序會將DirectX SDK的幫助文檔,也安裝到Visual Studio 2005的幫助系統(tǒng)內(nèi),位于其“目錄/DirectX SDK (December 2006)”目錄之中,包含“DirectX SDK (December 2006) C+”和“DirectX SDK (December 2006) Managed”兩個幫助子目錄。l 設(shè)置包含和庫路徑在Visual

24、 Studio 2005中文版的IDE中,選“工具/選項”菜單項,打開“選項”對話框(參見圖13-5)。圖13-5 Visual Studio 2005的“選項”對話框再選該對話框左邊的“項目和解決方案/VC+目錄”路徑,在右邊的“顯示以下內(nèi)容的目錄”欄的下拉式列表框中,選“包含文件”項。按該欄下面的“新行”鈕,則在其下方的顯示欄中會出現(xiàn)新行,再按新行右端的帶省略號的瀏覽鈕,在彈出的“選擇目錄”對話框中,選擇DirectX SDK的Include目錄所在的路徑“C:Program FilesMicrosoft DirectX SDK (August 2006)Include”,然后按“打開”關(guān)

25、閉“選擇目錄”對話框。結(jié)果參見圖13-6。圖13-6 設(shè)置DirectX的“包含文件”的路徑可類似選擇“庫文件”項,添加庫文件路徑“C:Program FilesMicrosoft DirectX SDK (August 2006)Libx86”,結(jié)果參見圖13-7。最后,按“確定”鈕,關(guān)閉“選項”對話框。圖13-7 設(shè)置DirectX的“庫文件”的路徑注意,對DirectX的包含路徑和庫路徑的設(shè)置,對所有項目都有效。l 設(shè)置鏈接庫先創(chuàng)建一個DirectX應(yīng)用程序的MFC單文檔項目(如DxTest),再在VS05的IDE中,選“項目/屬性”,打開“DxTest屬性頁”對話框。在左上角的“配置”

26、欄中,選中“所有配置”項;再選左邊的路徑“配置屬性/鏈接器/輸入”,在右邊的“附加依賴項”欄中,添加d3d9.lib d3dx9.lib d3dxof等鏈接庫(在多個庫文件之間,用空格分隔)。具體添加哪些DirectX庫,與具體應(yīng)用程序所使用的DirectX模塊有關(guān),你也可以查看DirectX的庫目錄。最后,按“應(yīng)用”鈕和“確定”鈕,關(guān)閉屬性頁對話框。參見圖13-8。圖13-8 設(shè)置DirectX的鏈接庫注意,對DirectX鏈接庫的設(shè)置,只對VC05中當(dāng)前打開的單個項目有效。在安裝了DirectX SDK,并設(shè)置好文件路徑和鏈接庫后,就可以開始編寫具體的DirectX應(yīng)用程序了。Direct

27、X的組件眾多、功能強大、編程復(fù)雜,完整的介紹需要幾本大部頭的專著才行,本書只準(zhǔn)備簡單介紹DirectX的最主要模塊Direct3D和DirectSound編程的最基本內(nèi)容。13.2 Direct3D編程簡介Direct3D(直接三維)是DirectX的核心模塊,新版本的Direct3D中還包含原來DirectDraw模塊的2D功能。因此,現(xiàn)在的Direct3D是DirectX Graphics的唯一模塊,具有DirectX(二、三維)圖形的全部功能。 流水線與設(shè)備Direct3D用圖形流水線(graphics pipeline)來處理和渲染場景(render scene),而Direct3D設(shè)

28、備(device)是執(zhí)行變換(transformation)和光照(lighting)等操作的渲染部件。l Direct3D圖形流水線可通過Direct3D圖形流水線來充分利用硬件性能,以提供高效處理和繪制Direct3D場景到顯示器的能力。圖13-9為流水線(pipeline,管線/管道/流程)的組成模塊框圖。頂點數(shù)據(jù)圖元數(shù)據(jù)鑲嵌頂點處理幾何處理像素處理像素繪制紋理采樣器紋理表面圖13-9 Direct3D圖形流水線l Direct3D設(shè)備圖13-10 Direct3D設(shè)備架構(gòu)變換模塊光照模塊光柵化器Direct3D設(shè)備架構(gòu)Direct3D設(shè)備(device)是Direct3D的渲染部件,它

29、封裝和存儲渲染狀態(tài)。另外,它還執(zhí)行變換和光照等操作,并且光柵化圖像到表面(如屏幕)。在結(jié)構(gòu)上,Direct3D設(shè)備包含變換模塊(transformation module)、光照模塊(lighting module)和光柵化器(rasterizer)。圖13-10為Direct3D的設(shè)備架構(gòu)(architecture)。當(dāng)前,Direct3D有兩種主要的設(shè)備類型:n HAL設(shè)備(hal device) 具有硬件加速的光柵化(rasterization),可同時使用硬件和軟件的頂點處理進行著色(shading)。n 參考設(shè)備(reference device) 由軟件驅(qū)動程序提供,現(xiàn)在主要用于性

30、能測試。創(chuàng)建Direct3D對象創(chuàng)建Direct3D設(shè)備對象設(shè)置渲染狀態(tài)定義頂點格式創(chuàng)建頂點緩沖區(qū)鎖定頂點緩沖區(qū)解鎖頂點緩沖區(qū)開始場景結(jié)束場景構(gòu)造幾何對象設(shè)置材質(zhì)和光照或紋理設(shè)置設(shè)備的流源和頂點格式繪制圖元展現(xiàn)場景進行世界、觀察和投影矩陣變換清除對象清除顯示表面具有軟件特性的參考設(shè)備不一定能提供與硬件等同的性能,因此應(yīng)用程序必須總是查詢設(shè)備的能力以確定其支持哪些特性。 基本編程過程Direct3D的基本編程過程如圖13-11所示。下面各小節(jié)依次介紹Direct3D編程的基本步驟和方法。 創(chuàng)建和初始化對象為了使用Direct3D,你必須首先創(chuàng)建一個應(yīng)用窗口,然后再創(chuàng)建和初始化Direct3D對象

31、。利用這些對象所實現(xiàn)的COM接口來操作它們,以創(chuàng)建繪制場景所需的其它對象。如果進行MFC編程,則可以省略創(chuàng)建窗口這一步,而直接使用視圖類所代表的客戶區(qū)窗口。圖13-11 Direct3D編程的基本過程下面介紹的是初始化Direct3D的內(nèi)容,包括創(chuàng)建Direct3D對象、創(chuàng)建Direct3D設(shè)備和設(shè)置Direct3D設(shè)備的渲染(render著色)狀態(tài)等。l 創(chuàng)建Direct3D對象可使用全局函數(shù)Direct3DCreate9來創(chuàng)建Direct3D接口對象:IDirect3D9 * Direct3DCreate9( / 成功返回指向IDirect3D9接口的指針,失敗返回NULL UINT SD

32、KVersion / 必須為D3D_SDK_VERSION);例如:IDirect3D9 * g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );l 創(chuàng)建Direct3D設(shè)備可使用IDirect3D9接口的CreateDevice方法來創(chuàng)建設(shè)備(尾參數(shù)的返回值):HRESULT CreateDevice( / 成功返回D3D_OK(= 0) UINT Adapter, / 顯卡(display adapter)序號,D3DADAPTER_DEFAULT為主顯卡 D3DDEVTYPE DeviceType, / 設(shè)備的枚舉類型,一般取為D3DDEVTYPE_H

33、AL HWND hFocusWindow, / 焦點窗口句柄,可取為this->m_hWnd DWORD BehaviorFlags, / 控制設(shè)備的創(chuàng)建行為之選項組合,可以采用硬件或軟件/ 的頂點處理,如D3DCREATE_SOFTWARE_VERTEXPROCESSING D3DPRESENT_PARAMETERS * pPresentationParameters, / 指向展現(xiàn)參數(shù)結(jié)構(gòu)/ D3DPRESENT_PARAMETERS的指針 IDirect3DDevice9 * ppReturnedDeviceInterface / 代表被創(chuàng)建設(shè)備的/ IDirect3DDevice

34、9返回接口的指針地址);其中,展現(xiàn)參數(shù)結(jié)構(gòu)D3DPRESENT_PARAMETERS的定義為:typedef struct D3DPRESENT_PARAMETERS / 展現(xiàn)參數(shù)結(jié)構(gòu)UINT BackBufferWidth, BackBufferHeight; / 后臺緩沖區(qū)的寬高(以像素為單位),/ 對窗口模式可取為0,對全屏模式則必須與當(dāng)前顯卡枚舉模式的一致D3DFORMAT BackBufferFormat; / 后臺緩沖區(qū)的格式,可取為/ D3DFMT_UNKNOWN(= 0) UINT BackBufferCount; / 后臺緩沖區(qū)計數(shù),可取為03,取0時等價于1D3DMULTI

35、SAMPLE_TYPE MultiSampleType; / 多樣本類型,一般取為/ D3DMULTISAMPLE_NONE(= 0) DWORD MultiSampleQuality; / 多樣本質(zhì)量水平,一般取0D3DS S; / 交換效果,可取為/ D3DS(= 1)、D3DS(= 2)/ 和D3DS(= 3)等枚舉值 HWND hDeviceWindow; / 設(shè)備窗口的句柄,對窗口模式可取為NULL(= 0) BOOL Windowed; / 應(yīng)用程序在窗口/全屏中運行時取TRUE/FALSEBOOL EnableAutoDepthStencil; / 允許自動深度模板,為TRUE則

36、由Direct3D/ 來管理應(yīng)用程序的深度緩沖區(qū)D3DFORMAT AutoDepthStencilFormat; / 自動深度模板格式,可取/ D3DFMT_D16、D3DFMT_D24S8和D3DFMT_D32等枚舉值 DWORD Flags; / 表現(xiàn)標(biāo)志D3DPRESENTFLAG常數(shù)之一,可取為0 UINT FullScreen_RefreshRateInHz; / 全屏?xí)r的屏幕刷新率,對窗口模式必須為0UINT PresentationInterval; / 前后臺緩沖區(qū)交換的最大速率,可取為 / D3DPRESENT_INTERVAL_DEFAULT(= 0) D3DPRESEN

37、T_PARAMETERS;例如: / 設(shè)置創(chuàng)建D3D設(shè)備用的表現(xiàn)結(jié)構(gòu) D3DPRESENT_PARAMETERS d3dpp; / 定義表現(xiàn)結(jié)構(gòu)變量 ZeroMemory( &d3dpp, sizeof(d3dpp) ); / 內(nèi)存清零 d3dpp.Windowed = TRUE; / 窗口模式 d3dpp.S = D3DS; / 放棄交換效果 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; / 未知格式 d3dpp.EnableAutoDepthStencil = TRUE; / 允許自動深度模板 d3dpp.AutoDepthStencilForm

38、at = D3DFMT_D16; / 16位深度緩沖 LPDIRECT3DDEVICE9 g_pd3dDevice; / 定義D3D設(shè)備接口的指針 / 創(chuàng)建D3D設(shè)備對象(獲取D3D設(shè)備接口的指針) g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, this->m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice );l 設(shè)置設(shè)備的渲染狀態(tài)利用IDirect3D9接口的CreateDevice方法所返回的設(shè)備接口IDire

39、ct3DDevice9的指針,可以調(diào)用該接口的設(shè)置渲染(render著色)狀態(tài)方法SetRenderState,來初始化設(shè)備:HRESULT SetRenderState( / 成功返回D3D_OK(= 0) D3DRENDERSTATETYPE State, / 設(shè)備狀態(tài) DWORD Value / 設(shè)置值);其中,設(shè)備狀態(tài)State,可取D3DRENDERSTATETYPE枚舉的任意值,如D3DRS_ZENABLE(允許Z緩沖)、D3DRS_FILLMODE(填充模式)、D3DRS_SHADEMODE(陰影模式)、 D3DRS_ALPHATESTENABLE(允許測試)、D3DRS_CUL

40、LMODE(剔除模式)、D3DRS_FOGENABLE(允許霧化)、D3DRS_LIGHTING(光照)、D3DRS_DITHERENABLE(允許抖動)、。例如:g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); / 關(guān)閉背面剔除g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); / 允許Z緩沖g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); / 關(guān)閉光照13.2.4 創(chuàng)建場景三維場景是由若

41、干物體(幾何對象)構(gòu)成的,復(fù)雜的幾何對象由多個簡單的圖元(點、線、三角形和多邊形等)所組成,而圖元(primitive)又是頂點(vertex)的集合。圖13-12 3D圖元表面的三角網(wǎng)格3D圖元一般是一個多面體,通常用其表面的三角網(wǎng)格來表示,參見圖13-12。所以最基本的圖元是三角形和頂點。創(chuàng)建場景中的幾何對象,等價于建立表示該幾何體的頂點集合。因此,必須先定義自己的頂點結(jié)構(gòu)并創(chuàng)建頂點緩沖區(qū),然后在鎖定頂點緩沖區(qū)后,再通過給頂點緩沖區(qū)中的各頂點結(jié)構(gòu)賦值來構(gòu)造幾何對象,最后解鎖頂點緩沖區(qū)。l 定義頂點結(jié)構(gòu)Direct3D使用一種FVF(Flexible Vertex Format可變頂點格式)

42、結(jié)構(gòu)來定義頂點,以滿足用戶的不同需要。在FVF結(jié)構(gòu)CUSTOMVERTEX中,可以包含描述頂點的位置、RHW(reciprocal homogeneous w倒數(shù)齊次w,表示已變換頂點位置的齊次坐標(biāo)w分量)、法向、大小和(漫射、鏡面反射)顏色等字段,具體內(nèi)容由用戶根據(jù)需要自己來確定,但是各字段之間的相對順序不能改變。其中,頂點的位置和法向等字段,一般為三維點向量,可以用Direct3D的擴展三維向量結(jié)構(gòu)D3DXVECTOR3來表示:typedef struct D3DXVECTOR3 FLOAT x; FLOAT y; FLOAT z; D3DXVECTOR3;其中的FLOAT為float的t

43、ypedef類型,定義在頭文件中。而顏色一般采用DWORD的typedef定義類型D3DCOLOR。例如:struct CUSTOMVERTEX / 含位置、法向量和顏色的自定義頂點結(jié)構(gòu)D3DXVECTOR3 position; / 未變換頂點的3D位置D3DXVECTOR3 normal; / 頂點的表面法向量 D3DCOLOR color; / 顏色; 或:struct CUSTOMVERTEX / 含位置、顏色和紋理坐標(biāo)的自定義頂點結(jié)構(gòu) D3DXVECTOR3 position; / 未變換頂點的3D位置 D3DCOLOR color; / 顏色 FLOAT tu, tv; / 紋理坐標(biāo)

44、; 或:struct CUSTOMVERTEX / 含位置齊次坐標(biāo)和顏色的自定義頂點結(jié)構(gòu)FLOAT x, y, z, rhw; / 已變換頂點的3D位置 DWORD color; / 顏色;用戶在定義了自己的頂點結(jié)構(gòu)類型后,還需要定義一個對應(yīng)的(宏)常量,來描述該結(jié)構(gòu)的字段內(nèi)容。該(宏)常量由若干表示頂點格式的標(biāo)志位符號常量(參見表13-1)的位或組合而成。表13-1 頂點數(shù)據(jù)格式標(biāo)志符號常量值數(shù)據(jù)類型描述D3DFVF_XYZ0x002float, float, float未轉(zhuǎn)換的頂點坐標(biāo)D3DFVF_XYZRHW0x004float, float, float, float已轉(zhuǎn)換的頂點坐標(biāo)D

45、3DFVF_XYZB150x006/8/a/c/e1- 3個float含權(quán)重i的頂點坐標(biāo)D3DFVF_XYZW0x4002float, float, float, float已轉(zhuǎn)換和裁剪的頂點坐標(biāo)D3DFVF_NORMAL0x010float, float, float頂點的法線D3DFVF_PSIZE0x020float點大小D3DFVF_DIFFUSE0x040DWORD(ARGB)漫射顏色D3DFVF_SPECULAR0x080DWORD(ARGB)鏡面反射顏色D3DFVF_TEX080x08001- 4個floati重紋理映射例如:#define D3DFVF_CUSTOMVERTEX

46、 (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE)或:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)或:const DWORD FVF = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE);l 創(chuàng)建頂點緩沖區(qū)在定義了頂點結(jié)構(gòu)后,就可以創(chuàng)建頂點緩沖區(qū)了,這可以由IDirect3DDevice9接口的CreateVertexBuffer方法來完成:HRESULT CreateVertexBuffer( / 成功返回D3D_OK(= 0) UINT

47、 Length, / 緩沖區(qū)的字節(jié)大小,一般為 n*sizeof (CUSTOMVERTEX) DWORD Usage, / 緩沖區(qū)用法的附加屬性標(biāo)志,一般為0 DWORD FVF, / 頂點結(jié)構(gòu)格式常量 D3DPOOL Pool, / 緩沖區(qū)所在的內(nèi)存池類型(D3DPOOL枚舉值) IDirect3DVertexBuffer9* ppVertexBuffer, / 返回被創(chuàng)建的頂點緩沖區(qū)指針 HANDLE* pSharedHandle / 保留,設(shè)為NULL);其中,內(nèi)存池類型D3DPOOL枚舉的定義為:typedef enum D3DPOOL / 內(nèi)存池類型枚舉 D3DPOOL_DEFAU

48、LT = 0, / AGP存儲器或顯存 D3DPOOL_MANAGED = 1, / AGP存儲器或顯存,且在系統(tǒng)內(nèi)存中還有一份拷貝 D3DPOOL_SYSTEMMEM = 2, / 系統(tǒng)內(nèi)存 D3DPOOL_SCRATCH = 3, / 系統(tǒng)內(nèi)存中的臨時池 D3DPOOL_FORCE_DWORD = 0x7fffffff / 未使用(強制該枚舉被編譯成32位) D3DPOOL;例如:g_pd3dDevice->CreateVertexBuffer( 100 * sizeof (CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT,

49、 &g_pVB, NULL );或:g_pd3dDevice->CreateVertexBuffer( 3 * sizeof (CUSTOMVERTEX), 0, FVF, D3DPOOL_MANAGED, &g_pVB, NULL );l 構(gòu)造點集創(chuàng)建三維場景中的幾何對象,需要計算和構(gòu)造描述該幾何對象的點集。具體做法是:先定義一個頂點指針(用于操作頂點數(shù)組);再調(diào)用Lock方法來獲取頂點緩沖區(qū)的首地址(賦值給頂點指針),并鎖定該區(qū)域僅供當(dāng)前操作使用;然后利用該頂點指針,將計算的頂點結(jié)構(gòu)值填入頂點緩沖區(qū),從而構(gòu)造出幾何對象;最后調(diào)用Unlock方法解鎖頂點緩沖區(qū)。IDir

50、ect3DVertexBuffer9接口的Lock和Unlock方法的定義為:HRESULT Lock( / 成功返回D3D_OK(= 0) UINT OffsetToLock, / 鎖定的偏移地址 UINT SizeToLock, / 鎖定的字節(jié)數(shù) VOID * ppbData, / 返回被鎖定的緩沖區(qū)頭的指針 DWORD Flags / 鎖定方式標(biāo)志,可為0或下列符號常量的組合:/ D3DLOCK_DISCARD、D3DLOCK_NO_DIRTY_UPDATE、/ D3DLOCK_NOSYSLOCK、D3DLOCK_READONLY、/ D3DLOCK_NOOVERWRITE);HRESU

51、LT Unlock(); / 成功返回D3D_OK(= 0)例如:CUSTOMVERTEX* pVertices;g_pVB->Lock( 0, 0, (void*)&pVertices, 0 ); / 給頂點緩沖區(qū)中的各頂點結(jié)構(gòu)賦值(構(gòu)造幾何對象的點集)g_pVB->Unlock(); 矩陣變換描述單個物體(3D幾何對象)一般采用的是本地相對坐標(biāo)。因此,在渲染之前,需要將它們都轉(zhuǎn)換為描述場景的統(tǒng)一世界空間(world space)坐標(biāo),這對應(yīng)于世界矩陣變換。為了將三維場景顯示在二維屏幕上,還需要選擇一個觀察點(眼睛/攝像機)和觀察角度(方向/坐標(biāo))(對應(yīng)于觀察坐標(biāo)矩陣變換

52、),并將3D場景投影到一個2D平面(屏幕)上(對應(yīng)于投影矩陣變換),還要將超出屏幕的部分去掉(裁剪),也可以將場景投射到屏幕的某個矩形區(qū)域中(視口縮放)。參見圖13-13。世界變換觀察變換投影變換裁剪與視口縮放頂點光柵器變換引擎圖13-13 Direct3D的變換引擎下面依次對這些變換加以介紹,這需要首先介紹Direct3D中的矩陣定義和變換方法。l 矩陣與變換在Direct3D中,定義了矩陣(matrix)結(jié)構(gòu)D3DXMATRIX :typedef struct D3DXMATRIX / 矩陣結(jié)構(gòu) struct / 注意,C/C+的變量名可以下劃線開頭(但不能以數(shù)字開頭) FLOAT _11

53、; 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; ; D3DXMATRIX;對應(yīng)于4*4的浮點矩陣:在Direct3D中,還定義了一個對Intel P4 CPU運算進行了優(yōu)化的16字節(jié)對齊的矩陣結(jié)構(gòu)(從D3DXMATRIX派生的C+結(jié)構(gòu)對象):typedef struct _D3DXMATRIXA16 : publ

54、ic D3DXMATRIX / 16字節(jié)對齊矩陣結(jié)構(gòu) _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,

55、 FLOAT _44 ); void* operator new(size_t s); void* operator new(size_t s); void operator delete(void* p); void operator delete(void* p); struct _D3DXMATRIXA16& operator=(CONST D3DXMATRIX& rhs); _D3DXMATRIXA16;typedef D3DX_ALIGN16 _D3DXMATRIXA16 D3DXMATRIXA16;Direct3D還提供了若干全局矩陣函數(shù),如:D3DXMATRIX * D3DXMatrixIdentity( D3DXMATRIX * pOut ); / 創(chuàng)建單位矩陣FLOAT D3DXMatrixDeterminant(CONST D3DXMATRIX * pM); / 返回矩陣的行列式值D3DXMATRIX * D3DXMatrixInverse( / 計算逆矩陣 D3DXMATRIX * pOut, / 結(jié)果矩陣 FLOAT * pDeterminant, / 行列式值,可置為NULL CONST D3DXM

溫馨提示

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

最新文檔

評論

0/150

提交評論