多媒體技術(shù)之DirectX編程入門_第1頁(yè)
多媒體技術(shù)之DirectX編程入門_第2頁(yè)
多媒體技術(shù)之DirectX編程入門_第3頁(yè)
多媒體技術(shù)之DirectX編程入門_第4頁(yè)
多媒體技術(shù)之DirectX編程入門_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余20頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

4、備無 關(guān)性與高性能之間取得某種平衡, 決定為 Windows 添加一種高性能的動(dòng)畫機(jī)制 (以及后來的 輸入與音響等),因此于 1995 年推出了 Game SDK,后來改名為 DirectX。其中的 Direct 指 可以直接訪問多媒體硬件; X 指它的不同組成部分,如 Direct3D、DirectSound、DirectInput 和 DirectPlay 等。13.1.2版本與功能因?yàn)?DirectX 必須支持多媒體設(shè)備的最新技術(shù)和功能, 而多媒體硬件 (尤其是顯卡 的 3D 性能)和技術(shù)始終處在高速發(fā)展過程中,所以 DirectX 的技術(shù)和版本也同樣在不斷地發(fā)展和 演變,其中發(fā)展最快的

5、是 3D 接口部分。下面列出 DirectX 的主要版本的發(fā)布時(shí)間、引入的新模塊和特性:1.0-1995 年 9 月 30 日:DirectDraw、DirectSound、DirectInput、DirectPlay、DirectSetup;2.01996 年 6 月 5 日:引入 Direct3D (次版本有 2.0a);3.01996 年 9 月 15 日:支持 MMX、為 DirectSound 補(bǔ)充 DirectSound3D API (次版 本有3.0a);4.0無此版本號(hào);5.01997 年 7 月 16 日:有許多改進(jìn), 如受力反饋控制器、 多顯示器支持、 新的游戲 控制面板、

6、用戶界面的全面改進(jìn)等(次版本有 5.1 和 5.2);6.01998 年 8 月 7 日:添加新的 3D 特性(如添加 DXUT 框架)、支持 AMD 公司 的 3DNow!技術(shù)、性能較 5.0 有提高。在 1999 年 2 月 3 日推出的 6.1 版中,添加了 DirectMusic 模塊;7.0 1999 年 9 月 22 日:改進(jìn) 3D 圖形和聲音、性能更快,為 Direct3D API 引入硬件 傳送、光照和紋理壓縮、以及硬件加速,引入 D3DX 工具庫(kù)。使用 Creative 公司的 EAX 技術(shù)改進(jìn) 3D 聲音的算法(次版本有 7.0a 和 7.1);8.0 2000 年 9 月

7、 30 日:將 DirectDraw 與 Direct3D 完全集成在一起、其中 Direct3D 的性能有了本質(zhì)上的飛躍(引入頂點(diǎn)/像素 shader 著色引擎/光照模型卜支持硬件點(diǎn)精靈 和三維體紋理),將 DirectMusic 與 DirectSound 更緊密地集成在一起構(gòu)成 DirectX Audio, 更新了 DirectInput 與DirectPlay,添加了 DirectShow、拋棄了其余的 DirectX Media 模塊。 2001 年 11 月 11 日推出的 8.1 版,被集成在 Windows XP 中銷售,該版本添加了從 DirectShow 分離出的 DMO(

8、 DirectXMedia Objects 媒體對(duì)象)組件模塊。它還支持許 多新的圖形特性,如像素著色引擎的1.21.4 版、動(dòng)態(tài)/高分辨率紋理、新 3D 擴(kuò)展方法等(次版本有 8.0a、8.1、8.1a 和 8.1b);9.0 2002 年 12 月 24 日:添加許多新特性到 DirectX Graphics 和 DirectShow 中,例 如將DirectDraw 的功能并入到 Direct3D 之中,支持頂點(diǎn)和像素著色引擎的新版本 2.03 / 56和 3.0,弓 I 入裁剪測(cè)試、位移貼圖和多元紋理,支持128 位浮點(diǎn)著色精度和根據(jù)顯示器自動(dòng)調(diào)整 丫值等。也添加若干新特性到Direc

9、tlnput、DirectPlay、DirectSound 和DirectMusic 中。(次版本有 9.0a、9.0b 和 9.0c)。DirectX 的最后一個(gè)以數(shù)字和字母命名的版本是2004 年 8 月 9 日推出的 9.0c,后來又于2004 年 10 月、2005 年的 2/4/6/8/10 月分別推出了它的多個(gè)升級(jí)版。從 2005 年 12 月推出的 DirectX 開始,其版本的命名發(fā)生了變化:主版本號(hào)改為DX,次版本改為發(fā)布的年月。一般是每?jī)蓚€(gè)月推出一個(gè)新版本,因此也叫做 DirectX 9.0c 的雙月更新(bimonthly updates。當(dāng)前最新版本為 2006 年 1

10、0 月 11 日推出的 DX October 2006。它們都包含了(于 2002 年推出的專 為.NET 框架設(shè)計(jì)的)托管(Managed) DirectX,將原 來 DirectX 多個(gè)分離的 COM 模塊集成到了一個(gè)容易使用 的單一 CLR 文件之中。10-? : DirectX 不會(huì)有第10 版了,因?yàn)槲④浌疽褜irectX 的功能集成進(jìn)其新一 代操作系統(tǒng) Windows Vista 中,而不再將其作為一個(gè)額外的模塊了。但是會(huì)有Direct3D10,已于 2006 年 12 月 13 日隨 Direct3D SDK 的 December 2006 版一起發(fā)布,并被嵌入 到Windo

