




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2,第10章 文字處理,本章將討論如何使用Direct3D生成和輸出文本。在Direct3D中,文本的輸出主要有三種方法,對(duì)于每一種方法都可以在本書相關(guān)的網(wǎng)站上找到對(duì)應(yīng)的實(shí)例。 主要目標(biāo): 如何用ID3DXFont接口輸出文字。 如何用CD3DFont類來進(jìn)行文字輸出。 怎樣計(jì)算并輸出幀速。 如何使用D3DXCreateText方法創(chuàng)建3D文字效果。,3,10.1 ID3DXFont、ID3DXFont接口,D3DX庫是使用ID3DXFont接口來在Direct3D應(yīng)用程序中輸出文字的。這個(gè)接口通過GDI(圖形設(shè)備接口)來輸出文字,因此用這個(gè)接口完成任務(wù)的時(shí)候會(huì)有些效率上的損失。 但是,運(yùn)用了
2、GDI,ID3DXFont可以處理復(fù)雜的文字和文字格式。,4,10.1.1 創(chuàng)建一個(gè)ID3DXFont接口,在DirectX中通過D3DXCreateFontIndirect方法來創(chuàng)建一個(gè)ID3DXFont接口: HRESULTWINAPID3DXCreateFontIndirect( LPDIRECT3DDEVICE9pDevice,/ 當(dāng)前所使用的設(shè)備 CONST D3DXFONT_DESC*pDesc, / 字體描述結(jié)構(gòu) LPD3DXFONT*ppFont/ 返回的字體接口 ); 下面的代碼展示了這個(gè)方法的具體應(yīng)用: 參見教材P150,5,10.1.2 文字輸出,當(dāng)獲得了一個(gè)ID3DXF
3、ont接口以后,可以方便地利用ID3DXFont接口的DrawText方法來輸出文字: INT ID3DXFont:DrawText( LPCSTR pString, INT Count, LPRECT pRect, DWORD Format, D3DCOLOR Color );,6,10.1.2 文字輸出,范例代碼如下: Font-DrawText( Hello World, / 待輸出字符串 -1, / NULL結(jié)尾(Null terminating)的字符串 ,7,10.1.3 計(jì)算幀速(FPS),在程序開始的時(shí)候,聲明3個(gè)全局變量: DWORD FrameCnt;/ 已經(jīng)渲染的幀數(shù) f
4、loat TimeElapsed; / 已經(jīng)經(jīng)過的時(shí)間 float FPS; / FPS 程序中每秒鐘計(jì)算一次幀速,即每秒鐘內(nèi)的平均幀數(shù),從而保證幀速在一秒的時(shí)間間隔內(nèi)得到的幀速不會(huì)改變,以便擁有充足的時(shí)間在它改變之前讀出數(shù)據(jù)。,8,10.1.3 計(jì)算幀速(FPS),每一幀渲染結(jié)束后都會(huì)將幀數(shù)計(jì)數(shù)器FrameCnt加1,然后將時(shí)間計(jì)數(shù)器TimeElapsed加上渲染的每?jī)蓭g經(jīng)過的時(shí)間差timeDelta: FrameCnt+; TimeElapsed += timeDelta; 每一秒時(shí)間間隔后,通過下面的公式計(jì)算幀速: FPS = (float)FrameCnt / TimeElapse
5、d; 每一次計(jì)算完畢幀速后,需要重設(shè)FrameCnt和TimeElapsed變量的值來開始下一秒鐘幀速的計(jì)算。,9,10.1.3 計(jì)算幀速(FPS),下面是計(jì)算幀速的完整代碼: void CalcFPS(float timeDelta) FrameCnt+; TimeElapsed += timeDelta; if(TimeElapsed = 1.0f) FPS = (float)FrameCnt / TimeElapsed; TimeElapsed = 0.0f; FrameCnt = 0; ,10,10.2 CD3DFont、CD3DFont類,由于CD3DFont使用了Direct3D代
6、替GDI來渲染文本,因此它比ID3DXFont更快。但是,CD3DFont不能像ID3DXFont那樣支持復(fù)雜的文字和格式。 如果你想要提高程序的效率并且簡(jiǎn)單的文字格式就能滿足需求,那么CD3DFont類可以方便地解決問題。 使用CD3DFont類之前需要把如下的文件加入到你的工程中去:d3dfont.h、d3dfont.cpp、d3dutil.h、d3dutil.cpp、dxutil.h和dxutil.cpp,這些文件可以在DirectX SDK根目錄下的SamplesC+Common文件夾下面的Include和Src文件夾內(nèi)找到。,11,10.2.1 構(gòu)造CD3DFont對(duì)象,下面是CD3
7、DFont類的構(gòu)造函數(shù): CD3DFont(const TCHAR *strFontName, DWORD dwHeight, DWORD dwFlags=0L); 實(shí)例化一個(gè)CD3DFont對(duì)象后,必須調(diào)用下面的方法將CD3DFont對(duì)象創(chuàng)建到Direct3D設(shè)備中去,或者從Direct3D設(shè)備中卸載(之所以這樣做,是為了滿足D3D框架程序的需要,因?yàn)楫?dāng)Direct3D應(yīng)用程序中出現(xiàn)設(shè)備丟失時(shí),需要重建與設(shè)備相關(guān)的對(duì)象,包括CD3DFont對(duì)象,設(shè)備丟失的情況在Windows 2000中打開任務(wù)管理器時(shí)可能發(fā)生): Font = new CD3DFont(Times New Roman, 1
8、6, 0); / 創(chuàng)建CD3DFont對(duì)象 Font-InitDeviceObjects(Device); Font-RestoreDeviceObjects();,12,10.2.2 DrawText輸出文字,函數(shù)DrawText用于將文字輸出到屏幕: HRESULT CD3DFont:DrawText(FLOAT x, FLOAT y, DWORD dwColor, const TCHAR *strText, DWORD dwFlags=0L); 例如: Font-DrawText(20, 20, 0 xff000000, Hello, World);,13,10.2.3 銷毀CD3DFo
9、nt對(duì)象,在從堆中刪除CD3DFont對(duì)象之前,必須首先調(diào)用CD3DFont類的一些方法,以便安全地釋放CD3DFont對(duì)象,如下所示: Font-InvalidateDeviceObjects(); Font-DeleteDeviceObjects(); delete Font;,14,10.3 三維網(wǎng)格(3D Mesh)在文字顯示中的應(yīng)用,10.3.1 D3DXCreateText方法 D3DXCreateText方法被用來創(chuàng)建文本的三維網(wǎng)格圖像。 圖10.1顯示了本章例子FontMesh3D渲染的三維網(wǎng)格圖像。,15,10.3 三維網(wǎng)格(3D Mesh)在文字顯示中的應(yīng)用,函數(shù)的原型如下
10、: HRESULT D3DXCreateText( LPDIRECT3DDEVICE9 pDevice,/ Mesh關(guān)聯(lián)的Device HDC hDC,/將要用來創(chuàng)建mesh的文本的設(shè)備上下文句柄 LPCTSTR pText,/指向需要顯示的以NULL結(jié)尾的字符串的指針 FLOAT Deviation, FLOAT Extrusion,/按照負(fù)Z方向指定的Font的深度 LPD3DXMESH *ppMesh,/返回被創(chuàng)建的Mesh LPD3DXBUFFER *ppAdjacency, LPGLYPHMETRICSFLOAT pGlyphMetrics );,16,10.3 三維網(wǎng)格(3D Mesh)在文字顯示中的應(yīng)用,下面的實(shí)例代碼展示了如何用這個(gè)函數(shù)來創(chuàng)建一個(gè)三維網(wǎng)格: 參見教材P155 然后可以用Mesh的DrawSubset方法渲染這個(gè)3D文字網(wǎng)格信息: Text-DrawSubset(0);,17,10.4 小 結(jié),如果你需要復(fù)雜的字體格式
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 茂名二模文綜政治試題
- JavaScript Vue.js前端開發(fā)任務(wù)驅(qū)動(dòng)式教程-課件 仇善梁 模塊1-8 JavaScript知識(shí)入門及應(yīng)用 - Vue.js基礎(chǔ)知識(shí)及應(yīng)用
- 老年骨科護(hù)理課件
- 老年術(shù)后護(hù)理課件
- 老年護(hù)理案例分析課件
- 出租車司機(jī)權(quán)益保障及服務(wù)質(zhì)量提升合同
- 餐飲店加盟與承包合同規(guī)范
- 成品柴油零售連鎖經(jīng)營(yíng)合同
- 車棚施工安全標(biāo)準(zhǔn)與環(huán)境保護(hù)合同
- 老人二便護(hù)理課件
- 人工智能技術(shù)在供應(yīng)鏈管理中的應(yīng)用研究綜述
- 2025年貴州貴陽市城市發(fā)展投資集團(tuán)股份有限公司招聘筆試參考題庫附帶答案詳解
- 反應(yīng)釜設(shè)備知識(shí)培訓(xùn)課件
- EPC國(guó)際工程稅收爭(zhēng)議案例分析與風(fēng)險(xiǎn)防范策略
- 《危險(xiǎn)房屋鑒定標(biāo)準(zhǔn)JGJ125-2016》
- 汽車制造業(yè)廉政風(fēng)險(xiǎn)控制措施
- 《急性胰腺炎小講座》課件
- 2024版人教版八年級(jí)上冊(cè)英語單詞表(含音標(biāo)完整版)
- 3.5-跨學(xué)科實(shí)踐:探索廚房中的物態(tài)變化問題(課件)八年級(jí)物理上冊(cè)(人教版2024)
- 馬工程管理學(xué)
- 應(yīng)急安全管理培訓(xùn)
評(píng)論
0/150
提交評(píng)論