Direct3D基本圖元和頂點緩沖_第1頁
Direct3D基本圖元和頂點緩沖_第2頁
Direct3D基本圖元和頂點緩沖_第3頁
Direct3D基本圖元和頂點緩沖_第4頁
Direct3D基本圖元和頂點緩沖_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論