11、ws Vista 中。另外,作為學(xué)生和業(yè)余愛好者的DirectX 替代產(chǎn)品,微軟公司于2004 年 3 月 24 日宣布了用于托管運(yùn)行環(huán)境下計(jì)算機(jī)游戲的設(shè)計(jì)、開發(fā)和管理的框架和工具集 XNA,并于 2006 年 12 月 11 日推出了 XNA Framework Redistributable 和 XNAGame Studio Express 的 1.0 版,可用于 Windows 和 Xbox 360 游戲的開發(fā)。13.1.3結(jié)構(gòu)DirectX 是一種基于 COM ( Component Object Model,組件對(duì)象模型)的系統(tǒng),它既不 屬于驅(qū)動(dòng)程序?qū)樱?也不屬于應(yīng)用層。 Direc

12、tX 的主要設(shè)計(jì)目標(biāo)是在提供某種設(shè)備獨(dú)立性的同時(shí) 獲取高速度,為此微軟公司為 DirectX 設(shè)計(jì)了如圖 13-1 所示的體系結(jié)構(gòu)。其中:HAL = Hardware Abstract Layer以一種獨(dú)立于設(shè)備的方式提供這些功能;HEL = Hardware Emulation Layer (硬件模擬層)-負(fù)責(zé)提供 DirectX 功能中本機(jī)硬件不支持部分的模擬實(shí)現(xiàn)。但是從 8.0 版起,DirectX 就不再提供硬件模擬層 HEL 了,需要開發(fā)商、第三方或自 己來編寫一個(gè) PSD(Pluggable Software Device 可插式軟件設(shè)備)連到 DirectX 提供的 HEL 接口

13、上,稱之為參考設(shè)備。但是現(xiàn)在很少有這樣的PSD 可用,因此新版本的 DirectX 是嚴(yán)應(yīng)用程序Windows TAPIWindows API 子系統(tǒng)(GDI、MMAPI、MCI、)(硬件抽象層)負(fù)責(zé)檢測(cè)本機(jī)的硬件功能,并圖 13-1 DirectX 子系統(tǒng)DirectXWindows 驅(qū)動(dòng)程序接口PC 硬件子系統(tǒng)重依賴于硬件的。13.1.4組成DirectX 由多個(gè)( COM 組件)模塊組成,而且隨著版本的演化,這些模塊也在不斷地增 減、合并和改變。 最新的 DirectX 組件的模塊構(gòu)成如圖 13-2 所示, 括號(hào)中的數(shù)字為該模塊被 首次引進(jìn) (或移出)的版本號(hào)。下面是 DirectX 的

14、主要組成模塊的簡(jiǎn)單介紹:DirectX Graphics (圖形)- 包括 DirectDraw 和 Direct3D :DirectDraw(繪制)一一二維圖形繪制(高速位圖傳送/視頻與 2D 動(dòng)畫)。從 9.0 版起, DirectDraw 已被集成到了 Direct3D 之中。Direct3D(三維)-三維圖形繪制。分成保留(retained)和立即(immediate)兩種模式(mode):保留模式是一種高層 API,建立在立即模式之上,使用 起來方便容易,但是效率不高,適合于初學(xué)者; 立即模式則是一種底層 API, 使用復(fù)雜,但是其效率比保留模式高得多。大多數(shù) DirectX 應(yīng)用程

15、序,特別 是計(jì)算機(jī)游戲, 都是采用立即模式進(jìn)行開發(fā)。 自從 6.0 版以來,保留模式 API 的發(fā)展停滯不前, 而立即模式 API 的發(fā)展卻日新月異。 不論是保留模式還是 立即模式, Direct3D 都是建立在 DirectDraw 之上的。 從 9.0 版起,Direct3D 包含了 DirectDraw, 它像 OpenGL樣也具有二維圖形繪制的功能。Direct3D 的下一個(gè)版本為 Durect3D 10,為Windows Vista 的一個(gè)有機(jī)組成部分。D3DX(Direct3D 擴(kuò)展) 為 Direct3D 服務(wù)的實(shí)用工具庫(kù),執(zhí)行公 共的數(shù)學(xué)計(jì)算和一些復(fù)雜的任務(wù),包含若干簡(jiǎn)化 3D

