Giáo trình Beginning DirectX9 (Phần 2)

Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
CHƯƠNG 7  
CHIA NHVÀ LÀM MN  
CÁC ĐỐI TƯỢNG  
n đã hc được cách làm thế nào để to các object 3D bng code và biu din nó  
lên màn hình. Có lbn đang nghĩ rng đây là mt quá trình tht nhàm chán và  
chưa có cách nào để có thto tt ccác object bng code. Bn nghĩ rt đúng.  
B
Hin nay 3D đã nhp cuôc. Nó có thmô tmi thtrong game ca bn rt ging vi  
thc th. Nhng mô hìnhcó ththhin vt thđặc đim xung quanh bn và cũng có  
thlà chính chính nó. Vi nhng đặc đim này bn có thể đưa nhng mô hình này vào  
game, bn có thbiu din nó vi đối tượng Mesh và dch chuyn hoc điu khin chúng.  
Đây là các phn mà bn shc trong chương này:  
ƒ
ƒ
ƒ
ƒ
ƒ
Direct3D điu khin mesh như thế nào ?  
Cn nhng gì để hp lý hóa mt model 3D?  
Định dng file X là gì?  
Làm thế nào để to và lưu gimesh?  
Làm thế nào để load mt model 3D vào game?  
Xây dng mt thế gii 3D  
Mô hình 3D giúp chúng bn thhin thế gii o mà bn mun to. Nhng mô hình này  
được bxung bi gamer và đối thca gamer trong môi trường này. Nhng mô hình này  
được ly từ đâu? Nếu bn có mt package thiết kế 3D ging như Max hoc Maya, bn đã  
có nhng công ccn thiết để to mi thcho game ca bn khi cn. Nếu nhng chương  
trình trên bn không có thì bn có thdùng nhng package khác như MilkShape 3D, nó  
cũng có thlàm vic tt.  
Sau khi đã to các model, bn đưa chúng vào mt trong nhng định dng file 3D hin có.  
Nhưng bn cn biết làm thế nào để load mt file định dng 3D vào game ca mình. Mc  
đích ca cun sách này là giúp bn làm vic vi nhng định dng file mà Microsoft đã  
to ra.  
Chú ý:  
Bn có thtìm MilkShape 3D ti trang http://www.swissquake.ch/chumbalum-  
96  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Mesh là gì?  
Code ca bn điu khin nhng mô hình 3D được load vào trong game cũng được xem  
như là mt Mesh. Mt Mesh là mt code container mà cha mi thliên quan đến đối  
tượng 3D. Nó bào gm các vectơ, ta độ texture và các dliu khác. Bng cách sdng  
dliu có trong mesh object bn có thbiu din các mô hình 3D lên màn hình .  
Chú ý:  
Thư vin tng hp D3DX cha tt cmi thmà bn cn để sdng mesh trong Direct3D  
Direct3D định nghĩa mt Mesh như thế nào?  
Hu hết các mesh trong Direct3D đều da trên ID3DXBaseMesh interface. Interface này  
cung cp kho dtrdành cho các model ca bn, giúp các methods có hiu lc để tăng  
tc độ truy cp ti dliu trong mesh. Ví dmethod GetVertexBuffer luôn sn có trong  
ID3DXBaseMesh interface để giúp bn truy cp trc tiếp ti vectơ buffer ca đối tượng  
mesh.  
Dưới đây là mt skiu Mesh khác nhau:  
ƒ ID3DXMesh Đây là dng mesh interface chun mà bn ssdng.  
ƒ ID3DXPMesh – Interface này cho phép bn sdng mesh tiến hành.  
ƒ ID3DXSPMesh – interface này điu khin sự đơn gin hóa các mesh object.  
ƒ ID3DXPatchMesh - Interface này cung cp Patch mesh theo chc năng.  
Mi mt kiu mesh có thlưu gitt ccác vectơ ca mt model trong vectơ buffer và  
cung cp cho bn thông tin vmodel, ví dnhư sphn thoc là svectơ.  
To Mesh  
Bước đầu tiên khi sdng các mesh trong game đó là skhi to mesh object. Mesh  
object là kho dtr, ct gitt ccác thông tin cn thiết dùn để mô tmodel ca bn  
trong Direct3D. Sau khi bn đã to ra mesh, bn ddàng copy tt cthông tin mà model  
ca bn cn.  
Hai hàm trong Direct3D dùng để to mesh: D3DXCreaetMesh D3DXCreateMeshFVF.  
Vì mi hàm này to mesh bng các cách khác nhau, chúng ta slàm rõ chai hàm dưới đây.  
D3DXCreateMesh  
Giao din ID3DXMesh là mt giao din đơn gin nht trong mesh interface, ddàng tchc  
và thc hin mt cách nhanh chóng. Trong phn này, bn shc cách làm thế nào để to  
mesh trong ID3DXMesh interface bng hàm D3DXCreateMesh.  
D3DXCreateMesh(  
DWORD NumFaces,  
DWORD NumVertices,  
DWORD Options,  
CONST LPD3DVERTEXELEMENT9 *pDeclaration,  
LPDIRECT3DDEVICE9 pDevice,  
LPD3DXMESH *ppMesh  
);  
97  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Hàm D3DcreateMesh có 6 tham s:  
ƒ NumFaces. Sphn tmà mesh scha.  
ƒ NumVertices. Svectơ mà mesh scha.  
ƒ Options. Giá trtbng lit kê D3DXMESH .  
ƒ pDeclaration. Ma trn thuc đối tượng D3DVERTEXELEMENT9. Nhng object  
này mô tFVF cho mesh.  
ƒ pDevice. Mt Direct3D device hp l.  
ƒ ppMesh. Con trtrti đối tượng ID3DMesh hp l.  
Đon code sau schra cách làm thế nào để to mt đối tượng mesh mà cha đầy đủ bộ  
vectơ, dùng để to mt khi lp phương.  
HRESULT hr;  
// biến gimt mesh được to mi  
LPD3DXMESH boxMesh;  
// ma trn D3DVERTEXELEMENT9  
D3DVERTEXELEMENT9 Declaration [MAX_FVF_DECL_SIZE];  
// to khai báo cn thiết cho hàm D3DXCreateMesh  
D3DXDeclaratorFromFVF (D3DFVF_CUSTOMVERTEX, Declaration);  
hr= D3DXCreateMesh(12,  
8,  
//sphn tca mesh  
//svectơ  
D3DXMESH_MANAGED,  
//sdng bnhcn thiết cho mesh  
Declaration,  
pd3dDevice,  
&boxMesh);  
//ma trn kiu đối tượng D3DVERTEXELEMENT9  
//the Direct3D device  
//biến gimesh  
//kim tra giá trtrvề để chc chn rng bn đã cómt đối tượng mesh hp l.  
if FAILD (hr)  
Return false;  
Như bn đã thy, đon code trên to ra mt mesh cha 12 phn tvà 8 vectơ và tt cchúng  
được đưa vào trong biến boxMesh. Biến thba là D3DXMESH_MANAGED thông báo  
Direct3D là cn sdng bnhcn thiết cho cvectơ và index buffer để to mesh.  
Bn nên chú ý là hàm D3DXDeclaratorFromFVF phi được gi trước hàm  
D3DXCreateMesh.  
D3DXDeclaratorFromFVF  
to  
đối  
tượng  
cn  
thiết  
D3DVERTEXELEMENT9 cho tham sth4 bng cách sdng Flexible Vertex Format  
(định dng véctơ linh hot) mà model ca bn sdng.  
Khi bn sdng hàm D3DXDeclaratorFromFVF, bn không cn thiết phi to ngay các đối  
tượng D3DVERTEXELEMENT9.  
D3DXCreatMeshFVF  
Hàm D3DXCreateMeshFVF không ging vi D3DcreateMesh mt đim là nó da vào  
skiến to mesh trên Định Dng Véctơ Linh Hot (Flexible Vertex Format) thay vì dùng  
Declarator. Mesh object này cũng ging vi mesh object được to bi hàm  
D3DXCreateMesh trong phn trước.  
Hàm D3DXCreatMeshFVF được định nghĩa như sau:  
HRESULT D3DXCreateMeshFVF(  
DWORD Numface,  
DWORD NumVertices,  
DWORD Options,  
DWORD FVF,  
98  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
LPDIRECT3DDEVICE9 pDevice,  
LPD3DXMESH *ppMesh  
);  
Hàm D3DXCreatMeshFVF cn 6 tham s:  
ƒ Numface - sphn tmà mesh scó  
ƒ NumVertices – svéctơ mà mà mesh scó  
ƒ Options – các giá trtbng lit kê D3DXMESH  
ƒ FVF – Flexible Vertex Format ca các véctơ.  
ƒ pDevice – Direct3D device hp l.  
ƒ ppMesh – con trtrti đối tượng ID3DXMESH  
Dưới đây là mt chương trình mu gi hàm D3DXCreateMeshFVF.  
//biến gigiá trtrvề  
HRESULT hr;  
//biến gimesh đựơc to mi  
LPD3DXMESH boxMesh;  
//to mesh bng cách gi gàm D3DXCreateMeshFVF  
hr= D3DXCreateMeshFVF (12,  
8,  
//Numfaces  
// NumVertices  
// Options  
// FVF  
// pDevice  
// ppMesh  
D3DFVF_MANAGED,  
D3DFVF_CUSTOMVERTEX,  
pd3dDevice,  
&boxMesh);  
//kim tra giá trtrvcó hp lkhông  
if FAILED (hr)  
return false;  
Mt ln na bn to mesh bng cách sdng bnhqun lý cho véctơ, index buffer và  
vic chỉ định giá trD3DXMESH_MANAGED. Khi vic gi hàm kết thúc, biến boxMessh  
sgiữ đối tượng mesh hp l.  
Hàm D3DXCreateMeshFVF là hàm dsdng nht trong hai hàm to mesh.  
Filling the Mesh.  
Bn đã to được mesh object, bn cn bxung thêm dliu để mô tmodel mà bn mun  
thhin. Ở đây, bn có mt kho rng vi kích thước thích hp để cha dliu cn thiết  
cho vic to khi lp phương.  
Để xác định mt khi lp phương, trước tiên bn cn lock véctơ buffer li và bxung vào  
nó 8 véctơ mà khi lp phương cn. Tiếp theo bn cn lock index buffer và copy toàn bộ  
index vào trong đó.  
Hàm SetupMesh chra dưới đây sgiúp bn tng bước hoàn thành mesh vi các thông  
tin cn thiết để to mt khi lp phương.  
/**************************************************************************************  
* SetupMesh  
* Set up the vertex buffer and index buffer of a mesh  
**************************************************************************************/  
HRESULT SetupMesh()  
{
HRESULT hr;  
//biến gigiá trtrvề  
///////////////////////////////////////////////////////////////////////////////  
//các véctơ ca vertex buffer  
CUSTOMVERTEX g_Vertices[ ]={  
99  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
// X  
{-1.0f, -1.0f, -1.0f, D3DCOLOR_ARGB(0,255,0,0)},  
{-1.0f, 1.0f, -1.0f, D3DCOLOR_ARGB(0,0,0,255)},  
Y
Z
//0  
//1  
//7  
{ 1.0f, 1.0f, -1.0f, D3DCOLOR_ARGB(0,0,255,0)},  
{ 1.0f, -1.0f, -1.0f, D3DCOLOR_ARGB(0,0,0,255)},  
{-1.0f, -1.0f, 1.0f, D3DCOLOR_ARGB(0,0,255,0)},  
{ 1.0f, -1.0f, 1.0f, D3DCOLOR_ARGB(0,0,0,255)},  
{ 1.0f, 1.0f, 1.0f, D3DCOLOR_ARGB(0,0,255,0)},  
{-1.0f, 1.0f, 1.0f, D3DCOLOR_ARGB(0,0,0,255)}  
//2  
//3  
//4  
//5  
//6  
};  
//Copy các véctơ vào trong vertex buffer  
VOID* pVertices;  
// lock vertex buffer  
hr = boxMesh->LockVertexBuffer(D3DLOCK_DISCARD, (void**)&pVertices);  
//kim tra li để chc chn là các vertex buffer đã lock  
if FAILED (hr)  
return hr;  
/////////////////////////////////////////////////////////////////////////////////  
//index buffer data  
//index buffer xác định các phn tca khi lp phương,  
//hai phn tử ở mi mt ca cube  
WORD IndexData[ ] = {  
0,1,2,  
2,3,0,  
4,5,6,  
6,7,4,  
0,3,5,  
5,4,0.  
3,2,6,  
6,5,3,  
2,1,7,  
7,6,2,  
1,0,4,  
4,7,1,  
//0  
//1  
//2  
//3  
//4  
//5  
//6  
//7  
//8  
//9  
//10  
//11  
}
//copy các véctơ vào buffer  
memcpy(pVertices, g_Vertices, sizeof(g_Vertices) );  
//mkhóa véctơ buffer  
boxMesh->UnlockVertexBuffer();  
//chun bcopy các index vào index buffer  
VOID* IndexPtr;  
//khóa index buffer  
hr-boxMesh->LockIndexBufffer( 0, &IndexPtr);  
//kim tra xem index buffer đã khóa chưa  
if FAILED (hr)  
return hr;  
//copy các index vào buffer  
memcpy(IndexPtr, IndexData, sizeof( IndexData)*sizeof(WORD));  
//mkhóa buffer  
boxMesh->UnlockIndexBuffer();  
return S_OK;  
}
Điu đầu tiên mà hàm SetupMesh làm đó là to ma trn g_Vertices. Ma trn này cha  
các véctơ và véctơ màu mà bn cn để xác định mt khi lp phương. Tiếp đó, vectơ  
buffer blocked như đã thy ví dtrên. Vic gi hàm memcpy là để copy tt ccác  
véctơ vào trong vertex buffer và sau đó thc hin unlock buffer.  
100  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Tiếp theo bn cn đin vào index buffer. Ging như vectơ buffer, bn phi lock nó trước  
khi dliu được copy vào nó. Các index mà index buffer sdng sẽ được xác định trong  
ma trn IndexData. Chú ý rng ma trn IndexData có kiu WORD, điu đó có nghĩa là  
chúng là nhng value 16-bit.  
Sau khi bn đã có các giá trxác định, bn lock index buffer và copy vào các index này  
bng vic gi hàm memcpy ri unlock index buffer.  
Chú ý:  
Cvectơ và index buffer đều cn thiết để to mt đối tượng mesh hp lệ  
Hin thMesh  
Bn đã to ra mt mesh và đưa dliu vào trong đó, như vy bn đã sn sàng đưa nó ra  
màn hình. Hàm drawMesh dưới đây schra vic biu din mt mesh scn nhng gì.  
Hàm này slàm khi lp phương quay trên màn hình.  
/***************************************************************************  
*void drawMesh (LPD3DXMESH mesh, D3DMATERIAL9 material)  
* Draws the mesh  
****************************************************************************/  
void drawMesh (LPD3DXMESH mesh, D3DMATERIAL9 *marterial)  
{
//quay mesh  
D3DXMATRIX matRot;  
D3DXMATRIX matView;  
D3DXMATRIX matWorld;  
//to ma ma trn quay  
D3DXMatrixMultiply(&matWorld, &matRot, &matView);  
//ly sbiến đổi vào kết quca ma trn matWorld  
pd3dDecice ->SetTransform( D3DTS_WORLDM, &matWorld);  
//đưa giliu vào sdng  
pd3dDevice->SetMaterial(material);  
//vmesh  
mesh->DrawSubset(0);  
}
Phn đầu tiên ca hàm drawMesh slà quay và dch chuyn khi lp phương trên màn  
hình. Sau đó giliu mà khi lp phương ssdng được np vào qua vic gi  
SetMaterial. Phn quan trng nht ca hàm drawMesh là gi DrawSubset.  
Hàm DrawSubset thông báo Direct3D phn nào ca mesh bn mun hin thlên màn  
hình. Vì mesh mà bn to ra phn trước chcha mt nhóm đơn thun, giá tr0 đã được  
truyn cho DrawSubset.  
Trên hình 7.1 schra kết qumesh đựợc hin thtrên màn hình. Bn stìm thy đầy đủ  
source code trong chapter7\example1 trên đia CD-ROM.  
101  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Hình 7.1 hình nh mesh ca cube trên màn hình.  
Chú ý:  
Mesh có thcha rt nhiu nhóm đặc tính khác. Nhng nhóm khác đó lưu gimt tp hp  
tt ccác phn tử được dùng để mô tsphân chia ca mesh. Ví dnhư nếu bn có 2  
vùng mesh mà cn 2 texture khác nhau, mi vùng trong đó sẽ đặt vào mt nhóm đặc tính  
riêng r. Bng cách này, bn có thể điu chnh li texture và giliu mà Dicrect3D sdng  
trước khi kết xut mi nhóm  
Ti ưu hóa Mesh.  
Khi mt mesh được to, nó không có định dng tt ưu để Direct3D v. Ví dmesh ca  
bn phi cha các véctơ blp li và được sdng cho nhiu phn t, hoc các véctơ và  
các phn tkhông được nm trong mt thtcó hiu qu. Khi ti ưu hóa mesh bng  
cách sdng các “véctơ được dùng chung” và cho phép các véctơ và các phn tsp xếp  
li, bn có thtăng quá trình thc hin khi kết xut mt mesh.  
Thư vin tng hp D3DX cung cp 2 hàm để ti ưu mesh: Optimize và OptimizeInplace.  
Mi mt hàm này vcơ bn thc hin cùng mt công vic nhưng vi các key khác nhau.  
Optimize to ra output mesh, ngược li OptimizeInplace làm thay đổi input mesh. Tôi sẽ  
gii thich cthhai hàm này được sdng vi mesh như thế nào.  
Hàm Optimize định nghĩa nhu sau, ly mt input mesh, ti ưu nó và khi to mt output mesh.  
HRESULT Optimize(  
DWORD Flags,  
CONST DWORD *pAdjacencyIn,  
DWORD *pAdjacencyOut,  
DWORD *pFaceRemap,  
LPD3DXBUFFER *ppVerTexRemap,  
LPD3DXMESH *ppOptMesh  
);  
Hàm Optimize có 6 tham s:  
ƒ
Flags là du hiu chra dng ti ưu cho vic thi hành. Bn càn tìm flag cho tham  
snày trong bng lit kê D3DXMESHOPT.  
102  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
ƒ pAdjacencyIn con trtrti ma trn đang lưu dliu lin khin ti cho input mesh.  
ƒ pAdjacencyOut con trtrti ma trn đang lưu gidliu lin kcho output  
mesh đựơc ti ưu.  
ƒ pFaceRemap con trtrti buffer đang lưu dindex mi cho output mesh.  
ƒ ppVertexRemap địa chgi đến con trca giao din ID3DXBufferdành cho  
output mesh.  
ƒ ppOptmesh mt giao din ID3DXMesh đang lưu gioutput mesh được to mi.  
Hàm OptimizeInplace làm thay đổi input mesh, được xác định như sau:  
HRESULT Optimize(  
DWORD Flags,  
CONST DWORD *pAdjacencyIn,  
DWORD *pAdjacencyOut,  
DWORD *pFaceRemap,  
LPD3DXBUFFER *ppVerTexRemap,  
);  
Hàm OptimizeInplace có 5 tham s:  
ƒ Flags – là du hiu chra dng ti ưu để thi hành. Bn có thtìm thy du hiu cho  
tham snày trong bng lit kê D3DXMESHOPT.  
ƒ pAdjacencyIn – con trtrti ma trn đang lưu gidliu lin khin ti cho mesh  
ƒ pAdjacencyOut – con trtrti buffer đang lưu gidũ liu lin kcho mesh được  
ti ưu. Nếu bn không mun tp trung dliu lin k, bn có thchuyn  
giá trNULL cho tham snày.  
ƒ pFaceRemap – con trtrti buffer đang lưu giũ index mi ca dũ liu mi phn  
t. Nếu bn không mun chn các thông tin này thì bn có thgán NULL  
cho tham snày.  
ƒ ppVerTexRemap – con trtrti giao din ID3DXBuffer dùng để lưu giũ index  
mi ca mi véctơ.  
Bng 7.1 Các tham sFlags  
Giá trị  
Mô tả  
D3DXMESHOPT_COMPACT  
Sp xếp li các bphn tử để bỏ đi các véctơ và  
các phn tkhông sdng  
D3DXMESHOPT_ATTRSORT  
Sp xếp li các bphn tử để gim strng thái  
giũ liu thay đổi  
D3DXMESHOPT_VERTEXCACH  
D3DXMESHOPT_STRIPREORDER  
Sp xếp li các bphn tử để giúp đưa ra hình vẽ  
Sp xếp các bphn tử để phóng to chiu dài ca  
hình tam giác gn k.  
D3DXMESHOPT_IGNOREVERTS  
D3DXMESHOPT_DONOTSPLIT  
Chgiúp các bphn tử đựợc ti ưu, còn các  
véctơ thì không.  
Ngăn nga sct nhcu các véctơ được chia sẻ  
trong nhóm.  
D3DXMESHOPT_DIVICEINDEPENDENT  
Giúp véctơ ct gikích thước vào mt tp hp mà  
kích thước đó làm vic tt trong phn cng đựoc  
tha kế.  
103  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Getting the Mesh Details  
Trong sut quá trình ti ưu hóa mesh, bn đang tò mò mun biết các details ca mesh mà  
bn đang làm vic có nhng gì. Ví dbn phi thi mình có bao nhiêu vécto hoc bao  
nhiêu bphn tmà mesh cha trước khi ti ưu hóa. Giao din ID3DXMesh cung cp 2  
hàm có ích cho mc đích này:  
ƒ GetNumVertices – Trvsvéctơ có trong mesh  
ƒ GetNumfaces – Trvsphn tcó trong mesh.  
Đon chưong trình sau là mt mu mà chra cách làm thế nào để sdng nhng hàm  
này và biu din mt ca sMessageBox cha sphn tvà svéctơ.  
//biu din svéctơ và sphn tvào mesh  
std::string numVertices;  
sprintf ( (char*) numVertices.c_str (), “message”, MB_OK);  
//biu din sphn ttrong mesh  
std::string numFaces;  
sprintf ( (char*) numFaces.c_str(),  
“numFaces = %d”,  
pMeshSysMem->GetNumFaces());  
MessageBox (NULL, numFaces.c_str (), “mesage”, MB_OK);  
Biến pMeshSysMem phi cha mt mesh hp ltrước khi GetNumVertices hoc là  
GetNumFaces được gi.  
The Attribute Table  
Trong sut quá trình ti ưu mesh, bn có stùy chn khi to mt bng đặc tính. Bng  
này bao gm nhng thông tin về đặc đim buffer ca mesh. Attribute buffer scha các  
đặc đim ca mi mt véctơ trong mesh.  
Như đã nói trước, mi mesh có thcha nhiu nhóm đặc tính. Mi nhóm đều cha mt  
danh sách các véctơ mà thc hin chc năng ca nhóm đó. Khi sdng nhiu nhóm đặc  
tính bn có thchia ct mt cách có la chn mesh thành các phn riêng r. Ví dmesh  
ca mt xe hơi có thchia thành nhóm cha thân xe và nhóm khác cha bánh xe. Nếu  
nhóm cha thân xe đánh du là nhóm 0 và nhóm cha bánh xe là nhóm 1 thì bn có thể  
sdng 2 cách gi hàm để gi hàm DrawSubset để vtoàn bxe hơi.  
cafMesh->DrawSubset(0);  
cafMesh->DrawSubset(1);  
// vthân  
// vbánh xe  
Vì mi nhóm có thcn các dliu khác nhau, vì vy vic gi hàm SetMaterial phi  
đựơc gi trước hàm DrawSubset.  
Để phân bit các nhóm riêng rtrong mesh, bn cn to bng đặc tính. Bn có thchto  
mt bng đặc tính bng cách gi mt trong hai hàm ti ưu. Khi bn gi hàm ti ưu và xp  
xếp li các bphn tthì mt bng đặc tính sẽ được khi to li. Theo mc định nếu như  
mesh cn nhiu hơn mt loi vt liu, mt tp hp con sẽ được khi to cho mi nhóm.  
Trong trường hp này khi lp phương bn đã to trong ví dtrước cha ch1 loi vt  
liu. Hàm OptimizeMesh sau đây sẽ đưa khi lp phương cha trong biến boxMeshvà  
chia nó thành 2 nhóm nhriêng. Mt na ca khi lp phương sẽ được biu din bng  
mt phn vt liu, còn phn th2 sbiu din bng phn vt liu khác.  
104  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
/*********************************************************************  
*OptimizeMesh  
*************************************************************************/  
void OptimizeMesh (void)  
{
//gi hàm OptimizeInplace để khto bng đặc tính  
boxMesh-> OptimizeInplace(D3DXMESHOPT_ATTRSORT, 0, NULL, NULL, NULL);  
DWORD numAttr;  
D3DXATTRIBUTERANGE *attribTable = D3DXATTRIBUTERANGE [2];  
// ly chsca vt thtrong bng  
boxMesh->GetAttributeTable(attributeTable, &numAttr);  
//chuyn đặc tính cho nhóm thnht  
attributeTable[0].AttriId = 0;  
attributeTable[0].FaceStart = 0;  
attributeTable[0].FaceCount = 6;  
attributeTable[0].VertexStart = 0;  
attributeTable[0] .VertexCount = 8;  
//chuyn đặc tính cho nhóm th2  
attributeTable[1]. AttriId = 1;  
attributeTable[1].FaceStart = 6;  
attributeTable[1].FaceCount = 6;  
attributeTable[1].VertexStart = 0;  
attributeTable[1] .VertexCount = 8;  
// viết bng đặc tính lên mesh  
boxMesh->SetAttributeTable(attributeTable, 2);  
}
Đon chương trình trên gi hàm OptimizeInplace trong mesh ca khi lp phương chưa  
biến boxMesh. Vì tôi sdng OptimizeInplace, nên tôi tiếp tc sdng mesh ca khi  
lp phương nguyên bn.  
Sau đó vì tôi to 2 nhóm đặc tính riêng rnên tôi sxây dng 1 ma trn có hai phn từ  
kiu D3DXATTRIBUTERANGE.  
D3DXATTRIBUTERANGE *attribTable = D3DXATTRIBUTERANGE [2];  
Mi phn tcu trúc D3DXATTRIBUTERANGE đều cha thông tin mà Direct3D cn để  
xác định bng đặc tính.  
Cu trúc D3DXATTRIBUTERANGE sẽ được chra dưới đây:  
Typedef struct_ D3DXATTRIBUTERANGE {  
DWORD AttribId;  
DWORD FaceStart;  
DWORD FaceCount;  
DWORD VertexStart;  
DWORD VertexCount  
} D3DXATTRIBUTERANGE;  
Cu trúc D3DXATTRIBUTERANGE có 5 biến:  
ƒ
ƒ
ƒ
ƒ
ƒ
AttribId chsca nhóm hin hành  
FaceStart chsphn tử đầu tiên trong nhóm này  
FaceCount sphn tscó trong nhóm này  
VertexStart chsca véctớ đầu tiên trong nhóm này  
VertexCount svéctơ mà nhóm này cha  
105  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Sau khi bn đã to ma trn cu trúc D3DXATTRIBUTERANGE, bn phi truy cp dliu  
bng đặc tính. Bn có thtruy cp bng đặc tính thông qua vic gi hàm  
GetAttributeTable. Hàm GetAttributeTable có thsdng trong hai cách:  
Cách thnht cho phép bn xác định chsca item mà hin ti có trong bng đặc tính.  
Khi bn chuyn giá tri NULL cho tham số đầu tiên vào hàm GetAttributeTable và cho  
con trtrỏ đến biến có kiu DWORD tham sth2 thì mesh schra chsca item  
hin ti trong bng. Item ly được strvmt biến được gán cho tham sth2. Mt  
mu gi hàm GetAttributeTable làm vic theo cách trên được chra dưới đây.  
DWORD numAttr;  
// biến gichsca item trong bng  
// sdng hàm GetAttributeTable để chn chsca item trong bng đặc tính.  
boxMesh->GetAttributeTable (NULL, &numAttr);  
Như bn có ththy phn gi hàm trên, biến numAttrđược truyn cho tham sthứ  
2. Khi hoàn thành vic gi hàm này, numAttr scha chsca item hin ti trong bng  
đặc tính.  
Bây gibn đã có chsca item, bn cn truy cp vào dliu trong bng. Bn có thsử  
dng hàm GetAttributeTable bng cách khác để thu thp thông tin. Trước đây bn đã to  
ma trn cu trúc có 2 phn tkiu D3DXATTRIBUTERANGE. Khi bn đưa ma trn  
attrriTable vào tham số đầu tiên và biến numAttr vào tham sth2 thì hàm  
GetAttributeTable snhp ma trn attribTable vi ni dung các dliu vào trong bng.  
Vic gi hàm GetAttributeTable sẽ được sdng trong cách được chra dưới đây:  
boxMesh->GetAttributeTable (attribTable, &numAttr);  
Ở đây, bn ddàng điu khin và thay đổi dliu vi ma trn attribTable. Nếu xem li  
hàm OptimizeMesh, bn sthy rng tôi đã thay đổi biến trong mi phn tcu trúc  
D3DXATTRIBUTERANGE. Tôi đã đổi cu trúc đầu tiên phn tử đứng vtrí đầu tiên  
và phn tth6 trong mesh, cái này mô tmt na phn tca khi lp phương.  
//truyn đặc tính cho biến nhóm th1  
attributeTable[0].AttriId = 0;  
// chsca nhóm  
attributeTable[0].FaceStart = 0;  
attributeTable[0].FaceCount = 6;  
attributeTable[0].VertexStart = 0;  
attributeTable[0] .VertexCount = 8;  
// phn tử đầu tiên trong nhóm  
//sbphn ttrong nhóm  
//véctơ đầu tiên trong nhóm  
//svéctơ trong nhóm  
Nhóm th2 bt đầu vi phn tth6 và bt đầu li vi 6 phn t. Sthay đổi khác trong  
cu trúc này là schuyn AttribId cho 1.  
//chuyn đặc tính cho nhóm th2  
attributeTable[1]. AttriId = 1;  
attributeTable[1].FaceStart = 6;  
attributeTable[1].FaceCount = 6;  
attributeTable[1].VertexStart = 0;  
attributeTable[1] .VertexCount = 8;  
Bước cui cùng cn làm là ct khi lp phương thành 2 nhóm đặc tính riêng lẽ để làm  
thay đổi tính cht ca bng đặc tính và cp nht li mesh ca khi lp phương vi nhng  
thay đổi này. Scp nht các đặc tính ca bng trong mesh đã được thc hin qua hàm  
SetAttributeTable dưới đây:  
HRESULT SetAttributeTable(  
CONST D3DXATTRIBUTERANGE *pAttribTable,  
DWORD cAttribTableSize  
);  
hàm SetAttributeTable chcó 2 tham s:  
ƒ
pAttribTable – con trtrti bng đặc tính để cp nht li mesh  
106  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
ƒ
cAttribTableSize – giá trchrõ kích thước ca bng đặc tính  
Đon chương trình sau schra bng cách nào hàm SetAttributeTable có thcp nht  
bng trong mesh. Biến attribTable biu din ma trn các đặc tính sẽ được truyn cho  
tham sthnht. Vì tôi mun thay đổi khi lp phương trong c2 nhóm đặc tính nên tôi  
truyn giá tr2 cho tham sth2.  
boxMesh->SetAttributeTable(attribTable, 2);  
Bây gimesh ca khi lp phương đã ct thành 2 nhóm riêng, bn phi thay đổi làm sao để  
khi lp phương được hin th. Để làm điu này cn hai ln gi hàm DrawSubset, mi  
hàm chrõ giá trca tng nhóm để v. Đon chương trình sau schra cách gi cp nht.  
Hơn na vic gi hàm SetMaterial trước hàm mi ln gi DrawSubset slàm cho dữ  
liu thay đổi trước mi ln kết xut mt na khi lp phương.  
//ly dliu  
pd3dDevice->SetMaterial (&materials[0].MatD3D);  
//vphn đầu tiên ca mesh  
mesh->DrawSubset(0);  
//ly dliu th2  
pd3dDevice->SetMaterial (&materials[1].MatD3D);  
//vphn thhai ca mesh  
mesh->DrawSubset(1);  
Hình 7.2 schra cube đã cp nht được biu din vi dliu riêng ca mi nhóm.  
Hình 7.2 Khi lp phương và sáp dng hai loi material. Material thnht  
là màu xanh, và thhai là màu đỏ.  
107  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Predefined Mesh.  
Skiến to mesh thcông là mt công vic nhàm chán và không dự đoán được tt ccác  
chi phí. May mn thay, vic thiết kế chương trình thường loi trvic thiết kế thcông.  
Ngoài ra DirectX có cung cp mt shàm để htrvic to đối tượng.  
D3DX Object Creation  
Chúng ta đã đi được mt chng đường khá xa, tôi đã chra shình thành phc tp ca mô  
hình 3D bng phương pháp thcông. Và tôi chsdng nhng đối tượng đơn gin, ví dụ  
khi lp phương, ta ddàng biu din. Trong DirectX cung cp phương pháp phc tp  
hơn để to các đối tượng đơn gin trong thư vin tng hp D3DX (D3DX Utility  
Library).  
Nhng hàm sau trong D3DX sgiúp bn to mt đối tượng đơn gin 3D như khi lp  
phương, khi cu, khi tr.  
D3DXCreatBox – to khi lp phương  
D3DXCreatSphere – to khi cu  
D3DXCreatCylinder – to khi lăng trụ  
D3DXCreatTeapot – to mô hình 3D m pha trà.  
To Khi Lp Phương  
Bn có t hsdng hàm D3DXCreatBox được dnh nghĩa dưới đây khi bn mun to  
mt khi lp phương đơn gin. Kết qukhi lp phương slà mt đối tượng ID3DXMesh  
hoàn chnh mà bn có thti ưu hoc điu khin theo ý mun.  
HRESULT D3DXCreateBox(  
LPDIRECT3DDEVICE9 pDevice,  
FLOAT Width,  
FLOAT Height,  
FLOAT Depth,  
LPD3DXMESH **ppMesh,  
LPD3DXBUFFER *ppAdjacency  
);  
Hàm D3DXCreateBox có 6 tham s:  
ƒ
pDevice con trtrti Direct3D device hp lệ  
ƒ Width brng ca khi lp phương tính dc theo trc X  
ƒ Height – chiu cao ca khi lp phương tính dc theo trc Y  
ƒ
Depth chiu sâu ca khi lp phương tính theo trc Z  
ƒ ppMesh địa chtrti con trID3DXMesh. Biến này cha mesh ca khi lp  
phương  
ƒ
ppAdjacency –adjacency buffer. Nếu bn không mun githông tin này , bn có thể  
truyn NULL cho tham snày.  
Khi được to vi hàm này sxem như mt khi mà bn đã sdng trong phn trước.  
Hình 7.3 schra mt khi lp phương được to vi hàm D3DXCreateBox.  
108  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Hình 7.3 khi lp phương được to bng hàm D3DXCreateBox  
To hình khi m trà  
Hình khi m trà được sdng rng rãi trong các ví dvmô hình hình hc 3D và nó  
cũng có thể được to ddàng trong Direct3D. Bn đã kết xut nó vì bn đã sdng nó  
như mt mô hình trong chương 6, “Vertex Colors, Texture Mapping, and 3D Lighting”.  
Để to hình khi 3D m trà, bn cn sdng hàm D3DXCreateTeapot được định nghĩa  
dưới đây:  
HRESULT D3DXCreateTeapot(  
LPDIRECT3DDEVICE9 pDevice,  
LPD3DXMESH **ppMesh,  
LPD3DXBUFFER *ppAdjacency  
);  
Hàm D3DXCreateTeapot có 3 tham scn thiết:  
ƒ pDevice đối tượng Direct3D hp lệ  
ƒ ppMesh đi tượng ID3DXMesh trong đó sẽ đưa mesh được to vào  
ƒ ppAdjacency – adjacency buffer. Nếu bn không mun githông tin này , bn có thể  
truyn NULL cho tham snày.  
Điu không may là hàm này không cho phép bn thay đổi kích thước ca m trà mà bn  
mun to. Dòng code đơn gin sau sto ra mt m trà cho bn:  
D3DXCreateTeapot (pd3dDevice, &teapotMesh, NULL);  
To hình khi cu  
Hình khi cu rt có ích trong 3D. sdng chnhng khi cu, bn có thto mt mô  
hình tượng trưng cho hphn ttri. Nếu bn thy cn to khi cu, bn có thsdng  
hàm D3DXCreateSphere được chra dưới đây:  
109  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
HRESULT D3DXCreateSphere (  
LPDIRECT3DDEVICE9 pDevice,  
FLOAT Radius,  
UINT Slices,  
UINT Stacks,  
LPD3DXMESH **ppMesh,  
LPD3DXBUFFER *ppAdjacency  
);  
Hàm D3DXCreateSphere có 6 tham s:  
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
pDevice Direct3D device hp lệ  
Radius bán kính ca khi cu có kiu float  
Slices – số đon ni chiu dc được chra  
Stacks - số đon ni chiu ngang được vra  
ppMesh đối tượng ID3DXMesh lưu giũ khi cu được to  
ppAdjacency - adjacency buffer. Nếu bn không mun githông tin này ,  
bn có thtruyn NULL cho tham snày.  
Đon chương trình nhdưới đây schra cách làm thế nào để sdng hàm  
D3DXCreateSphere:  
//to khi cu  
loat sphereRadius=30;  
int numSlices = 20;  
int numStacks = 20;  
D3DXCreateSphere ( pd3dDevice,  
sphereRadius,  
numSlices,  
numStacks,  
SphereMessh,  
NULL  
);  
Hình 7.4 schra mt khi cu được to bng hàm D3DXCreateSphere. Độ ln ca giá  
trbiu din qua tham sSlices va Stacks sđộ nhn ca khi cu.  
110  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
To khi trụ  
Đối tượng cui cùng mà chúng ta sbiu din là mt khi tr.  
Hàm  
D3DXCreateCylinder được chra dưới đây schra mt cách rõ ràng các đặc đim ca  
khi tr, ví dnhư chiu dài và bán kính ca mi đáy.  
HRESULT D3DXCreateCylinder (  
LPDIRECT3DDEVICE9 pDevice,  
FLOAT Radius1,  
FLOAT Radius2,  
FLOAT Lenght,  
UINT Slices,  
UINT Stacks,  
LPD3DXMESH **ppMesh,  
LPD3DXBUFFER *ppAdjacency  
);  
Hàm D3DXCreateCylinder có 8 tham s:  
ƒ pDevice - Direct3D device hp lệ  
ƒ Radius1 – bán kính đáy ni ca khi trtính dc theo trc Z và có kiu float  
ƒ Radius2 - bán kính đáy chìm ca khi trtính dc theo trc Zvà có kiu float  
ƒ Length – chiu cao ca khi trụ  
ƒ Slices – sphn tto hình theo chiu dài ca khi trụ  
ƒ Stacks – sô phn tto hình theo chu vi đường tròn  
ƒ ppMesh - đối tượng ID3DXMesh lưu gikhi trụ được to  
ƒ ppAdjacency- adjacency buffer. Nếu bn không mun githông tin này , bn có  
thtruyn NULL cho tham snày.  
Ví dsau chra cách to mt khi tr:  
//xác dnh đặc đim ca khi trụ  
float cylRadius1=2.0;  
float cylRadius2= 2.0;  
float cylLength = 7.0;  
int cylSlices = 10;  
int cylStack = 10;  
//to khi trụ  
D3DXCreateCylinder (pd3dDevice,  
cylRadius1,  
cylRadius2,  
cylLength,  
cylSlices,  
cylStack,  
&cylMesh,  
NULL);  
Hình 7.5 chra khi trụ được to bi hàm  
D3DXCreateCylinder  
Bn có thtìm source code ca ví dvcách sdng các hàm D3DX ti thư mc  
Chapter7\example2 trong ca đĩa CD-ROM đi kèm.  
Định dng ca mesh trong Direct3D: File X  
To mesh bng code không phi là mt cách hay để to mt thế gii 3D. Hu hết các  
game cn nhng model dng complex và detail có cht lượng tt, chúng có thể được to  
bng tay. Như tôi đã nói trên, các thanh công cthiết kế hin có trên thtrường có thể  
111  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
giúp bn to các model 3D. Sau khi to các model, bn có thxut chúng vào các định  
dng file.  
Microsoft đã to mt dng file chuyên dùng cho vic xut các model 3D và nó được gi  
là file X. File X có thmt trong hai dng: text hoc là binary. Đon chương trình sau sẽ  
chra mt phn nhca File X ở định dng text.  
MeshVertexColors{  
8,  
0;0.000000; 0.000000; 1.000000; 0.000000;;,  
1;1.000000; 1.000000; 1.000000; 0.000000;;,  
2;0.000000; 0.000000; 1.000000; 0.000000;;,  
3;0.000000; 1.000000; 1.000000; 0.000000;;,  
4;0.000000; 0.000000; 1.000000; 0.000000;;,  
5;0.000000; 1.000000; 1.000000; 0.000000;;,  
6;0.000000; 0.000000; 1.000000; 0.000000;;,  
7;0.000000; 1.000000; 1.000000; 0.000000;;,  
}
Đây là mu mô tả định dng trong đó dliu nm trong sự điu khin ca mi section  
ca X file. Mt mu có cùng tên được chra dưới đây slàm vic vi cu trúc  
MeshVertexColors:  
template MeshVertexColors\  
{ \<1630B821- 7842-11cf-8F52-0040333594A3>\  
DWORD nVertexColors;\  
Array IndexColor vertexColors[nVertexColors];\  
}
Mi template cha 2 phn: nhn dng số đơn nht, kèm trong trong hai du ngoc, và template  
có thcha khai báo dliu. Trong ví dnày, template MeshVertexColors khai báo hai dng  
dliu: kiu DWORD dùng để cha svéctơ colors, và mt ma trn thuc kiu IndexColor.  
File X được to là file như thế nào?  
File X thường được to trong các phn mm thiết kế 3D. Bn có thmã hóa mt file X  
bng phương pháp thcông, nhưng đối vi các complex model, vic này có thsrt rc  
ri. Thường thì mt thợ đổ ha hay to model và sau đó xut chúng vào định dng file X.  
Microsoft đã thc hin hai chương trình có thchuyn model thành định dng thích hp.  
Chương trình đầu tiên conv3ds.exe, là mt ng dng command-line, chuyn mt  
model 3D input vào định dng file 3DS. File 3DS là dng thường được to trong 3ds max,  
các packages thiết kế khác cũng htrợ định dng file này.  
Chương trình thhai là xSkipExp.dle là mt chuyn thca 3ds max, cho phép bn xut  
trc tiếp các model ttrong môi trường thiết kế. Chai ng dng này đều có trong  
DirectX Software Development Kit (SDK).  
Lưu Mesh vào file X  
đã có sn hai chương trình để to file X, nên có lbn thy lvì sao tôi li chcho bn  
cách to bng phương pháp lp trình các file cho mình. , không phi tt ccác lp trình  
game đều viết vmã hóa đồ ha engine và trí tunhân to AI; bn cn phi to các công  
cụ để hot động các lp trình viên trnên ddàng hơn. Ví dbn được đề nghto mt  
ng dng mà có thể đọc mi định dng file 3D và xut ra file X. May mn thay D3DX  
Utility Library đã có để cu bn bng các hàm to file X.  
112  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
D3DXSaveMeshToX  
D3DXcha mt hàm gi D3DXSaveMeshToX mà bn có thsdng để to file X. Trước  
tiên bn có thsdng hàm này, mc dù dliu ca bn phi tp trung vào mt  
ID3DXMesh object. Như bn mong mun ttrước, tôi đã dn dt bn xuyên sut quá  
trình to và biu din mesh. Trong phn này, tôi squay li phn trước và chcho bn  
cách làm thế nào để ly mesh đã to trước đó và lưu chúng vào file X.  
Nhc li mt sthmà bn đã hc vmesh trước kia: Mesh được to bng cách sdng  
mt trong hai hàm: D3DXCreateMesh hoc là D3DXCreateMeshFVF. Sau khi to mesh,  
bn bxung véctơ và index buffer cùng vi thông tin gn lin vi model bn đang to. Ở  
đây bn nên có mt ID3DXMesh object hp ltuyt đối để chun bto mt file X từ  
chúng.  
Hàm D3DXSaveMeshToX được định nghĩ dưới đây sly mesh bn to và lưu nó vào  
đĩa dng file X.  
HRESULT D3DXSaveMeshToX(  
LPCTSTR pFilename,  
LPD3DXMESH pMesh,  
CONST DWORD* pAdjacency,  
CONST D3DXMATERIAL* pMaterials,  
CONSTD3DXEFFECTINSTANCE* pEffectInstances,  
DWORD NumMaterials,  
DWORD Format  
)
hàm D3DXSaveMeshToX có 6 tham s:  
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
ƒ
pFilename – là mt biến kiu string dùng để lưu tên ca file X .  
pMesh – con trtrti biến ID3Dmesh  
pAdjacency – con trtrti ma trn có 3 phn tkiu DWORD .  
pMaterials – con trtrti ma trn kiu cu trúc D3DXMATERIAL  
pEffectInstances – con trtrti ma trn kiu effect instances  
NumMaterials – scu trúc D3DXMATERIAL trong biến pMaterials  
Format định dng ca file X sẽ được lưu. Ba định dng có thcó:  
DXFILEFORMAT_BINARY – file X được lưu trong định dng binary  
DXFILEFOMAT_TEXT – File X được lưu ở định dng text-viewable  
DXFILEFORMAT_COMPRESSED – File X được lưu dng nén.  
Ngun chương trình chra dưới đây là mt ví dvcách sdng hàm D3DXSaveMeshToX  
LPD3DXMESH cubeMesh;  
D3DXMATERIAL material ;  
// con trtrti ID3DXMESH  
//cu trúc đơn D3DXMATERIAL  
HRESULT HR;  
//to mesh được dùng để lưu model khi lp phương  
hr= D3DXCreateMeshFVF( 12,  
8,  
D3DXMESH_MANAGED,  
D3DFVF_CUSTOMVERTEX,  
pd3dDevice,  
&cubeMesh);  
//to véctơ và index buffer  
//hàm này không được định nghĩa ở đây, nhưng nó đin véctơ và index buffers ca mesh  
//vi thông tin cn thiết cho mt khi lp phương. Bn có thxem phn to mesh tcode  
//để có thmô tmt cách đầy đủ vhàm này  
113  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Setup VBIB();  
//Ly mt đối tượng mesh hp lvà lưu nó vào file X  
D3DXSaveMeshToX (“cube.x”, //tên file slưu  
cubeMesh, //giao din ID3DXMESH  
NULL,  
&material,  
NULL,  
1,  
//dliu lin k( không sdng)  
//ma trn kiu cu trúc D3DXMATERIAL  
//ma trn kiu effect instances(không sdng)  
// scu trúc kiu D3DXMATERIAL  
DXFILEFORMAT_TEXT);  
// lưu file X vào dng text  
Phn quan trng trong đon chương trình này là vic gi hàm D3DXSaveMeshToX. Hàm  
này trình bày tmtên file đựoc lưu, mesh object được lưu và định dng file X được lưu.  
Hình 7.6 schra mesh ca khi lp phương cube.x, nó ging vi hình khi xem từ ứng  
dng MeshView trong thư mc DXSDK\Bin\DXUtils . ng dng này được cài đặt khi  
bn cài đặt DirectX SDK.  
Bn có thtìm thy đầy đủ source ca ví dvlưu file X chra cách sdng hàm D3DX  
được mô ttrong chương này chapter7\exemple3 trong ca CD-ROM.  
Hình 7.6 file cuble.x được hin thbng ng dng MeshView.  
Load mt Mesh tfile X  
Gibn đã biết làm thế nào để lưu file X, vy câu hi tiếp theo là: làm thế nào để load  
mt file X từ đĩa? Bn có thviết mt loader cho mình, vic này rt cn thiết để bn hiu  
biết rng các định dng file X, hoc bn có thxem thêm trong thư vin D3DX.  
Vì file X là định dng file mà Microsoft cung cp cho DirectX nên Microsoft cũng đã  
cung cp hàm để loading nhng file này vào ng dng ca bn.  
114  
Dch bi TransTeam din đàn Gamedev.VN  
Beginning DirectX9  
Sdng hàm D3DXLoadMeshFromX  
Hàm D3DXLoadMeshFromXđịnh nghĩ dưới đây đựợc sdng để load file X từ đĩa:  
HRESULT D3DXLoadMeshFromX(  
LPCTSTR pFilename,  
DWORD Options,  
LPDIRECT3DDEVICE9 pDevice,  
LPD3DXBUFER* ppAdjacency,  
LPD3DXBUFER* ppMaterials,  
LPD3DXBUFER* ppEffectInstances,  
DWORD* pNumMaterials,  
LPD3DXMESH* ppMesh  
);  
Hàm D3DXLoadMeshFromX có 8 tham s:  
ƒ pFilename – mt chui dùng để lưu file X  
ƒ Options – chiu chỉ định mesh sẽ được load như thế nào. Bn có thtìm thy  
nhng giá trnày trong bng lit kê D3DXMESH  
ƒ pDevice – Direct3D device hp lệ  
ƒ ppAdjacency – adjacency buffer.  
ƒ ppMaterials – con trtrti buffer cha giliu  
ƒ ppEffectInstances – con trca buffer cha ma trn effect instances  
ƒ pNumMaterials – smaterial mà bn tìm thy trong biến ppMaterials  
ƒ ppMesh đối tượng ID3DXMesh slưu gimesh khi hàm này kết thúc xong.  
Đon code sau chra cách làm thế nào để sdng hàm D3DXLoadMeshFromX cho vic  
load mt file X từ đĩa.  
//biến gigiá trtrvề  
HRESULT hr;  
//biến gimesh được load lên  
LPD3DXMÉH pMeshSysMem;  
//buffer gidliu lin kề  
LPD3DXBUFFER ppAdjacencyBuffer;  
// buffer gimaterials  
LPD3DXBUFER pD3DXMtrBuffer;  
//load mesh từ đĩa  
hr= D3DXLoadMeshFromX(  
“cube.x”,  
D3DXMESH_SYSTEMMEM,  
pd3dDevice,  
&ppAdjacencyBuffer,  
&pD3DXMtrBuffer,  
NULL,  
&m_dwNumMaterrials,  
&pMeshSysMem  
);  
// kim tra mesh đã load thành công chưa  
if (FAILDED (hr))  
return false;  
Đon code trên load mesh trong file cube.x đưa nó vào biến pMeshSysMem. Trong  
sut quá trình gi hàm D3DXLoadMeshFromX, biến m_dwNumMaterials đã được gán  
bi smaterials trong mesh. Sdng giá trnày, bn có thly materials tmesh và đưa  
chúng vào material buffer để sdng sau này. Mi buffer được sdng khi kết xut  
mesh làm thay đổi material chung ca các nhóm nh.  
115  
Tải về để xem bản đầy đủ
pdf 83 trang yennguyen 13/04/2022 7180
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Beginning DirectX9 (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_beginning_directx9_phan_2.pdf