D3D學習筆記(七)

2021-06-22 14:06:20 字數 2760 閱讀 5900

幾何資訊

id3dxbasemesh介面包含乙個頂點快取和乙個索引快取,可用以下方法得到指向這些介面的指標。

hresult id3dxmesh::getvertexbuffer9* vb = 0;

hresult id3dxmesh::getindexbuffer9* ib =0;

如果想鎖定快取進行讀寫操作,那麼可使用如下函式:

hresult id3dxmesh::lockvertexbuffer(dword flags,byte** ppdata);

hresult id3dxmesh::lockindexbuffer(dword flags,byte** ppdata);

其中flags描述了鎖定的方式,可以是0也可以是以下標記之一或某種組合。

當完成讀寫操作後,一定要呼叫相應的解鎖方法

hresult id3dxmesh::unlockvertexbuffer();

hresult id3dxmesh::unlockindexbuffer();

子集和屬性快取

乙個子集是網格中一組可用相同屬性進行繪製的三角形單元,這裡的屬性是指材質、紋理金和繪製狀態。

為了區分不同的子集,為每個子集指定乙個唯一的非負整數id。這些三角形單元的屬性id被儲存在網格的屬性快取中,

該屬性快取實際上是乙個dword型別的陣列,由於每個麵片(即三角形單元)在屬性快取中都有對應項,所以屬性快取中

元素的個數與網格中麵片的個數完全相等。而且屬性快取中的那些項與在索引快取中定義的三角形單元是一一對應的:即屬性

快取中的第i項對應於索引快取中的第i個三角形。三角形單元i是由索引快取中如下三個索引定義的:

a=i·3

b=i·3+1

c=i·3+2

訪問屬性快取同樣需要鎖定和解鎖操作。

繪製

id3dxmesh介面提供了方法drawsubset(dword attribid)用於繪製由引數attribid指定的子集中的三角形單元:

mesh->drawsubset(0);//此處0表示子集的id

網格優化

為了更高效的繪製網格,可對網格中的頂點和索引進行重組,該重組過程稱為網格優化。

hresult id3dxmesh::optimaizeinplace(

dword flags,//優化選項標記,通知該方法所要實施的優化方案

const dword* padjacencyin,//指向未經優化的網格的鄰接陣列的指標

dword* pajacencuout,//指向乙個dword型別陣列的指標

dword* pfaceremap,//指向乙個dword型別陣列的指標

lpd3dxbuffer* ppvertexremap//指向id3dxmesh物件指標的位址,該物件保留了頂點的重繪資訊

dword ajacencyinfo[mesh->getnumfaces()*3];

mesh->generateajacency(0.0f,adjacencyinfo);

dword optimizedajacencyinfo(mesh->getnumface*3);

mesh->optimizeinplace(

d3dxmeshopt_attrsort |

d3dxmeshopt_compact |

d3dxmeshopt_vertexcache,

adjacencyinfo,

optimizedadjacencyinfo,

0,0);

屬性表如果使用d3dxmeshopt——attrsort優化選項還將建立乙個屬性表,該屬性表是乙個d3dxattributerance型別的結構陣列。

屬性表中的每一項都對應網格的乙個子集,並制定了該子集中麵片的幾何資訊被儲存在頂點快取或索引快取的哪乙個儲存塊中。d3dxattribu

trange結構的定義如下:

typedef struct _d3dxattributrange

d3dxattributerange;

可借助如下方法訪問乙個網格面的屬性表

hresult id3dxmesh::getattributetable(

d3dxattributerange* pattribtable,

dword* patrribtablesize

);

鄰接資訊對於某些網格計算,需要知道對給定的三角形麵片,哪些麵片與其鄰接,這些鄰接資訊都儲存在網格的鄰接陣列中。

鄰接陣列的型別為dword,如果鄰接陣列中的某一項等於ulong_max = 2^32-1 = 4294967295,則表明網格中某一特定邊沒有鄰接

麵片

轉殖

如果要建立網格資料的副本,可用如下方法建立

id3dxmesh* clone = 0;

mesh->clonemeshfvf(

mesh->getoptions(),//和源網格使用同樣的建立標記

d3dfvf_xyz | d3dfvf_normal,//指定轉殖網格的靈活頂點格式

device,

&clone

);

D3D學習筆記(四)

光照 光照可分為環境光,漫射光,鏡面光三種 三種顏色的光均可用d3decolorvalue或d3dxcolor來表示,描述光線的顏色時,d3dxcolor中的alpha值將被忽略 材質 材質可用結構d3dmaterial9來表示 typedef struct d3dmaterial9d3dmater...

D3D學習筆記 繪製

1 頂點 索引緩衝區 頂點 索引緩衝區是一片儲存著頂點 索引資料的記憶體。頂點緩衝區通過idirect3dvertexbuffer9介面來定義的。索引緩衝區時通過idirect3dindexbuffer9介面來定義的。1.1 建立乙個頂點緩衝區和乙個索引緩衝區 建立頂點緩衝區函式原型 hresult...

D3D學習筆記 模板

模版快取是乙個遠離螢幕的快取,我們能夠用它來完成一些特效。模版快取與後快取和深度快取有相同的定義,因此在模版快取中的 i j 畫素與後快取和深度快取中的 i j 畫素是相協調的。就象名字所說,模版快取就象乙個模版它允許我們印刷渲染後快取的某個部分。1.使用模板快取 1.1啟用模版快取 device ...