16、 模型使用的類,如 粒子系統(tǒng)( particle system)。 D3DX 由動(dòng)態(tài)鏈接庫(kù)( DLL )提供。DXUT (編程框架) 建立在 Direct3D API 之上的樣例框架,也叫 通用文件框架,可以幫助程序員減少在繁瑣的平凡工作(如創(chuàng)建窗口、 創(chuàng)建設(shè)備、處理 Windows 消息和設(shè)備事件等)上所花的時(shí)間。5 / 56圖 13-2 DirectX 的組成模塊DirectX Audio (音頻)-包括 DirectSound 和 DirectMusic :DirectSound (聲音)一一主要針對(duì)波形音頻,底層接口??捎糜陂_發(fā)播放 和捕捉波形音頻的高性能立體與三維(DirectSou

17、nd 3D)音頻應(yīng)用程序。在下一 代 DirectX 中,DirectSound 的功能將由 XACT( Microsoft Cross-Platform Audio Creation Tool 微軟跨平臺(tái)音頻生成工具)來代替。DirectMusic (音樂)一一主要針對(duì) MIDI 音樂,高層接口。為基于波形、 MIDI 聲音或 DirectMusic 生成器所創(chuàng)造的動(dòng)態(tài)內(nèi)容之音樂和非音樂聲道提供 一個(gè)完整的解決方案。XACT (游戲音頻)-XACT ( Microsoft Cross-Platform Audio CreationTool,微軟跨平臺(tái)音頻生成工具),是一種多人合作的音頻設(shè)計(jì)工

