B
Beginning
DirectX9
Dch bi TransTeam din đàn Gamedev.VN
CHƯƠNG 7
CHIA NH 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.
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
Beginning
DirectX9
Dch bi TransTeam din đàn Gamedev.VN
Mesh 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
Beginning
DirectX9
Dch bi TransTeam din đàn Gamedev.VN
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 sch
ra 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,
//sphn tca mesh
8,
//svectơ
D3DXMESH_MANAGED,
//sdng bnhcn thiết cho mesh
Declaration,
//ma trn kiu đối tượng D3DVERTEXELEMENT9
pd3dDevice,
//the Direct3D device
&boxMesh);
//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ú
ý
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
HƯỚNG DẪN DOWNLOAD TÀI LIỆU

Bước 1:Tại trang tài liệu slideshare.vn bạn muốn tải, click vào nút Download màu xanh lá cây ở phía trên.
Bước 2: Tại liên kết tải về, bạn chọn liên kết để tải File về máy tính. Tại đây sẽ có lựa chọn tải File được lưu trên slideshare.vn
Bước 3: Một thông báo xuất hiện ở phía cuối trình duyệt, hỏi bạn muốn lưu . - Nếu click vào Save, file sẽ được lưu về máy (Quá trình tải file nhanh hay chậm phụ thuộc vào đường truyền internet, dung lượng file bạn muốn tải)
Có nhiều phần mềm hỗ trợ việc download file về máy tính với tốc độ tải file nhanh như: Internet Download Manager (IDM), Free Download Manager, ... Tùy vào sở thích của từng người mà người dùng chọn lựa phần mềm hỗ trợ download cho máy tính của mình  

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

Đăng ngày | Thể loại: | Lần tải: 1 | Lần xem: 18 | Page: 83 | FileSize: 0.00 M | File type: PDF
18 lần xem

Giáo trình Beginning DirectX9: Phần 2. Giáo trình Beginning DirectX9 phần 2 cung cấp cho người học các kiến thức: Chia nhỏ đối tượng, sử dụng hiệu ứng, hiệu ứng âm thanh, xây dựng dự án mẫu, bài tập thực hành,... Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn dùng làm tài liệu học tập và nghiên cứu. Mời các bạn cùng tham khảo chi tiết nội dung tài liệu..

