




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
DirectX技術(shù)
基本圖元和頂點緩沖圖元三維圖元是組成單個三維實體的頂點集合。在D3D中,一共有三種基本圖元,分別是點、線和三角形。通常三維圖元是多邊形。一個多邊形是由至少三個頂點描繪的三維形體。最簡單的多邊形是三角形。Direct3D使用三角形組成大多數(shù)多邊形,因為三角形的三個頂點一定是共面的。應(yīng)用程序可以用三角形組合成大而復(fù)雜的多邊形及網(wǎng)格(mesh)。繪制基本圖元所有的3D圖形都是由三角形構(gòu)成的。為什么是三角形而不是別的圖形呢?因為三角形有許多優(yōu)越之處,例如:繪制效率。而且我們知道,任意不在同一條直線上的三個點都能構(gòu)成三角形,這對于在空間中形成某種復(fù)雜圖形是很有益處的。所以,如果我們想得到一個矩形,最有效率的是繪制兩個相同的合并的三角形,這樣要優(yōu)于直接繪制一個矩形。
頂點頂點(vertex)就是3D空間中的一個點。例如,三角形有三個頂點,而矩形有四個。在3D空間中,可以用三個頂點來指定一個三角形。要理解頂點,我們首先要理解笛卡爾坐標(biāo)系。
2D迪卡爾坐標(biāo)系統(tǒng)
3D迪卡爾坐標(biāo)系統(tǒng)
3DPrimitives
Primitive為“原始”之意,3Dprimitive就是設(shè)備所支持的原始的類型。通常我們也把它們稱作“圖元”。Primitive包括:點列、線列、線帶、三角形列、三角形帶和三角扇形。
下面是各種圖元的示例PointListsLineLists
LineStrips
TriangleLists
TriangleStrips
TriangleFans
幾個基本概念FlexibleVertexFormat(FVF)(靈活頂點格式)
VertexBuffers(頂點緩沖)
Colours(顏色)
FlexibleVertexFormat(FVF)
(靈活頂點格式)靈活頂點格式(FVF)是用來描述頂點屬性的一種格式,而這種格式是可以由我們自定義的,所以稱它為“靈活頂點格式”。至此,我們至少知道了頂點有三種屬性:x值、y值和z值。其實頂點還可以有其他屬性,例如顏色。利用靈活頂點格式(FVF)我們能方便的指定頂點的屬性。/*如果我們在Direct3D指定了一個多邊形,這個多邊形將可以被它的各個頂點的屬性所填充,而且是帶有過渡性的屬性填充。*/在D3D里,靈活頂點格式是用一些標(biāo)志的組合來表示的,如:D3DFVF_XYZRHWD3DFVF_XYZD3DFVF_NORMALD3DFVF_TEX0D3DFVF_DIFFUSE標(biāo)志組合 #defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
VertexBuffers(頂點緩沖)
頂點緩沖就是一塊用于保存頂點的內(nèi)存緩沖區(qū)。頂點緩沖可以保存任何的頂點類型。當(dāng)一些頂點已經(jīng)被保存在頂點緩沖區(qū)中,就可以通過程序操作它們,例如渲染、變換等。Colours(顏色
)在DirectX中,如果我們要指定一種顏色,我們可以用D3DCOLOR_XRGB宏。宏中有三個參數(shù),每個參數(shù)都是0到255間的整數(shù)值,分別用于描述顏色的紅、綠、藍分量例如: D3DCOLOR_XRGB(0,0,0)是黑色。 D3DCOLOR_XRGB(255,255,255)是純白色。 D3DCOLOR_XRGB(0,255,0)是亮綠色(沒有紅與藍,全是綠色的分量)。 D3DCOLOR_XRGB(100,20,100)是暗紫色(100紅,20綠,100藍)。渲染頂點Direct3D寫的應(yīng)用程序使用頂點(Vertex)構(gòu)造幾何物體。每一個三維空間(3D)場景包括一個或幾個這樣的幾何物體。用頂點構(gòu)造一個幾何物體應(yīng)該采用以下步驟:定義一個自定義頂點類型創(chuàng)建頂點緩沖渲染到顯示屏
重新定義程序框架創(chuàng)建Direct3D對象創(chuàng)建Direct3D設(shè)備渲染清除對象、釋放設(shè)備Windows框架程序Init3D進入消息循環(huán)之前,調(diào)用Init3D。若失敗,則退出程序在消息循環(huán)中渲染場景在消息循化結(jié)束時作善后工作定義一個自定義頂點類型First創(chuàng)建頂點緩沖然后定義一個自定義頂點類型
structCUSTOMVERTEX{FLOATx,y,z,rhw;//Thetransformed //positionforthevertex.DWORDcolour;//Thevertexcolour.};
上面的結(jié)構(gòu)說明了自定義頂點類型的格式。下一步是定義FVF以描述頂點緩沖區(qū)中的頂點內(nèi)容。以下代碼片段定義了一個FVF并符合此上建立的自定義頂點類型。
#defineD3DFVF_CUSTOMVERTEX\ (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
可變頂點格式標(biāo)記描述了使用中的自定義頂點類型。前述示例代碼使用了D3DFVF_XYZRHW和D3DFVF_DIFFUSE標(biāo)志,這將告訴頂點緩沖,自定義頂點類型包含一組轉(zhuǎn)換過的點坐標(biāo)并緊跟著一個顏色參數(shù)。其中,x、y使用窗口坐標(biāo),z、rhw代表深度.只要把z,rhw設(shè)置成常數(shù)(通常z取0,rhw取1),就可以用它來定義二維圖形。colour描述了對應(yīng)頂點的顏色現(xiàn)在,我們的程序頭部應(yīng)該有這些聲明LPDIRECT3D9 g_pD3D=NULL;LPDIRECT3DDEVICE9 g_pD3DDevice=NULL;LPDIRECT3DVERTEXBUFFER9g_pVertexBuffer=NULL;//BuffertoholdverticesstructCUSTOMVERTEX{FLOATx,y,z,rhw;//Thetransformed //positionforthevertex. DWORDcolour;//Thevertexcolour.};#defineD3DFVF_CUSTOMVERTEX\(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
創(chuàng)建頂點緩沖及其步驟創(chuàng)建頂點數(shù)組在顯存里創(chuàng)建頂點緩沖將頂點數(shù)據(jù)拷貝到頂點緩沖里在沒有引入變換矩陣之前,我們的坐標(biāo)系是這樣的 屏幕坐標(biāo)系(0,0)創(chuàng)建頂點數(shù)組頂點坐標(biāo)系CUSTOMVERTEXcvVertices[]= { {-100.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,0,0)}, {-50.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,255,0)}, {0.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,0,255)}, {50.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,0,255)}, {100.0+250,50.0+250,1.0,1.0, D3DCOLOR_XRGB(255,255,0)}, {150.0+250,-50.0+250,1.0,1.0, D3DCOLOR_XRGB(0,255,255)} };
這段代碼片段采用六個頂點填充六個Vertex,并指定了每個頂點的散射光的顏色。每一點都具有相同的Z值1.0及1.0的RHW參數(shù)創(chuàng)建頂點緩沖區(qū)
創(chuàng)建頂點緩沖區(qū),用到CreateVertexBuffer,該函數(shù)的原型是:HRESULTIDirect3DDevice9::CreateVertexBuffer( UINTLength, DWORDUsage, DWORDFVF, D3DPOOLPool IDirect3DVertexBuffer9**ppVertexBuffer, HANDLE*pSharedHandle);Length:新頂點緩沖區(qū)預(yù)計的大小Usage:
指定關(guān)于怎樣使用緩存的額外信息。這個值可以是0,或者是下面標(biāo)記的一個或多個的組合:D3DUSAGE_DYNAMIC——設(shè)置這個參數(shù)可以使緩存是動態(tài)的。D3DUSAGE_POINTS——這個參數(shù)指定緩存存儲原始點。D3DUSAGE_SOFTWAREPROCESSING——使用軟件頂點處理D3DUSAGE_WRITEONLY——指定應(yīng)用程序只能寫緩存。它允許驅(qū)動程序分配最適合的內(nèi)存地址作為寫緩存。注意如果從創(chuàng)建好的這種緩存中讀數(shù)據(jù),將會返回錯誤信息。FVF:靈活頂點格式,這里的頂點格式是 D3DFVF_CUSTOMVERTEX,就是在程序最先 定義的FVF值Pool:頂點緩沖區(qū)的存儲位置,一般情況下使用
D3DPOOL_DEFAULT標(biāo)記告 Direct3D在最合適的位置創(chuàng)建此頂點
緩沖區(qū)。**ppVertexBuffer:返回創(chuàng)建完成的頂點緩的地址pSharedHandle:沒有使用,設(shè)置為0。綜上,我們創(chuàng)建頂點緩沖區(qū)的代碼如下:if(FAILED(g_pD3DDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL))){ returnE_FAIL;}拷貝數(shù)據(jù)創(chuàng)建了頂點緩沖區(qū)之后,開始采用自定義格式的頂點填充緩沖區(qū)中的數(shù)據(jù)。要完成這步操作,我們需要鎖定頂點緩沖區(qū)把數(shù)據(jù)寫入頂點緩沖區(qū)解鎖鎖定頂點緩沖區(qū)鎖定緩沖區(qū),需要用到函數(shù):Lock
其原型是:
HRESULTIDirect3DVertexBuffer9::Lock( UINTOffsetToLock, UINTSizeToLock, VOID**ppbData, DWORDFlags );OffsetToLock:是鎖定頂點數(shù)據(jù)的偏移量,按
字節(jié)計算SizeToLock:需鎖定的頂點數(shù)據(jù)長度,同樣按字
節(jié)計算**ppbData:一個VOID類型指針的地址,
用于返回指向頂點數(shù)據(jù)的地址Flags:告知頂點緩沖區(qū)如何鎖定數(shù)據(jù)
一般賦值為0鎖定的代碼片段if(FAILED(g_pVertexBuffer->Lock( 0, sizeof(cvVertices), &pVertices, 0) ) ){ returnE_FAIL;}把數(shù)據(jù)寫入頂點緩沖區(qū)通過鎖定,我們已經(jīng)是指針pVertices指向了頂點緩沖區(qū),所以下面只要用Windows的API函數(shù)memcpy就可以向頂點緩沖區(qū)里拷貝數(shù)據(jù)了memcpy函數(shù)的原型: void*memcpy(void *dest,//目的地址
constvoid*src,//源地址
size_t count//要拷貝的數(shù)據(jù)字節(jié)數(shù)
);所以,拷貝的代碼:
memcpy(pVertices,cvVertices,sizeof(cvVertices));解除鎖定通過使用memcpy,頂點被復(fù)制到頂點緩沖區(qū)里。將頂點放入緩沖區(qū)之后,因該調(diào)用一次IDirect3DVertexBuffer9::Unlock以解鎖頂點緩沖區(qū)函數(shù)原型:
HRESULTUnlock();解鎖的代碼:
g_pVertexBuffer->Unlock();
渲染現(xiàn)在緩沖區(qū)已經(jīng)填入頂點,就可以把它渲染到顯示屏上。渲染的一般步驟:清除顏色緩存、模板緩存、深度緩存調(diào)用BeginSecen()函數(shù)打開3D渲染開關(guān)設(shè)置流數(shù)據(jù)源設(shè)置頂點格式渲染圖元調(diào)用EndScene()函數(shù)關(guān)閉3D渲染開關(guān)清除緩存,把屏幕背景清除為白色
g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(255,255,255),1.0f,0);調(diào)用BeginSecen()函數(shù)打開3D渲染開關(guān)
if(SUCCEEDED(g_pD3DDevice->BeginScene()) { … }
這個函數(shù)在使用過程中,要注意檢查它的返回值在BeginScene函數(shù)沒有調(diào)用成功時,不可以調(diào)用EndScene();在BeginScene()調(diào)用成功后,如果渲染過程中,有任何錯誤發(fā)生,需要調(diào)用EndScene()關(guān)閉渲染開關(guān)在調(diào)用EndSecne()時不必檢查函數(shù)的返回值。設(shè)置流數(shù)據(jù)源
設(shè)置流數(shù)據(jù)源目的是告訴Direct3D要渲染的頂點在何處,設(shè)置流數(shù)據(jù)源需要用到IDirect3DDevice9::SetStreamSource函數(shù)。函數(shù)原型:
HRESULTSetStreamSource(
UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData,
UINT OffsetInBytes, UINT Stride
);StreamNumber:設(shè)備設(shè)置數(shù)據(jù)流的索引。有些顯卡支持多個數(shù)據(jù)流同時渲染。這里這個索引等于頂點流數(shù)目-1。當(dāng)只有一個數(shù)據(jù)流,這個值應(yīng)該等于0*pStreamData:指向該數(shù)據(jù)流上的頂點緩沖區(qū)的指針OffsetInBytes:相對流開始處的偏移量。以字節(jié)為單位,它指定被填入渲染管線的頂點數(shù)據(jù)的開始位置。通過檢查D3DCAPS9結(jié)構(gòu)中的D3DDEVCAPS2_STREAMOFFSET標(biāo)志,假如你的設(shè)備支持,那么這個參數(shù)就有一些非0值。Stride:我們在頂點緩存中操作的每個部分的流的字節(jié)大 小。代碼:
g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));設(shè)置頂點格式接下來應(yīng)該通過調(diào)用IDirect3DDevice9::SetFVF函數(shù)使Direct3D了解使用中的頂點類型。函數(shù)原型:
HRESULTSetFVF(DWORDFVF); SetFVF()唯一的參數(shù)是當(dāng)前設(shè)置的頂點處理器的句柄。這個參數(shù)的值是程序自定義的靈活頂點格式。即定義的宏D3DFVF_CUSTOMVERTEX。
以下代碼片段設(shè)置頂點格式:
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);渲染圖元接下來使用IDirect3DDevice9::DrawPrimitive繪制頂點緩沖區(qū)中的頂點函數(shù)原型:
HRESULTDrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );PrimitiveType:通知Direct3D繪制哪種類型的圖元這是一個枚舉類型
typedefenum_D3DPRIMITIVETYPE { D3DPT_POINTLIST =1, D3DPT_LINELIST =2, D3DPT_LINESTRIP =3, D3DPT_TRIANGLELIST =4, D3DPT_TRIANGLESTRIP =5, D3DPT_TRIANGLEFAN =6, D3DPT_FORCE_DWORD =
0x7fffffff }D3DPRIMITIVETYPE;StartVertex:第一個頂點的索引PrimitiveCount:繪制的圖元的數(shù)目繪制圖元的代碼片段
switch(iStyle) { case0: g_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST,0,6); break; case1: g_pD3DDevice->DrawPrimitive( D3DPT_LINELIST,0,3); break; case2: g_pD3DDevice->DrawPrimitive( D3DPT_LINESTRIP,0,5); break;
case3: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST,0,2); break;
case4: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP,0,4); break; case5: g_pD3DDevice->DrawPrimitive( D3DPT_TRIANGLEFAN,0,4); break; default: g_pD3DDevice->DrawPrimitive( D3DPT_POINTLIST,0,6); break; }最后,調(diào)用EndScene()函數(shù)關(guān)閉3D渲染開關(guān),并把渲染結(jié)果拷貝到屏幕上代碼片段:
g_pD3DDevice->EndScene(); g_pD3DDevice->Present( NULL,NULL,NULL,NULL);創(chuàng)建頂點緩沖代碼HRESULTInitVertexBuffer(){ VOID*pVertices; //Storeeachpointofthetriangletogetherwith//it'scolour //創(chuàng)建頂點數(shù)組
CUSTOMVERTEXcvVertices[]= { {-100.0
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 防火門材料采購合同
- 苗木供應(yīng)購銷合同
- 飛機票轉(zhuǎn)讓合同
- 工程風(fēng)險規(guī)避闡明合同
- 建筑勞務(wù)承包合同示范
- 飛機零部件采購協(xié)議
- 通信網(wǎng)絡(luò)協(xié)議與數(shù)據(jù)傳輸原理測試卷
- 農(nóng)業(yè)生態(tài)循環(huán)經(jīng)濟生產(chǎn)方案合同
- 郵件營銷策略制定和執(zhí)行服務(wù)協(xié)議
- 電子商務(wù)平臺物流服務(wù)協(xié)議
- 帶狀皰疹性腦膜腦炎的治療及護理
- 2023年擴散膜行業(yè)市場需求分析報告及未來五至十年行業(yè)預(yù)測報告
- 老年患者預(yù)防燙傷
- 2024年江蘇綠色東海投資發(fā)展集團有限公司招聘筆試參考題庫附帶答案詳解
- GB/T 43564-2023中小學(xué)合成材料面層田徑場地
- 知行合一:王陽明傳
- 廣告宣傳欄及雕塑采購項目服務(wù)投標(biāo)方案(技術(shù)標(biāo))
- 國開《Windows網(wǎng)絡(luò)操作系統(tǒng)管理》形考任務(wù)4-配置故障轉(zhuǎn)移群集服務(wù)實訓(xùn)
- 波浪理論基礎(chǔ)圖解
- 角的度量說課PPT
- 肥皂盒模具畢業(yè)設(shè)計
評論
0/150
提交評論