18、具和相關(guān) API,用于游戲的動(dòng)態(tài)音頻開發(fā)。DirectInput (輸入)-提供對(duì)各種輸入設(shè)備的支持,包括對(duì)受力反饋(force-feedback)技術(shù)的全面支持。在下一代 DirectX 中,DirectInput 將被 Xlnput 代 替。DirectPlay (游戲)一一提供對(duì)多人網(wǎng)絡(luò)游戲的支持。在最新的DirectX 版本中,微軟公司反對(duì)(deprecate 使用 DirectPlay,而建議改用 Windows Sockets 和 WindowsFirewall API 來代替。在下一代 DirectX 中,DirectPlay 可能會(huì)被 Xbox Live 代替。DirectSe

19、tup (安裝)一一提供 DirectX 組件的一次性調(diào)用安裝的一個(gè)簡(jiǎn)單API (自 動(dòng)安裝 DirectX 驅(qū)動(dòng)程序)。DirectX*III-XNA(Xbox/Vista)DirectSetup (1.0) DirectX Media Objects (8.1) *并入(8.0)Media Foundation (Vista) 分出(8.1)-移入平臺(tái) SDKDirectShow (5.0)(9.0c 2005.4)并入(6.0)牛 DirectX Media_(Q :DirectAnimation (5.0)DirectX 視頻加速(5.0)移入 WindowsMedia SDK (8.

20、0)Direct3D 保留模式(5.0)DirectX Transform (5.0):DirectDraw (1.0);Di里 pput(1里 _ _;一 Xlnput (9.0c 2005.10)DirectPlay (1.0) 二-建議用 WinSocket 和 WinFirewall API 代替(9.0c)Xbox Live (Vista)DirectShow (展示)一一提供多媒體(音視頻)流的高質(zhì)量捕捉和重放。在8.0版之前,DirectShow 是 DirectX Media 的一個(gè)組成模塊。到 8.0 版時(shí),因?yàn)?DirectX SDK 拋棄了 DirectX Media ,

21、所以才將 DirectShow 集成到了 DirectX 之中。在 DirectX 9.0c 的 2005年 4 月升級(jí)版中,DirectShow 又被移出 DirectX,放入微軟公司的平臺(tái) SDK 之中。DirectX Media Objects (媒體對(duì)象 DMO) 基于 COM 的多媒體和數(shù)據(jù)流組件, 支持音視頻的編解碼器和特效。是在 DirectX 的 8.1 版時(shí),從 DirectShow 分出的, 其功能類似于 DirectShow 的過濾器。DirectX Media (媒體)一一是一個(gè)用于流媒體應(yīng)用的外部 API 集合。在 DirectX 6.0 之前,DirectX Med

22、ia SDK 和 DirectX SDK 是兩個(gè)分離的 SDK。在 6.0 版時(shí) DirectX Media SDK被集成到 DirectX SDK 之中。 DirectX Media 的運(yùn)行模塊,被集成到 Windows 和 IE 之中。到了 8.0 版時(shí), DirectX Media 又被 DirectX SDK 拋棄(其核 心模塊 DirectShow 被集成到了 DirectX 之中),其功能被隨 Windows 2000 Server 推出的 Windows Media SDK 所代替。DirectX Transform (變換)-用于產(chǎn)生二、三維圖形的各種效果,如a混色和表面彎曲等

23、。DirectAnimation (動(dòng)畫) 集成多種媒體類型來創(chuàng)建復(fù)雜動(dòng)畫,并可用 作網(wǎng)頁(yè)內(nèi)容。DirectX Video Acceleration (視頻加速 DXVA )-利用硬件加速二維視頻的解碼操作。Direct3D Retained Mode (保留模式)-Direct3D 的保留模式是一種高層API,建立在 Direct3D 立即模式之上,使用起來方便容易,但是效率不高,適合于初學(xué)者。DirectShow (展示)一一支持音視頻流的高質(zhì)量采集和重放。13.1.5編程準(zhǔn)備為了用 VC 編寫 DirectX 應(yīng)用程序,必須先下載并安裝 DirectX SDK ,并進(jìn)行必要的頭 /庫(kù)文件

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

25、 Include、 Lib、 Redist、Samples 和 Utilities 等多個(gè)子目錄。 安裝時(shí)還會(huì)為 Windows 操作系統(tǒng)生成名為 “Microsoft DirectXSDK (December 2006)”的程序組,包含多個(gè)子程序組和程序。7 / 56安裝程序會(huì)將 DirectX SDK 的幫助文檔,也安裝到 Visual Studio 2005 的幫助系統(tǒng)內(nèi),位 于其“目錄 /DirectX SDK (December 2006)” 目錄之中,包含 “DirectX SDK (December 2006) C+ ”和DirectX SDK (December 2006) M

26、an aged ”兩個(gè)幫助子目錄。設(shè)置包含和庫(kù)路徑在 Visual Studio 2005 中文版的 IDE 中,選“工具/選項(xiàng)”菜單項(xiàng),打開“選項(xiàng)”對(duì)話框 (參見圖 13-5)。圖 13-5 Visual Studio 2005 的 “選項(xiàng)”對(duì)話框再選該對(duì)話框左邊的“項(xiàng)目和解決方案 /VC+目錄”路徑,在右邊的“顯示以下內(nèi)容的 目錄”欄的下拉式列表框中,選“包含文件”項(xiàng)。按該欄下面的“新行”鈕匚,則在其下方的顯示欄中會(huì)出現(xiàn)新行,再按新行右端的帶省略號(hào)的瀏覽鈕I 二,在彈出的“選擇目錄”對(duì)話框中,選擇 DirectX SDK 的 Include 目錄所在的路徑“ C:Program Files

27、Microsoft DirectX SDK(August 2006)Include ”,然后按“打開”關(guān)閉“選擇目錄”對(duì)話框。結(jié)果參見圖13-6。圖 13-6 設(shè)置 DirectX 的“包含文件”的路徑可類似選擇庫(kù)文件”項(xiàng),添加庫(kù)文件路徑C:Program FilesMicrosoft DirectX SDK(August 2006)Libx86”,結(jié)果參見圖 13-7。最后,按“確定”鈕,關(guān)閉“選項(xiàng)”對(duì)話框。圖 13-7 設(shè)置 DirectX 的“庫(kù)文件”的路徑注意,對(duì) DirectX 的包含路徑和庫(kù)路徑的設(shè)置,對(duì)所有項(xiàng)目都有效。設(shè)置鏈接庫(kù)先創(chuàng)建一個(gè) DirectX 應(yīng)用程序的 MFC 單文

28、檔項(xiàng)目(如 DxTest),再在 VS05 的 IDE 中, 選“項(xiàng)目/屬性”,打開“ DxTest 屬性頁(yè)”對(duì)話框。在左上角的“配置”欄中,選中“所有配 置”項(xiàng);再選左邊的路徑“配置屬性 /鏈接器/輸入”,在右邊的“附加依賴項(xiàng)”欄中,添加 d3d9.lib d3dx9.libd3dxof.lib dsound.lib dxguid.lib winmm.lib 等鏈接庫(kù)(在多個(gè)庫(kù)文件之間,用 空格分隔)。具體添加哪些 DirectX 庫(kù),與具體應(yīng)用程序所使用的 DirectX 模塊有關(guān),你也可 以查看 DirectX 的庫(kù)目錄。最后,按“應(yīng)用”鈕和“確定”鈕,關(guān)閉屬性頁(yè)對(duì)話框。參見圖13-8o

29、DHICSTJMtf Ul10 / 56圖 13-8 設(shè)置 DirectX 的鏈接庫(kù)注意,對(duì) DirectX 鏈接庫(kù)的設(shè)置,只對(duì) VC05 中當(dāng)前打開的單個(gè)項(xiàng)目有效。在安裝了 DirectX SDK,并設(shè)置好文件路徑和鏈接庫(kù)后,就可以開始編寫具體的 DirectX 應(yīng)用程序了。DirectX 的組件眾多、功能強(qiáng)大、編程復(fù)雜,完整的介紹需要幾本大部頭的專著才行, 本書只準(zhǔn)備簡(jiǎn)單介紹 DirectX 的最主要模塊一一 Direct3D 和 DirectSound 編程的最基本內(nèi)容。13.2 Direct3D 編程簡(jiǎn)介Direct3D (直接三維)是 DirectX 的核心模塊,新版本的 Direc

30、t3D 中還包含原來 DirectDraw 模塊的 2D 功能。因此,現(xiàn)在的 Direct3D 是 DirectX Graphics 的唯一模塊,具有 DirectX (二、三維)圖形的全部功能。13.2.1 流水線與設(shè)備Direct3D 用圖形流水線(graphics pipelin來處理和渲染場(chǎng)景(render scene,而 Direct3D 設(shè)備(device)是執(zhí)行變換(transformation)和光照(lighting )等操作的渲染部件。Direct3D 圖形流水線配fl):IS動(dòng)(Pitwig)v平臺(tái)vl I配罷営理簡(jiǎn).3E ffi-配世蟲號(hào)現(xiàn)調(diào)試t C/C+-撬捋器濟(jì)單更

31、杵I |Udm. Lb 43dxU. Lib 43dx.libAEQ期路所有歎認(rèn)年否喚塊定袞立件再1S塊毎 E 到程導(dǎo)集 播人托営穿1H比件SMin肚遲辦DC的DLL舞年集幣赭岳ift AM IHL奮敬t店卓工* ifiL 兀桂生成開 *瀏覽信息+比咸耐 *目定義生成澤七代碼倆Im.ftsfi Ftsiwr且朗加播理頂指走要苗UU劉鋰按陽(yáng)帀加頊測(cè)如MH? ILLJ :與且住吧査右關(guān).11 / 56可通過 Direct3D 圖形流水線來充分利用硬件性能,以提供高效處理和繪制Direct3D 場(chǎng)景到顯示器的能力。圖 13-9 為流水線(pipeline,管線/管道/流程)的組成模塊框圖。Direc

32、t3D 設(shè)備Direct3D 設(shè)備(device)是 Direct3D 的渲染部件,它封裝和存儲(chǔ)渲染狀態(tài)。另外,它還 執(zhí)行變換和光照等操作,并且光柵化圖像到表面(如屏幕)。在結(jié)構(gòu)上,Direct3D 設(shè)備包含變換模塊(transformation module)、光照模塊(lighting module)和光柵化器(rasterize)。圖 13-10為 Direct3D 的設(shè)備架構(gòu)(architecture)。當(dāng)前,Direct3D 有兩種主要的設(shè)備類型:HAL 設(shè)備(hal device)-具有硬件加速的光柵化(rasterization),可同時(shí)使用硬件和軟件的頂點(diǎn)處理進(jìn)行著色(shad

33、i ng)。參考設(shè)備(referenee device)- 由軟件驅(qū)動(dòng)程序提供,現(xiàn)在主要用于性能測(cè)試。具有軟件特性的參考設(shè)備不一定能提供與硬件等同的性能,因此應(yīng)用程序必須總是查 詢?cè)O(shè)備的能力以確定其支持哪些特性。Direct3D 的基本編程過程如圖 13-11 所 示。下面各小節(jié)依次介紹 Direct3D 編程的基 本步驟和方法。為了使用 Direct3D,你必須首先創(chuàng)建一 個(gè)應(yīng)用窗口,然后再創(chuàng)建和初始化Direct3D對(duì)象。利用這些對(duì)象所實(shí)現(xiàn)的 COM 接口來操 作它們,以創(chuàng)建繪制場(chǎng)景所需的其它對(duì)象。如果進(jìn)行 MFC 編程,則可以省略創(chuàng)建窗 口這一步,而直接使用視圖類所代表的客戶 區(qū)窗口。變

34、換模塊光照模塊光柵化器1322 基本編程過程13.2.3 創(chuàng)建和初始化對(duì)象圖 13-9 Direct3D 圖形流水線Direct3D 設(shè)備架構(gòu)圖 13-10 Direct3D 設(shè)備架構(gòu)13 / 56下面介紹的是初始化 Direct3D 的內(nèi)容, 包括創(chuàng)建 Direct3D 對(duì)象、創(chuàng)建 Direct3D 設(shè)備 和設(shè)置Direct3D 設(shè)備的渲染(render 著色)圖 13-11 Direct3D 編程的基本過程狀態(tài)等。創(chuàng)建 Direct3D 對(duì)象 可使用全局函數(shù) Direct3DCreate9 來創(chuàng)建 Direct3D 接口對(duì)象:IDirect3D9 * Direct3DCreate9 ( /

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

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

37、nedDeviceInterface / 代表被創(chuàng)建設(shè)備的 / IDirect3DDevice9返回接口的指針地址); 其中,展現(xiàn)參數(shù)結(jié)構(gòu) D3DPRESENT_PARAMETERS 的定義為:typedef struct D3DPRESENT_PARAMETERS / 展現(xiàn)參數(shù)結(jié)構(gòu)UINT BackBufferWidth, BackBufferHeight; / 后臺(tái)緩沖區(qū)的寬高(以像素為單位), / 對(duì)窗口模式可取為 0,對(duì)全屏模式則必須與當(dāng)前顯卡枚舉模式的一致 D3DFORMATBackBufferFormat; / 后臺(tái)緩沖區(qū)的格式,可取為/ D3DFMT_UNKNOWN (= 0)U

38、INT BackBufferCount; / 后臺(tái)緩沖區(qū)計(jì)數(shù),可取為 03,取 0 時(shí)等價(jià)于 1D3DMULTISAMPLE_TYPE MultiSampleType; / 多樣本類型,一般取為 /D3DMULTISAMPLE_NONE (= 0)DWORD MultiSampleQuality; / 多樣本質(zhì)量水平,一般取 0 D3DSWAPEFFECTSwapEffect; / 交換效果,可取為/ D3DSWAPEFFECT_DISCARD (= 1)、D3DSWAPEFFECT_FLIP(= 2) / 和D3DSWAPEFFECT_COPY (= 3)等枚舉值HWND hDeviceWi

39、ndow; / 設(shè)備窗口的句柄,對(duì)窗口模式可取為 NULL(= 0) BOOLWindowed; / 應(yīng)用程序在窗口 /全屏中運(yùn)行時(shí)取 TRUE/FALSEBOOL EnableAutoDepthStencil; / 允許自動(dòng)深度模板,為 TRUE 則由 Direct3D/ 來管理應(yīng)用程序的深度緩沖區(qū)D3DFORMAT AutoDepthStencilFormat; / 自動(dòng)深度模板格式,可取15 / 56/ D3DFMT_D16 、 D3DFMT_D24S8 和 D3DFMT_D32 等枚舉值 DWORD Flags;/ 表現(xiàn)標(biāo)志 D3DPRESENTFLAG 常數(shù)之一, 可取為 0 UIN

40、T FullScreen_RefreshRateInHz;/ 全屏?xí)r的屏幕刷新率,對(duì)窗口模式必須為 0 UINT PresentationInterval; / 前后臺(tái)緩沖區(qū)交換的最大速率,可取為/ D3DPRESENT_INTERVAL_DEFAULT (= 0) D3DPRESENT_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

41、.SwapEffect = D3DSWAPEFFECT_DISCARD; / 放棄交換效果d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; / 未知格式d3dpp.EnableAutoDepthStencil = TRUE; / 允許自動(dòng)深度模板d3dpp.AutoDepthStencilFormat = D3DFMT_D16; / 16 位深度緩沖 LPDIRECT3DDEVICE9g_pd3dDevice; / 定義 D3D 設(shè)備接口的指針 / 創(chuàng)建 D3D 設(shè)備對(duì)象(獲取 D3D 設(shè)備接口的指針) g_pD3D-CreateDevice( D3DADAPT

42、ER_DEFAULT, D3DDEVTYPE_HAL,this-m_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,&g_pd3dDevice );設(shè)置設(shè)備的渲染狀態(tài)利用 IDirect3D9 接口的 CreateDevice 方法所返回的設(shè)備接口 IDirect3DDevice9 的指針, 可以調(diào)用該接口的設(shè)置渲染 (render著色) 狀態(tài)方法SetRenderState來初始化設(shè)備: HRESULT SetRenderState( / 成功返回 D3D_OK (= 0)D3DRENDERSTATETYPE State,

43、/ 設(shè)備狀態(tài)DWORD Value / 設(shè)置值);其中,設(shè)備狀態(tài) State,可取 D3DRENDERSTATETYPE 枚舉的任意值,女口 D3DRS_ZENABLE(允許Z 緩沖)、 D3DRS_FILLMODE (填充模式)、 D3DRS_SHADEMODE (陰影模式)、D3DRS_ALPHATESTENABLE (允許a測(cè)試)、 D3DRS_CULLM0DE (易 V 除模式)、D3DRS_FOGENABLE(允許霧化)、D3DRS_LIGHTING(光照)、D3DRS_DITHERENABLE(允許抖動(dòng))、 。例如:g_pd3dDevice-SetRenderState( D3DR

44、S_CULLM0DE, D3DCULL_N0NE ); / 關(guān)閉背面易除g_pd3dDevice-SetRenderState( D3DRS_ZENABLE, TRUE ); / 允許 Z 緩沖16 I 56g_pd3dDevice-SetRenderState( D3DRS_LIGHTING,FALSE ); / 關(guān)閉光照13.2.4 創(chuàng)建場(chǎng)景三維場(chǎng)景是由若干物體(幾何對(duì)象)構(gòu)成的, 復(fù)雜的幾何對(duì)象由多個(gè)簡(jiǎn)單的圖元(點(diǎn)、線、三 角形和多邊形等)所組成,而圖元(primitive)又是頂點(diǎn)(vertex)的集合。3D 圖元一般是一個(gè)多面體,通常用其表面的三角網(wǎng)格來表示,參見圖 13-12。所以

45、最基本的圖元是三角形和頂點(diǎn)。創(chuàng)建場(chǎng)景中的幾何對(duì)象,等價(jià)于建立表示該幾何體的頂點(diǎn)集合。因此,必須先定義自己 的頂點(diǎn)結(jié)構(gòu)并創(chuàng)建頂點(diǎn)緩沖區(qū),然后在鎖定頂點(diǎn)緩沖區(qū)后,再通過給頂點(diǎn)緩沖區(qū)中的各頂點(diǎn) 結(jié)構(gòu)賦值來構(gòu)造幾何對(duì)象,最后解鎖頂點(diǎn)緩沖區(qū)。定義頂點(diǎn)結(jié)構(gòu)Direct3D 使用一種 FVF ( Flexible Vertex Format 可變頂點(diǎn)格式)結(jié)構(gòu)來定義頂點(diǎn),以滿 足用戶的不同需要。在 FVF 結(jié)構(gòu) CUSTOMVERTEX 中,可以包含描述頂點(diǎn)的位置、RHW(reciprocal homogeneous W 倒數(shù)齊次 w,表示已變換頂點(diǎn)位置的齊次坐標(biāo) w 分量)、法向、 大小和(漫射、鏡面反射

46、)顏色等字段,具體內(nèi)容由用戶根據(jù)需要自己來確定,但是各字段 之間的相對(duì)順序不能改變。其中,頂點(diǎn)的位置和法向等字段,一般為三維點(diǎn)向量,可以用 Direct3D 的擴(kuò)展三維向量 結(jié)構(gòu)D3DXVECTOR3 來表示:typedef struct D3DXVECTOR3 FLOAT x; FLOAT y; FLOAT z; D3DXVECTOR3; 其中的 FLOAT為 float 的 typedef 類型,定義在 windef.h 頭文件中。而顏色一般采用 DWORD 的 typedef 定義類型D3DCOLOR。例如:struct CUSTOMVERTEX II 含位置、法向量和顏色的自定義頂點(diǎn)結(jié)

47、構(gòu) D3DXVECTOR3position; II 未變換頂點(diǎn)的 3D 位置 D3DXVECTOR3 normal; II 頂點(diǎn)的表面法向量D3DCOLOR color; II 顏色;或:struct CUSTOMVERTEX II 含位置、顏色和紋理坐標(biāo)的自定義頂點(diǎn)結(jié)構(gòu) D3DXVECTOR3position; II 未變換頂點(diǎn)的 3D 位置D3DCOLOR color; II 顏色FLOAT tu, tv; II 紋理坐標(biāo);或:struct CUSTOMVERTEX II 含位置齊次坐標(biāo)和顏色的自定義頂點(diǎn)結(jié)構(gòu)FLOAT x, y,乙 rhw; /已變換頂點(diǎn)的 3D 位置 DWORD col

48、or; / 顏色圖 13-12 3D 圖元表面的三角網(wǎng)格17 / 56;用戶在定義了自己的頂點(diǎn)結(jié)構(gòu)類型后,還需要定義一個(gè)對(duì)應(yīng)的(宏)常量,來描述該結(jié)構(gòu)的字段內(nèi)容。該(宏)常量由若干表示頂點(diǎn)格式的標(biāo)志位符號(hào)常量(參見表13-1)的位或組合而成。表 13-1 頂點(diǎn)數(shù)據(jù)格式標(biāo)志符號(hào)常量值數(shù)據(jù)類型描述D3DFVF XYZ0 x002float, float, float未轉(zhuǎn)換的頂點(diǎn)坐標(biāo)D3DFVF XYZRHW0 x004float, float, float, float已轉(zhuǎn)換的頂點(diǎn)坐標(biāo)D3DFVF XYZB150 x006/8/a/c/e1- 3 個(gè) float含權(quán)重 i 的頂點(diǎn)坐標(biāo)D3DFVF

49、XYZW0 x4002float, float, float, float已轉(zhuǎn)換和裁剪的頂點(diǎn)坐標(biāo)D3DFVF NORMAL0 x010float, float, float頂點(diǎn)的法線D3DFVF PSIZE0 x020float點(diǎn)大小D3DFVF DIFFUSE0 x040DWORD(ARGB)漫射顏色D3DFVF SPECULAR0 x080DWORD(ARGB)鏡面反射顏色D3DFVF TEX080 x08001- 4 個(gè) floati 重紋理映射例如:#defi ne D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIF

50、FUSE) 或:#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1) 或:constDWORD FVF = (D3DFVF_XYZRHW | D3DFVF_DIFFUSE);創(chuàng)建頂點(diǎn)緩沖區(qū)在定義了頂點(diǎn)結(jié)構(gòu)后,就可以創(chuàng)建頂點(diǎn)緩沖區(qū)了,這可以由IDirect3DDevice9 接口的CreateVertexBuffer 方法來完成:HRESULT CreateVertexBuffer( / 成功返回 D3D_OK( = 0)UINT Length, / 緩沖區(qū)的字節(jié)大小,一般為 n*sizeof (CUSTO