Nội dung

Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN CHƯƠNG 7 CHIA NHỎ VÀ LÀM MỊN CÁC ĐỐI TƯỢNG ạn đã học được cách làm thế nào để tạo các object 3D bằng code và biểu diễn nó lên màn hình. Có lẽ bạn đang nghĩ rằng đây là một quá trình thật nhàm chán và chưa có cách nào để có thể tạo tất cả các object bằng code. Bạn nghĩ rất đúng. Hiện nay 3D đã nhập cuôc. Nó có thể mô tả mọi thứ trong game của bạn rất giống với thực thể. Những mô hìnhcó thể thể hiện vật thể và đặc điểm xung quanh bạn và cũng có thể là chính chính nó. Với những đặc điểm này bạn có thể đưa những mô hình này vào game, bạn có thể biểu diễn nó với đối tượng Mesh và dịch chuyển hoặc điều khiển chúng. Đây là các phần mà bạn sẽ học trong chương này: ③ Direct3D điều khiển mesh như thế nào ? ③ Cần những gì để hợp lý hóa một model 3D? ③ Định dạng file X là gì? ③ Làm thế nào để tạo và lưu giữ mesh? ③ Làm thế nào để load một model 3D vào game? Xây dựng một thế giới 3D Mô hình 3D giúp chúng bạn thể hiện thế giới ảo mà bạn muốn tạo. Những mô hình này được bổ xung bởi gamer và đối thủ của gamer trong môi trường này. Những mô hình này được lấy từ đâu? Nếu bạn có một package thiết kế 3D giống như Max hoặc Maya, bạn đã có những công cụ cần thiết để tạo mọi thứ cho game của bạn khi cần. Nếu những chương trình trên bạn không có thì bạn có thể dùng những package khác như MilkShape 3D, nó cũng có thể làm việc tốt. Sau khi đã tạo các model, bạn đưa chúng vào một trong những định dạng file 3D hiện có. Nhưng bạn cần biết làm thế nào để load một file định dạng 3D vào game của mình. Mục đích của cuốn sách này là giúp bạn làm việc với những định dạng file mà Microsoft đã tạo ra. Chú ý: Bạn có thể tìm MilkShape 3D tại trang http://www.swissquake.ch/chumbalum-soft/index.html. 96 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN Mesh là gì? Code của bạn điều khiển những mô hình 3D được load vào trong game cũng được xem như là một Mesh. Một Mesh là một code container mà chứa mọi thứ liên quan đến đối tượng 3D. Nó bào gồm các vectơ, tọa độ texture và các dữ liệu khác. Bằng cách sử dụng dữ liệu có trong mesh object bạn có thể biểu diễn các mô hình 3D lên màn hình . Chú ý: Thư viện tổng hợp D3DX chứa tất cả mọi thứ mà bạn cần để sử dụng mesh trong Direct3D Direct3D định nghĩa một Mesh như thế nào? Hầu hết các mesh trong Direct3D đều dựa trên ID3DXBaseMesh interface. Interface này cung cấp kho dự trữ dành cho các model của bạn, giúp các methods có hiệu lực để tăng tốc độ truy cập tới dữ liệu trong mesh. Ví dụ method GetVertexBuffer luôn sẵn có trong ID3DXBaseMesh interface để giúp bạn truy cập trực tiếp tới vectơ buffer của đối tượng mesh. Dưới đây là một số kiểu Mesh khác nhau: ③ ID3DXMesh – Đây là dạng mesh interface chuẩn mà bạn sẽ sử dụng. ③ ID3DXPMesh – Interface này cho phép bạn sử dụng mesh tiến hành. ③ ID3DXSPMesh – interface này điều khiển sự đơn giản hóa các mesh object. ③ ID3DXPatchMesh - Interface này cung cấp Patch mesh theo chức năng. Mỗi một kiểu mesh có thể lưu giữ tất cả các vectơ của một model trong vectơ buffer và cung cấp cho bạn thông tin vể model, ví dụ như số phần tử hoặc là số vectơ. Tạo Mesh Bước đầu tiên khi sử dụng các mesh trong game đó là sự khởi tạo mesh object. Mesh object là kho dự trữ, cất giữ tất cả các thông tin cần thiết dùn để mô tả model của bạn trong Direct3D. Sau khi bạn đã tạo ra mesh, bạn dễ dàng copy tất cả thông tin mà model của bạn cần. Hai hàm trong Direct3D dùng để tạo mesh: D3DXCreaetMesh và D3DXCreateMeshFVF. Vì mỗi hàm này tạo mesh bằng các cách khác nhau, chúng ta sẽ làm rõ cả hai hàm dưới đây. D3DXCreateMesh Giao diện ID3DXMesh là một giao diện đơn giản nhất trong mesh interface, dễ dàng tổ chức và thực hiện một cách nhanh chóng. Trong phần này, bạn sẽ học cách làm thế nào để tạo mesh trong ID3DXMesh interface bằng hàm D3DXCreateMesh. D3DXCreateMesh( DWORD NumFaces, DWORD NumVertices, DWORD Options, CONST LPD3DVERTEXELEMENT9 *pDeclaration, LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH *ppMesh ); 97 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN Hàm D3DcreateMesh có 6 tham số: ③ NumFaces. Số phần tử mà mesh sẽ chứa. ③ NumVertices. Số vectơ mà mesh sẽ chứa. ③ Options. Giá trị từ bảng liệt kê D3DXMESH . ③ pDeclaration. Ma trận thuộc đối tượng D3DVERTEXELEMENT9. Những object này mô tả FVF cho mesh. ③ pDevice. Một Direct3D device hợp lệ. ③ ppMesh. Con trỏ trỏ tới đối tượng ID3DMesh hợp lệ. Đoạn code sau sẽ chỉ ra cách làm thế nào để tạo một đối tượng mesh mà chứa đầy đủ bộ vectơ, dùng để tạo một khối lập phương. HRESULT hr; // biến giữ một mesh được tạo mới LPD3DXMESH boxMesh; // ma trận D3DVERTEXELEMENT9 D3DVERTEXELEMENT9 Declaration [MAX_FVF_DECL_SIZE]; // tạo khai báo cần thiết cho hàm D3DXCreateMesh D3DXDeclaratorFromFVF (D3DFVF_CUSTOMVERTEX, Declaration); hr= D3DXCreateMesh(12, //số phần tử của mesh 8, //số vectơ D3DXMESH_MANAGED, //sử dụng bộ nhớ cần thiết cho mesh Declaration, //ma trận kiểu đối tượng D3DVERTEXELEMENT9 pd3dDevice, //the Direct3D device &boxMesh); //biến giữ mesh //kiểm tra giá trị trả về để chắc chắn rằng bạn đã cómột đối tượng mesh hợp lệ. if FAILD (hr) Return false; Như bạn đã thấy, đoạn code trên tạo ra một mesh chứa 12 phần tử và 8 vectơ và tất cả chúng được đưa vào trong biến boxMesh. Biến thứ ba là D3DXMESH_MANAGED thông báo Direct3D là cần sử dụng bộ nhớ cần thiết cho cả vectơ và index buffer để tạo mesh. Bạn nên chú ý là hàm D3DXDeclaratorFromFVF phải được gọi trước hàm D3DXCreateMesh. D3DXDeclaratorFromFVF tạo đối tượng cần thiết D3DVERTEXELEMENT9 cho tham số thứ 4 bằng cách sử dụng Flexible Vertex Format (định dạng véctơ linh hoạt) mà model của bạn sử dụng. Khi bạn sử dụng hàm D3DXDeclaratorFromFVF, bạn không cần thiết phải tạo ngay các đối tượng D3DVERTEXELEMENT9. D3DXCreatMeshFVF Hàm D3DXCreateMeshFVF không giống với D3DcreateMesh ở một điểm là nó dựa vào sự kiến tạo mesh trên Định Dạng Véctơ Linh Hoạt (Flexible Vertex Format) thay vì dùng Declarator. Mesh object này cũng giống với mesh object được tạo bởi hàm D3DXCreateMesh ở trong phần trước. Hàm D3DXCreatMeshFVF được định nghĩa như sau: HRESULT D3DXCreateMeshFVF( DWORD Numface, DWORD NumVertices, DWORD Options, DWORD FVF, 98 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN LPDIRECT3DDEVICE9 pDevice, LPD3DXMESH *ppMesh ); Hàm D3DXCreatMeshFVF cần 6 tham số: ③ Numface - số phần tử mà mesh sẽ có ③ NumVertices – số véctơ mà mà mesh sẽ có ③ Options – các giá trị từ bảng liệt kê D3DXMESH ③ FVF – Flexible Vertex Format của các véctơ. ③ pDevice – Direct3D device hợp lệ. ③ ppMesh – con trỏ trỏ tới đối tượng ID3DXMESH Dưới đây là một chương trình mẫu gọi hàm D3DXCreateMeshFVF. //biến giữ giá trị trả về HRESULT hr; //biến giữ mesh đựơc tạo mới LPD3DXMESH boxMesh; //tạo mesh bằng cách gọi gàm D3DXCreateMeshFVF hr= D3DXCreateMeshFVF (12, 8, D3DFVF_MANAGED, D3DFVF_CUSTOMVERTEX, pd3dDevice, &boxMesh); //kiểm tra giá trị trả về có hợp lệ không if FAILED (hr) return false; //Numfaces // NumVertices // Options // FVF // pDevice // ppMesh Một lần nữa bạn tạo mesh bằng cách sử dụng bộ nhớ quản lý cho véctơ, index buffer và việc chỉ định giá trị D3DXMESH_MANAGED. Khi việc gọi hàm kết thúc, biến boxMessh sẽ giữ đối tượng mesh hợp lệ. Hàm D3DXCreateMeshFVF là hàm dễ sủ dụng nhất trong hai hàm tạo mesh. Filling the Mesh. Bạn đã tạo được mesh object, bạn cần bổ xung thêm dữ liệu để mô tả model mà bạn muốn thể hiện. Ở đây, bạn có một kho rỗng với kích thước thích hợp để chứa dữ liệu cần thiết cho việc tạo khối lập phương. Để xác định một khối lập phương, trước tiên bạn cần lock véctơ buffer lại và bổ xung vào nó 8 véctơ mà khối lập phương cần. Tiếp theo bạn cần lock index buffer và copy toàn bộ index vào trong đó. Hàm SetupMesh chỉ ra dưới đây sẽ giúp bạn từng bước hoàn thành mesh với các thông tin cần thiết để tạo một khối lập phương. /************************************************************************************** * SetupMesh * Set up the vertex buffer and index buffer of a mesh **************************************************************************************/ HRESULT SetupMesh() { HRESULT hr; //biến giữ giá trị trả về /////////////////////////////////////////////////////////////////////////////// //các véctơ của vertex buffer CUSTOMVERTEX g_Vertices[ ]={ 99 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN // X Y Z {-1.0f, -1.0f, -1.0f, D3DCOLOR_ARGB(0,255,0,0)}, //0 {-1.0f, 1.0f, -1.0f, D3DCOLOR_ARGB(0,0,0,255)}, //1 { 1.0f, 1.0f, -1.0f, D3DCOLOR_ARGB(0,0,255,0)}, //2 { 1.0f, -1.0f, -1.0f, D3DCOLOR_ARGB(0,0,0,255)}, //3 {-1.0f, -1.0f, 1.0f, D3DCOLOR_ARGB(0,0,255,0)}, //4 { 1.0f, -1.0f, 1.0f, D3DCOLOR_ARGB(0,0,0,255)}, //5 { 1.0f, 1.0f, 1.0f, D3DCOLOR_ARGB(0,0,255,0)}, //6 {-1.0f, 1.0f, 1.0f, D3DCOLOR_ARGB(0,0,0,255)} //7 }; //Copy các véctơ vào trong vertex buffer VOID* pVertices; // lock vertex buffer hr = boxMesh->LockVertexBuffer(D3DLOCK_DISCARD, (void**)&pVertices); //kiểm tra lại để chắc chắn là các vertex buffer đã lock if FAILED (hr) return hr; ///////////////////////////////////////////////////////////////////////////////// //index buffer data //index buffer xác định các phần tử của khối lập phương, //hai phần tử ở mỗi mặt của cube WORD IndexData[ ] = { 0,1,2, //0 2,3,0, //1 4,5,6, //2 6,7,4, //3 0,3,5, //4 5,4,0. //5 3,2,6, //6 6,5,3, //7 2,1,7, //8 7,6,2, //9 1,0,4, //10 4,7,1, //11 } //copy các véctơ vào buffer memcpy(pVertices, g_Vertices, sizeof(g_Vertices) ); //mở khóa véctơ buffer boxMesh->UnlockVertexBuffer(); //chuẩn bị copy các index vào index buffer VOID* IndexPtr; //khóa index buffer hr-boxMesh->LockIndexBufffer( 0, &IndexPtr); //kiểm 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)); //mở khóa buffer boxMesh->UnlockIndexBuffer(); return S_OK; } Điều đầu tiên mà hàm SetupMesh làm đó là tạo ma trận g_Vertices. Ma trận này chứa các véctơ và véctơ màu mà bạn cần để xác định một khối lập phương. Tiếp đó, vectơ buffer bị locked như đã thấy ở ví dụ trên. Việc gọi hàm memcpy là để copy tất cả các véctơ vào trong vertex buffer và sau đó thực hiện unlock buffer. 100 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN Tiếp theo bạn cần điền vào index buffer. Giống như vectơ buffer, bạn phải lock nó trước khi dữ liệu được copy vào nó. Các index mà index buffer sử dụng sẽ được xác định trong ma trận IndexData. Chú ý rằng ma trận IndexData có kiểu WORD, điều đó có nghĩa là chúng là những value 16-bit. Sau khi bạn đã có các giá trị xác định, bạn lock index buffer và copy vào các index này bằng việc gọi hàm memcpy rồi unlock index buffer. Chú ý: Cả vectơ và index buffer đều cần thiết để tạo một đối tượng mesh hợp lệ Hiển thị Mesh Bạn đã tạo ra một mesh và đưa dữ liệu vào trong đó, như vậy bạn đã sẵn sàng đưa nó ra màn hình. Hàm drawMesh dưới đây sẽ chỉ ra việc biểu diễn một mesh sẽ cần những gì. Hàm này sẽ làm khối lập 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; //tạo ma ma trận quay D3DXMatrixMultiply(&matWorld, &matRot, &matView); //lấy sự biến đổi vào kết quả của ma trận matWorld pd3dDecice ->SetTransform( D3DTS_WORLDM, &matWorld); //đưa giữ liệu vào sử dụng pd3dDevice->SetMaterial(material); //vẽ mesh mesh->DrawSubset(0); } Phần đầu tiên của hàm drawMesh sẽ là quay và dịch chuyển khối lập phương trên màn hình. Sau đó giữ liệu mà khối lập phương sẽ sử dụng được nạp vào qua việc gọi SetMaterial. Phần quan trọng nhất của hàm drawMesh là gọi DrawSubset. Hàm DrawSubset thông báo Direct3D phần nào của mesh bạn muốn hiện thị lên màn hình. Vì mesh mà bạn tạo ra ở phần trước chỉ chứa một nhóm đơn thuần, giá trị 0 đã được truyền cho DrawSubset. Trên hình 7.1 sẽ chỉ ra kết quả mesh đựợc hiển thị trên màn hình. Bạn sẽ tìm thấy đầy đủ source code trong chapter7\example1 trên đia CD-ROM. 101 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN Hình 7.1 hình ảnh mesh của cube trên màn hình. Chú ý: Mesh có thể chứa rất nhiều nhóm đặc tính khác. Những nhóm khác đó lưu giữ một tập hợp tất cả các phần tử được dùng để mô tả sự phân chia của mesh. Ví dụ như nếu bạn có 2 vùng mesh mà cần 2 texture khác nhau, mỗi vùng trong đó sẽ đặt vào một nhóm đặc tính riêng rẽ. Bằng cách này, bạn có thể điều chỉnh lại texture và giữ liệu mà Dicrect3D sử dụng trước khi kết xuất mỗi nhóm Tối ưu hóa Mesh. Khi một mesh được tạo, nó không có định dạng tốt ưu để Direct3D vẽ. Ví dụ mesh của bạn phải chứa các véctơ bị lặp lại và được sử dụng cho nhiều phần tử, hoặc các véctơ và các phần tử không được nằm trong một thứ tự có hiệu quả. Khi tối ưu hóa mesh bằng cách sử dụng các “véctơ được dùng chung” và cho phép các véctơ và các phần tử sắp xếp lại, bạn có thể tăng quá trình thực hiện khi kết xuất một mesh. Thư viện tổng hợp D3DX cung cấp 2 hàm để tối ưu mesh: Optimize và OptimizeInplace. Mỗi một hàm này về cơ bản thực hiện cùng một công việc nhưng với các key khác nhau. Optimize tạo ra output mesh, ngược lại OptimizeInplace làm thay đổi ở input mesh. Tôi sẽ giải thich cụ thể hai hàm này được sử dụng với mesh như thế nào. Hàm Optimizeđịnh nghĩa nhu sau, lấy một input mesh, tối ưu nó và khởi tạo một 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à dấu hiệu chỉ ra dạng tối ưu cho việc thi hành. Bạn càn tìm flag cho tham số này trong bảng liệt kê D3DXMESHOPT. 102 Beginning DirectX9 Dịch bởi TransTeam diễn đàn Gamedev.VN ③ pAdjacencyIn – con trỏ trỏ tới ma trận đang lưu dữ liệu liền kề hiện tại cho input mesh. ③ pAdjacencyOut – con trỏ trỏ tới ma trận đang lưu giữ dữ liệu liền kề cho output mesh đựơc tối ưu. ③ pFaceRemap – con trỏ trỏ tới buffer đang lưu dữ index mới cho output mesh. ③ ppVertexRemap – địa chỉ gửi đến con trỏ của giao diện ID3DXBuffer dành cho output mesh. ③ ppOptmesh – một giao diện ID3DXMesh đang lưu giữ output mesh được tạo mới. 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à dấu hiệu chỉ ra dạng tối ưu để thi hành. Bạn có thể tìm thấy dấu hiệu cho tham số này ở trong bảng liệt kê D3DXMESHOPT. ③ pAdjacencyIn – con trỏ trỏ tới ma trận đang lưu giữ dữ liệu liền kề hiện tại cho mesh ③ pAdjacencyOut – con trỏ trỏ tới buffer đang lưu giữ dũ liệu liền kề cho mesh được tối ưu. Nếu bạn không muốn tập trung dữ liệu liền kề, bạn có thể chuyển giá trị NULL cho tham số này. ③ pFaceRemap – con trỏ trỏ tới buffer đang lưu giũ index mới của dũ liệu mỗi phần tử. Nếu bạn không muốn chọn các thông tin này thì bạn có thể gán NULL cho tham số này. ③ ppVerTexRemap – con trỏ trỏ tới giao diện ID3DXBuffer dùng để lưu giũ index mới của mỗi véctơ. Bảng 7.1 Các tham số Flags Giá trị D3DXMESHOPT_COMPACT D3DXMESHOPT_ATTRSORT D3DXMESHOPT_VERTEXCACH