




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
DirectX技術(shù)
基本圖元和頂點(diǎn)緩沖圖元三維圖元是組成單個(gè)三維實(shí)體的頂點(diǎn)集合。在D3D中,一共有三種基本圖元,分別是點(diǎn)、線和三角形。通常三維圖元是多邊形。一個(gè)多邊形是由至少三個(gè)頂點(diǎn)描繪的三維形體。最簡(jiǎn)單的多邊形是三角形。Direct3D使用三角形組成大多數(shù)多邊形,因?yàn)槿切蔚娜齻€(gè)頂點(diǎn)一定是共面的。應(yīng)用程序可以用三角形組合成大而復(fù)雜的多邊形及網(wǎng)格(mesh)。繪制基本圖元所有的3D圖形都是由三角形構(gòu)成的。為什么是三角形而不是別的圖形呢?因?yàn)槿切斡性S多優(yōu)越之處,例如:繪制效率。而且我們知道,任意不在同一條直線上的三個(gè)點(diǎn)都能構(gòu)成三角形,這對(duì)于在空間中形成某種復(fù)雜圖形是很有益處的。所以,如果我們想得到一個(gè)矩形,最有效率的是繪制兩個(gè)相同的合并的三角形,這樣要優(yōu)于直接繪制一個(gè)矩形。
頂點(diǎn)頂點(diǎn)(vertex)就是3D空間中的一個(gè)點(diǎn)。例如,三角形有三個(gè)頂點(diǎn),而矩形有四個(gè)。在3D空間中,可以用三個(gè)頂點(diǎn)來(lái)指定一個(gè)三角形。要理解頂點(diǎn),我們首先要理解笛卡爾坐標(biāo)系。
2D迪卡爾坐標(biāo)系統(tǒng)
3D迪卡爾坐標(biāo)系統(tǒng)
3DPrimitives
Primitive為“原始”之意,3Dprimitive就是設(shè)備所支持的原始的類型。通常我們也把它們稱作“圖元”。Primitive包括:點(diǎn)列、線列、線帶、三角形列、三角形帶和三角扇形。
下面是各種圖元的示例PointListsLineLists
LineStrips
TriangleLists
TriangleStrips
TriangleFans
幾個(gè)基本概念FlexibleVertexFormat(FVF)(靈活頂點(diǎn)格式)
VertexBuffers(頂點(diǎn)緩沖)
Colours(顏色)
FlexibleVertexFormat(FVF)
(靈活頂點(diǎn)格式)靈活頂點(diǎn)格式(FVF)是用來(lái)描述頂點(diǎn)屬性的一種格式,而這種格式是可以由我們自定義的,所以稱它為“靈活頂點(diǎn)格式”。至此,我們至少知道了頂點(diǎn)有三種屬性:x值、y值和z值。其實(shí)頂點(diǎn)還可以有其他屬性,例如顏色。利用靈活頂點(diǎn)格式(FVF)我們能方便的指定頂點(diǎn)的屬性。/*如果我們?cè)贒irect3D指定了一個(gè)多邊形,這個(gè)多邊形將可以被它的各個(gè)頂點(diǎn)的屬性所填充,而且是帶有過(guò)渡性的屬性填充。*/在D3D里,靈活頂點(diǎn)格式是用一些標(biāo)志的組合來(lái)表示的,如:D3DFVF_XYZRHWD3DFVF_XYZD3DFVF_NORMALD3DFVF_TEX0D3DFVF_DIFFUSE標(biāo)志組合 #defineD3DFVF_CUSTOMVERTEX(D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
VertexBuffers(頂點(diǎn)緩沖)
頂點(diǎn)緩沖就是一塊用于保存頂點(diǎn)的內(nèi)存緩沖區(qū)。頂點(diǎn)緩沖可以保存任何的頂點(diǎn)類型。當(dāng)一些頂點(diǎn)已經(jīng)被保存在頂點(diǎn)緩沖區(qū)中,就可以通過(guò)程序操作它們,例如渲染、變換等。Colours(顏色
)在DirectX中,如果我們要指定一種顏色,我們可以用D3DCOLOR_XRGB宏。宏中有三個(gè)參數(shù),每個(gè)參數(shù)都是0到255間的整數(shù)值,分別用于描述顏色的紅、綠、藍(lán)分量例如: D3DCOLOR_XRGB(0,0,0)是黑色。 D3DCOLOR_XRGB(255,255,255)是純白色。 D3DCOLOR_XRGB(0,255,0)是亮綠色(沒(méi)有紅與藍(lán),全是綠色的分量)。 D3DCOLOR_XRGB(100,20,100)是暗紫色(100紅,20綠,100藍(lán))。渲染頂點(diǎn)Direct3D寫的應(yīng)用程序使用頂點(diǎn)(Vertex)構(gòu)造幾何物體。每一個(gè)三維空間(3D)場(chǎng)景包括一個(gè)或幾個(gè)這樣的幾何物體。用頂點(diǎn)構(gòu)造一個(gè)幾何物體應(yīng)該采用以下步驟:定義一個(gè)自定義頂點(diǎn)類型創(chuàng)建頂點(diǎn)緩沖渲染到顯示屏
重新定義程序框架創(chuàng)建Direct3D對(duì)象創(chuàng)建Direct3D設(shè)備渲染清除對(duì)象、釋放設(shè)備Windows框架程序Init3D進(jìn)入消息循環(huán)之前,調(diào)用Init3D。若失敗,則退出程序在消息循環(huán)中渲染場(chǎng)景在消息循化結(jié)束時(shí)作善后工作定義一個(gè)自定義頂點(diǎn)類型First創(chuàng)建頂點(diǎn)緩沖然后定義一個(gè)自定義頂點(diǎn)類型
structCUSTOMVERTEX{FLOATx,y,z,rhw;//Thetransformed //positionforthevertex.DWORDcolour;//Thevertexcolour.};
上面的結(jié)構(gòu)說(shuō)明了自定義頂點(diǎn)類型的格式。下一步是定義FVF以描述頂點(diǎn)緩沖區(qū)中的頂點(diǎn)內(nèi)容。以下代碼片段定義了一個(gè)FVF并符合此上建立的自定義頂點(diǎn)類型。
#defineD3DFVF_CUSTOMVERTEX\ (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
可變頂點(diǎn)格式標(biāo)記描述了使用中的自定義頂點(diǎn)類型。前述示例代碼使用了D3DFVF_XYZRHW和D3DFVF_DIFFUSE標(biāo)志,這將告訴頂點(diǎn)緩沖,自定義頂點(diǎn)類型包含一組轉(zhuǎn)換過(guò)的點(diǎn)坐標(biāo)并緊跟著一個(gè)顏色參數(shù)。其中,x、y使用窗口坐標(biāo),z、rhw代表深度.只要把z,rhw設(shè)置成常數(shù)(通常z取0,rhw取1),就可以用它來(lái)定義二維圖形。colour描述了對(duì)應(yīng)頂點(diǎn)的顏色現(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)建頂點(diǎn)緩沖及其步驟創(chuàng)建頂點(diǎn)數(shù)組在顯存里創(chuàng)建頂點(diǎn)緩沖將頂點(diǎn)數(shù)據(jù)拷貝到頂點(diǎn)緩沖里在沒(méi)有引入變換矩陣之前,我們的坐標(biāo)系是這樣的 屏幕坐標(biāo)系(0,0)創(chuàng)建頂點(diǎn)數(shù)組頂點(diǎn)坐標(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)} };
這段代碼片段采用六個(gè)頂點(diǎn)填充六個(gè)Vertex,并指定了每個(gè)頂點(diǎn)的散射光的顏色。每一點(diǎn)都具有相同的Z值1.0及1.0的RHW參數(shù)創(chuàng)建頂點(diǎn)緩沖區(qū)
創(chuàng)建頂點(diǎn)緩沖區(qū),用到CreateVertexBuffer,該函數(shù)的原型是:HRESULTIDirect3DDevice9::CreateVertexBuffer( UINTLength, DWORDUsage, DWORDFVF, D3DPOOLPool IDirect3DVertexBuffer9**ppVertexBuffer, HANDLE*pSharedHandle);Length:新頂點(diǎn)緩沖區(qū)預(yù)計(jì)的大小Usage:
指定關(guān)于怎樣使用緩存的額外信息。這個(gè)值可以是0,或者是下面標(biāo)記的一個(gè)或多個(gè)的組合:D3DUSAGE_DYNAMIC——設(shè)置這個(gè)參數(shù)可以使緩存是動(dòng)態(tài)的。D3DUSAGE_POINTS——這個(gè)參數(shù)指定緩存存儲(chǔ)原始點(diǎn)。D3DUSAGE_SOFTWAREPROCESSING——使用軟件頂點(diǎn)處理D3DUSAGE_WRITEONLY——指定應(yīng)用程序只能寫緩存。它允許驅(qū)動(dòng)程序分配最適合的內(nèi)存地址作為寫緩存。注意如果從創(chuàng)建好的這種緩存中讀數(shù)據(jù),將會(huì)返回錯(cuò)誤信息。FVF:靈活頂點(diǎn)格式,這里的頂點(diǎn)格式是 D3DFVF_CUSTOMVERTEX,就是在程序最先 定義的FVF值Pool:頂點(diǎn)緩沖區(qū)的存儲(chǔ)位置,一般情況下使用
D3DPOOL_DEFAULT標(biāo)記告 Direct3D在最合適的位置創(chuàng)建此頂點(diǎn)
緩沖區(qū)。**ppVertexBuffer:返回創(chuàng)建完成的頂點(diǎn)緩的地址pSharedHandle:沒(méi)有使用,設(shè)置為0。綜上,我們創(chuàng)建頂點(diǎn)緩沖區(qū)的代碼如下:if(FAILED(g_pD3DDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL))){ returnE_FAIL;}拷貝數(shù)據(jù)創(chuàng)建了頂點(diǎn)緩沖區(qū)之后,開始采用自定義格式的頂點(diǎn)填充緩沖區(qū)中的數(shù)據(jù)。要完成這步操作,我們需要鎖定頂點(diǎn)緩沖區(qū)把數(shù)據(jù)寫入頂點(diǎn)緩沖區(qū)解鎖鎖定頂點(diǎn)緩沖區(qū)鎖定緩沖區(qū),需要用到函數(shù):Lock
其原型是:
HRESULTIDirect3DVertexBuffer9::Lock( UINTOffsetToLock, UINTSizeToLock, VOID**ppbData, DWORDFlags );OffsetToLock:是鎖定頂點(diǎn)數(shù)據(jù)的偏移量,按
字節(jié)計(jì)算SizeToLock:需鎖定的頂點(diǎn)數(shù)據(jù)長(zhǎng)度,同樣按字
節(jié)計(jì)算**ppbData:一個(gè)VOID類型指針的地址,
用于返回指向頂點(diǎn)數(shù)據(jù)的地址Flags:告知頂點(diǎn)緩沖區(qū)如何鎖定數(shù)據(jù)
一般賦值為0鎖定的代碼片段if(FAILED(g_pVertexBuffer->Lock( 0, sizeof(cvVertices), &pVertices, 0) ) ){ returnE_FAIL;}把數(shù)據(jù)寫入頂點(diǎn)緩沖區(qū)通過(guò)鎖定,我們已經(jīng)是指針pVertices指向了頂點(diǎn)緩沖區(qū),所以下面只要用Windows的API函數(shù)memcpy就可以向頂點(diǎn)緩沖區(qū)里拷貝數(shù)據(jù)了memcpy函數(shù)的原型: void*memcpy(void *dest,//目的地址
constvoid*src,//源地址
size_t count//要拷貝的數(shù)據(jù)字節(jié)數(shù)
);所以,拷貝的代碼:
memcpy(pVertices,cvVertices,sizeof(cvVertices));解除鎖定通過(guò)使用memcpy,頂點(diǎn)被復(fù)制到頂點(diǎn)緩沖區(qū)里。將頂點(diǎn)放入緩沖區(qū)之后,因該調(diào)用一次IDirect3DVertexBuffer9::Unlock以解鎖頂點(diǎn)緩沖區(qū)函數(shù)原型:
HRESULTUnlock();解鎖的代碼:
g_pVertexBuffer->Unlock();
渲染現(xiàn)在緩沖區(qū)已經(jīng)填入頂點(diǎn),就可以把它渲染到顯示屏上。渲染的一般步驟:清除顏色緩存、模板緩存、深度緩存調(diào)用BeginSecen()函數(shù)打開3D渲染開關(guān)設(shè)置流數(shù)據(jù)源設(shè)置頂點(diǎn)格式渲染圖元調(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()) { … }
這個(gè)函數(shù)在使用過(guò)程中,要注意檢查它的返回值在BeginScene函數(shù)沒(méi)有調(diào)用成功時(shí),不可以調(diào)用EndScene();在BeginScene()調(diào)用成功后,如果渲染過(guò)程中,有任何錯(cuò)誤發(fā)生,需要調(diào)用EndScene()關(guān)閉渲染開關(guān)在調(diào)用EndSecne()時(shí)不必檢查函數(shù)的返回值。設(shè)置流數(shù)據(jù)源
設(shè)置流數(shù)據(jù)源目的是告訴Direct3D要渲染的頂點(diǎn)在何處,設(shè)置流數(shù)據(jù)源需要用到IDirect3DDevice9::SetStreamSource函數(shù)。函數(shù)原型:
HRESULTSetStreamSource(
UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData,
UINT OffsetInBytes, UINT Stride
);StreamNumber:設(shè)備設(shè)置數(shù)據(jù)流的索引。有些顯卡支持多個(gè)數(shù)據(jù)流同時(shí)渲染。這里這個(gè)索引等于頂點(diǎn)流數(shù)目-1。當(dāng)只有一個(gè)數(shù)據(jù)流,這個(gè)值應(yīng)該等于0*pStreamData:指向該數(shù)據(jù)流上的頂點(diǎn)緩沖區(qū)的指針OffsetInBytes:相對(duì)流開始處的偏移量。以字節(jié)為單位,它指定被填入渲染管線的頂點(diǎn)數(shù)據(jù)的開始位置。通過(guò)檢查D3DCAPS9結(jié)構(gòu)中的D3DDEVCAPS2_STREAMOFFSET標(biāo)志,假如你的設(shè)備支持,那么這個(gè)參數(shù)就有一些非0值。Stride:我們?cè)陧旤c(diǎn)緩存中操作的每個(gè)部分的流的字節(jié)大 小。代碼:
g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer,0,sizeof(CUSTOMVERTEX));設(shè)置頂點(diǎn)格式接下來(lái)應(yīng)該通過(guò)調(diào)用IDirect3DDevice9::SetFVF函數(shù)使Direct3D了解使用中的頂點(diǎn)類型。函數(shù)原型:
HRESULTSetFVF(DWORDFVF); SetFVF()唯一的參數(shù)是當(dāng)前設(shè)置的頂點(diǎn)處理器的句柄。這個(gè)參數(shù)的值是程序自定義的靈活頂點(diǎn)格式。即定義的宏D3DFVF_CUSTOMVERTEX。
以下代碼片段設(shè)置頂點(diǎn)格式:
g_pD3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);渲染圖元接下來(lái)使用IDirect3DDevice9::DrawPrimitive繪制頂點(diǎn)緩沖區(qū)中的頂點(diǎn)函數(shù)原型:
HRESULTDrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount );PrimitiveType:通知Direct3D繪制哪種類型的圖元這是一個(gè)枚舉類型
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:第一個(gè)頂點(diǎn)的索引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)建頂點(diǎn)緩沖代碼HRESULTInitVertexBuffer(){ VOID*pVertices; //Storeeachpointofthetriangletogetherwith//it'scolour //創(chuàng)建頂點(diǎn)數(shù)組
CUSTOMVERTEXcvVertices[]= { {-100.0
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 綠色金融支持的氣候變化適應(yīng)機(jī)制-洞察闡釋
- 納米顆粒在碳水化合物中的應(yīng)用及其安全性研究-洞察闡釋
- 競(jìng)爭(zhēng)優(yōu)勢(shì)識(shí)別與培育-洞察闡釋
- 基于微服務(wù)架構(gòu)的子程序比較研究-洞察闡釋
- 歷史書籍閱讀后的寫作心得與范文
- 安徽中醫(yī)藥大學(xué)第二附屬醫(yī)院招聘考試真題2024
- 基于大數(shù)據(jù)分析的整體失效系統(tǒng)復(fù)原-洞察闡釋
- 教育管理人員調(diào)動(dòng)申請(qǐng)書范文
- 語(yǔ)文教研組教案交流計(jì)劃
- 快遞配送效率提升應(yīng)急措施
- GB 45672-2025車載事故緊急呼叫系統(tǒng)
- 規(guī)劃測(cè)量協(xié)議書
- 模具開發(fā)保密協(xié)議書
- DB41T 2794-2024高速公路隧道和高邊坡監(jiān)測(cè)技術(shù)指南
- 2025年會(huì)展經(jīng)濟(jì)與管理考試試題及答案
- 2025年護(hù)士考試安全管理試題及答案
- 2024秋招北森題庫(kù)數(shù)學(xué)百題
- 招聘社工考試試題及答案
- 磚和砌塊材料試題及答案
- 倍智tas人才測(cè)評(píng)系統(tǒng)題庫(kù)及答案
- 2023年新高考(新課標(biāo))全國(guó)2卷數(shù)學(xué)試題真題(含答案解析)
評(píng)論
0/150
提交評(píng)論