51、MVERTEX)DWORD Usage, /緩沖區(qū)用法的附加屬性標(biāo)志,一般為 0DWORD FVF, /頂點(diǎn)結(jié)構(gòu)格式常量D3DPOOL Pool, /緩沖區(qū)所在的內(nèi)存池類型(D3DPOOL 枚舉值) IDirect3DVertexBuffer9*ppVertexBuffer, / 返回被創(chuàng)建的頂點(diǎn)緩沖區(qū)指針 HANDLE* pSharedHandle / 保留,設(shè)為NULL);其中,內(nèi)存池類型 D3DPOOL 枚舉的定義為:typedef enum D3DPOOL /內(nèi)存池類型枚舉D3DPOOL_DEFAULT = 0, / AGP 存儲(chǔ)器或顯存D3DPOOL_MANAGED = 1, / A

52、GP 存儲(chǔ)器或顯存,且在系統(tǒng)內(nèi)存中還有一份拷貝D3DPOOL_SYSTEMMEM = 2,11 系統(tǒng)內(nèi)存D3DPOOL_SCRATCH = 3, /系統(tǒng)內(nèi)存中的臨時(shí)池 D3DPOOL_FORCE_DWORD =0 x7fffffff / 未使用(強(qiáng)制該枚舉被編譯成 32 位) D3DPOOL;例如: g_pd3dDevice-CreateVertexBuffer( 100 * sizeof (CUSTOMVERTEX), 0,D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL );或:g_pd3dDevice-CreateVertexB

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

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

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

56、投影矩陣變換),還要將超出屏幕的部分去掉(裁剪),也可以將場(chǎng)景投射到屏幕 的某個(gè)矩形區(qū)域中(視口縮放)。參見圖 13-13。19 / 56圖 13-13 Direct3D 的變換引擎下面依次對(duì)這些變換加以介紹,這需要首先介紹Direct3D 中的矩陣定義和變換方法。矩陣與變換在 Direct3D 中,定義了矩陣(matrix)結(jié)構(gòu) D3DXMATRIX :typedef struct D3DXMATRIX / 矩陣結(jié)構(gòu)struct /注意,C/C+的變量名可以下劃線開頭(但不能以數(shù)字開頭)FLOAT _11; FLOAT _12; FLOAT _13; FLOAT _14;FLOAT _21;

57、 FLOAT _22; FLOAT _23; FLOAT _24;FLOAT _31; FLOAT _32; FLOAT _33; FLOAT _34;FLOAT _41; FLOAT _42; FLOAT _43; FLOAT _44;構(gòu)(從 D3DXMATRIX 派生的 C+結(jié)構(gòu)對(duì)象)typedef struct _D3DXMATRIXA16 : public D3DXMATRIX / 16字節(jié)對(duì)齊矩陣結(jié)構(gòu)_D3DXMATRIXA16();_D3DXMATRIXA16( CONST FLOAT * f);_D3DXMATRIXA16( CONST D3DMATRIX & m);_D

58、3DXMATRIXA16( 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(v

59、oid* p);struct _D3DXMATRIXA16 & operator=(CONST D3DXMATRIX & rhs); _D3DXMATRIXA16;typedef D3DX_ALIGN16 _D3DXMATRIXA16 D3DXMATRIXA16;Direct3D 還提供了若干全局矩陣函數(shù),如:變換引擎世觀察變換變換投影變換; D3DXMATRIX;對(duì)應(yīng)于 4*4 的浮點(diǎn)矩陣:11_12_13 _1421_22_23 _2431_32_33 _3441424344在 Direct3D 中,還定義了一個(gè)對(duì)In tel P4 CPU 運(yùn)算進(jìn)行了優(yōu)化的16 字節(jié)對(duì)齊的

60、裁剪與視口縮放D3DXMATRIX * D3DXMatrixIde ntity( D3DXMATRIX * pOut ); /創(chuàng)建單位矩陣FLOAT D3DXMatrixDetermi nan t(CONST D3DXMATRIX * pM); / 返回矩陣的行列式值D3DXMATRIX * D3DXMatrixI nverse( / 計(jì)算逆矩陣D3DXMATRIX * pOut, / 結(jié)果矩陣FLOAT * pDeterminant, / 行列式值,可置為 NULLCONST D3DXMATRIX * pM / 原矩陣);D3DXMATRIX * D3DXMatrixMultiply( / 兩矩陣相乘D3DXMATRIX * pOut, / 結(jié)果矩陣CONST D3DXMATRIX * pM

溫馨提示

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

評(píng)論

0/150

提交評(píng)論