begining directx-chapter 6-translate vn

28
 Chapter 6: Vertex Colors, Texture Mapping, and 3D Lighting Cun sách cun sách này trước đây đề cp đến màu sc vertex để giúp cung cp cho mt smàu sc cn thiết cho cnh 3D ca bn. nhưng màu mt đa giác phng không phi tt cDirect3D cung cp. Direct3D có ththêm chiu sâu cho cnh ca bn thông qua ánh sáng, hay hin thc hóa thông qua texture mapping. Thế gii trò chơi ca bn là vđể nhn được rt nhiu thú vhơn. Đây là nhng gì bn shc trong chương này: Làm thế nào su dng vertex colors Làm thế nào để thay đổi cơ chế làm mn mà sdng Direct3D Các loi ánh sáng mà Direct3D cung cp Meterial được sdng nhu thế nào Texture là nhng gì và làm thế nào hcó ththêm tính hin thc để cnh ca bn Làm thế nào để áp dng các texture cho mt đối tượng Thay đổi màu ca mt đối tượng Trong Chương 4, "3D Primer, bn sdng màu sc đỉnh để hin thmt hình tam giác đầy vi mt cu vng màu sc. Tr ong ví dnày, mi vertex được to ra vi mt m àu sc khác nhau, vì thế mà hình tam giác được lp đầy vi hn hp ca nhng màu sc và hoa văn được to ra. Bng cách thao tác các màu sc ca mi khung hình mi đỉnh, bn có thto ra vô smàu sc hiu ng trong cnh ca bn. Hình 6.1 cho thy hình tam giác mà bn to ra trước đó.

Upload: skyowin

Post on 14-Jul-2015

87 views

Category:

Documents


0 download

TRANSCRIPT

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 1/28

 

Chapter 6:

Vertex Colors, Texture Mapping, and 3D Lighting

Cuốn sách cuốn sách này trước đây đề cập đến màu sắc vertex để giúp cung cấp cho mộtsố màu sắc cần thiết cho cảnh 3D của bạn. nhưng màu một đa giác phẳng không phải tất cả màDirect3D cung cấp. Direct3D có thể thêm chiều sâu cho cảnh của bạn thông qua ánh sáng, hayhiện thực hóa thông qua texture mapping. Thế giới trò chơi của bạn là về để nhận được rất nhiềuthú vị hơn.

Đây là những gì bạn sẽ học trong chương này:

• Làm thế nào sửu dụng vertex colors

• Làm thế nào để thay đổi cơ chế làm mịn mà sử dụng Direct3D

• Các loại ánh sáng mà Direct3D cung cấp

• Meterial được sử dụng nhu thế nào

• Texture là những gì và làm thế nào họ có thể thêm tính hiện thực để cảnh của bạn

• Làm thế nào để áp dụng các texture cho một đối tượng

Thay đổi màu của một đối tượng

Trong Chương 4, "3D Primer, bạn sử dụng màu sắc đỉnh để hiển thị một hình tam giác

đầy với một cầu vồng màu sắc. Trong ví dụ này, mỗi vertex được tạo ra với một màu sắc khácnhau, vì thế mà hình tam giác được lấp đầy với hỗn hợp của những màu sắc và hoa văn được tạora. Bằng cách thao tác các màu sắc của mỗi khung hình mỗi đỉnh, bạn có thể tạo ra vô số màu sắchiệu ứng trong cảnh của bạn. Hình 6.1 cho thấy hình tam giác mà bạn tạo ra trước đó.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 2/28

 

Hình 6.1 – Tam giác cầu vòng

Vertex màu cũng có lợi khi bạn đang chạy trên phần cứng 3D cấp thấp không hỗ trợ lập bản đồ kết cấu. Vertex màu cho phép các đa giác trong mô hình của bạn được tô màu dựa trêncác đỉnh được sử dụng để tạo ra chúng. Ngoài ra, bằng cách sử dụng vertex color, bạn không cần phải cho phép ánh sáng trong một cảnh. Nếu bạn đã tạo ra một cảnh không có ánh sáng với mộthình tam giác không có màu sắc đỉnh, bạn sẽ không thể nhìn thấy hình tam giác.

Vertex Colors Revisited

 Như tôi đã đề cập trước đây, màu đỉnh được kích hoạt bằng cách thêm một biến DWORDtrong cấu trúc vertex của bạn và thêm cờ D3DFVF_DIFFUSE vào lời gọi chức hàm SetFVFcủa bạn. Một cấu trúc mẫu CUSTOMVERTEX được hiển thị ở đây:

struct CUSTOMVERTEX{

FLOAT x, y, z, rhw; // the untransformed, 3D position for the vertexDWORD color; // the vertex color 

};

 Như bạn sẽ nhớ lại, màu sắc đỉnh được thiết lập khi bạn xác định các thuộc tính của mỗiđỉnh.Các màu sắc được sử dụng cho mỗi đỉnh được thiết lập tiếp theo, bằng cách sử dụng mộttrong các macro D3DCOLOR mà Direct3D cung cấp:

CUSTOMVERTEX g_Vertices[] ={

// x, y, z, rhw, color { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_ARGB(0,255,0,0), },

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 3/28

 

{ 250.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_ARGB(0,0,255,0), },{ 50.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_ARGB(0,0,0,255), },

};

Color Macros

Direct3D cung cấp một vài macro cho phép dễ dàng tạo ra một giá trị D3DCOLOR màkhông cần mô tả màu sắc trong hệ thập lục phân.

Trong ví dụ mã trước đó, macro D3DCOLOR_ARGB được sử dụng.Macro này chấpnhận 4 giá trị: 1 giá trị alpha thiết lập độ trong suốt, một thành phần màu đỏ, một thành phầnmàu xanh lá cây, và một thành phần màu xanh.Mỗi giá trị được thông qua để macroD3DCOLOR_ARGB có giá trị giữa 0 và 255, trong đó 0 có nghĩa là không có màu và 255 đạidiện đầy đủ màu sắc.Ví dụ, một giá trị 0 trong thành phần màu xanh sẽ có tác dụng loại bỏ màuxanh từ màu sắc kết quả.Một giá trị của 255 sẽ làm màu xanh để được thêm vàotoàn diện màusắc.

#define D3DCOLOR_ARGB(a,r,g,b) \ ((D3DCOLOR)((((a)&0xff)<<24)|(((r)&0xff)<<16)|(((g)&0xff)<<8)|((b)&0xff)))

Macro tiếp theo mà Direct3D cung cấp là D3DCOLOR_RGBA .Điều này là tương tựnhư macro D3DCOLOR_ARGB mô tả ở trên, nhưng nó hoán vị các giá trị trong đó. Mỗi giá trịđược truyền cho macro này phải được giữa 0 và 255.

#define D3DCOLOR_RGBA(r, g, b, a) D3DCOLOR_ARGB(a, r, g, b)

Bạn có thể sử dụng các macro D3DCOLOR_XRGB khi bạn không cần phải cụ thể thiếtlập một giá trị alpha.Bên trong macro D3DCOLOR_XRGB gọi đến macro D3DCOLOR_ARGB,nhưng nó sẽ tự động điền vào giá trị alpha cho bạn.

#define D3DCOLOR_XRGB(r, g, b) D3DCOLOR_ARGB (0xff, r, g, b)

Macro cuối cùng tôi sẽ mô tả là D3DCOLOR_COLORVALUE.Macro này được hiểnthị tiếp theo, chấp nhận bốn thành phần: đỏ, xanh lá cây, xanh da trời, và alpha.Trong các macrotrước đây, các giá trị này đã được đại diện bởi một giá trị từ 0 đến255.D3DCOLOR_COLORVALUE macro yêu cầu giá trị này được giữa 0 và 1.0.Bên trongmacro này gọi đến D3DCOLOR_RGBA và chuyển đổi các giá trị thích hợp.

#define D3DCOLOR_COLORVALUE (r, g, b, a) \D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((b)*255.f),(DWORD)((a)*255.f))

Làm mịn

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 4/28

 

Làm mịn xác định giao diện và màu sắc của mỗi đa giác trong một đối tượng.Sử dụng phương pháp làm mịn khác nhau, bạn có thể làm cho các mô hình 3D của bạn xuất hiện trơn trunhư các đa giác liên tục pha trộn, hoặc khối ô vuông như những hình đa giác khác từng đượcthực hiện thể hiện rõ ràng. Direct3D hỗ trợ hai loại đánh bóng:

• Flat Shading (bằng phẳng)

• Gouraud Shading

Mỗi phương pháp làm mịn có lợi ích riêng của nó.Ví dụ, Flat Shading đã được sử dụngchủ yếu là trước khi tăng tốc phần cứng đã trở thành phổ biến trên card video.Bởi vì Flat Shadingkhông tiêu tốn nhiều, nó là tương đối dễ thực hiện trong kết xuất đồ họa phần mềm.VirtuaFighter game đầu tiên từ Sega đã sử dụng rộng rãi Flat Shading cho các mô hình của nó.

Mặc dù Gouraud Shading cho kết quả hình ảnh tốt hơn, mất nhiều thời gian để tính toán. Nhưng card video đã trở nên tiên tiến hơn, các hạn chế về kỹ thuật chuyên sâu hơn đã được nới

lỏng, cho phép khả năng tốt hơn về đồ họa.

Flat Shading

Flat Shading liên quan đến việc sử lí mỗi đa giác trong một đối tượng như là một mảngriêng biệt.Các màu sắc của đa giác được xác định bởi màu sắc của vertex đầu tiên bên trongnó.Ví dụ, nếu màu sắc của các đỉnh đa giác có màu đỏ, toàn bộ đa giác sẽ được phủ bởi cùngmột màu đỏ. Hình 6.2 cho thấy một ví dụ về một ấm trà được render bằng cách sử dụng FlatShading. Chú ý là bạn có thể thấy mỗi đa giác mà làm nên ấm trà

Notice: Bằng cách tăng số đa giác trong mô hình của bạn, bạn có thể tạo ra một bề mặt mượt màhơn bằng cách sử dụng Flat Shading. Một bề mặt mượt mà hơn nhiều xuất hiện từ bằng cách sử dụng kỹ thuật Gouraud với một mô hình polycount thấp.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 5/28

 

Hình 6.2- Ấm trà sử dụng Flat Shading

Gouraud Shading

Gouraud Shading cho kết quả tốt hơn nhiều so với Flat Shading.Trong khi Flat Shadingxác định màu sắc của một đa giác từ một đỉnh duy nhất, Gouraud Shading tính toán màu sắc bằng cách sử dụng nhiều đỉnh. Bằng cáchgán các màu sắc khác nhau cho các vertex khác nhauvà sau đó pha trộn những màu sắc lên bề mặt của những đa giác cho kết quả mượt mà hơnnhiều.Với Gouraud Shading , các đa giác riêng biệt khó thấy hơn và cho một kết quả làm hài

lòng nhiều hơn. Hình 6.3 cho thấy ấm trà được render bằng cách sử dụng Gouraud Shading.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 6/28

 

Hình 6.3- Ấm trà sử dụng Gouraud Shading

Choosing the Shading Mode

Direct3D cho phép bạn thay đổi chế độ làm mịn mà nó sử dụng để render các đa giáctrong các cảnh của bạn.Theo mặc định, Direct3D được thiết lập render sử dụng GouraudShading, nhưng bạn có thể thay đổi nó bằng Flat Shading với một hàm đơn giản.

Các loại làm mịn được thiết lập bằng cách sử dụng các thiết lập của

D3DRS_SHADEMODE. Bằng cách thực hiện một lời gọi hàm SetRenderState, bạn có thể chọn bất kỳ các loại làm mịn nào thể hiện trong bảng liệt kê D3DSHADEMODE dưới đây:

typedef enum _D3DSHADEMODE{

D3DSHADE_FLAT = 1,D3DSHADE_GOURAUD = 2,D3DSHADE_PHONG = 3,D3DSHADE_FORCE_DWORD = 0x7fffffff 

} D3DSHADEMODE;

Note:Mặc dù Phong Shading được đề cập trong D3DSHADEMODE, nhưng hiện nay vẫnchưa được hỗ trợ trong Direct3D. Tương lai của Direct3D có thể hiện thực loại này.

Đoạn code nhỏ sau cho thấy làm thế nào để thay đổi chế độ làm mịn sử dụng Flat Shading

// Set to Flat ShadingHRESULT hr;

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 7/28

 

// Set the new render statehr = pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);

// If the call to SetRenderState failed, handle the error hereif(FAILED(hr))

return false;

Fill Mode

Thiết lập chế độ Fill mode cho Direct3D biết bạn muốn hiển thị đa giác như thế nào. Baloại Fill mode có sẵn cho bạn như sau:

• Point. Mỗi vertex trong mô hình được render bằng 1 điểm

• Wireframe. Mô hình được render bằng cách sử dụng đa giác nonfilled

• Solid. Mỗi đa giác được render đầy sử dụng chế độ làm mịn quy định

Bạn có thể thiết lập chế độ fill mode sử dụng render bằng các thiết lập củaD3DRS_FILLMODE.Các giá trị có sẵn cho chế độ Fill mode được hiển thị trong bảng liệt kêD3DFILLMODE sau:

typedef enum _D3DFILLMODE{

D3DFILL_POINT = 1,D3DFILL_WIREFRAME = 2,D3DFILL_SOLID = 3,D3DFILL_FORCE_DWORD = 0x7fffffff 

} D3DFILLMODE;

Code tiếp theo cho thấy làm thế nào để thiết lập chế độ Fill mode để sử dụng wireframerendering. Hình 6.4 cho thấy ấm trà render bằng wireframe

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 8/28

 

Hình 6.4- Ấm trà sử dụng Wireframe

 // Set to use wireframe fill modeHRESULT hr;

 // Set the new render statehr = pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

 // If the call to SetRenderState failed, handle the error hereIf (FAILED(hr) )

return false; 

Note:Wireframe mode hữu ích khi bạn đang cố gắng để theo dõi các lỗi trong mã render củabạn.Bằng cách có thể nhìn thấy xuyên qua các mô hình của bạn, bạn có thể xác nhậnrằng chúng được đặt một cách chính xác.

Bạn sử dụng point rendering khi bạn chỉ muốn hiển thị mỗi vertex mà không cần kết nốiđa giác với bất kỳ đường nối nào. Hình 6.5 cho thấy ấm trà render trong chế độ point fill mode.

Hình 6.5- Ấm trà sử dụng Point fill mode

Giải thích ánh sáng

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 9/28

 

Ánh sáng là một yếu tố quan trọng trong một cảnh 3D.Nó giúp để thiết lập tâm trạng chomột cảnh, có thể là ngọn đuốc hoặc mô phỏng ánh sáng mặt trời chiếu sáng xuyên qua lá trongmột khu rừng.Ánh sáng yếu có thể thấm nhuần nỗi sợ hãi và bất an trong người chơi, trong khiánh sáng tươi sáng cho hiệu quả của sự hạnh phúc và thoải mái.

Bởi vì bạn có thể định nghĩa một định dạng vertex đòi hỏi một vertex có màu, các đốitượng này không thể được nhìn thấy mà không có một nguồn ánh sáng. Ánh sáng trong một cảnhcố gắng để tái tạo ra các cách mà ánh sáng làm việc trong thế giới thực. Bởi vì tính toán ánh sángcó thể được chuyên sâu, Direct3D cố gằng thể hiện với điều kiện ánh sáng gần đúng.Các kết quảthường khá gần với những gì bạn sẽ thấy trong tự nhiên, nhưng chúng đủ nhanh để xử lý tronghiện thực

Các loại ánh sáng

Direct3D cho phép bạn tạo ra và sử dụng nhiều loại ánh sáng trong khung cảnh của bạn.Mỗi loại ánh sáng tạo ra một hiệu ứng ánh sáng khác nhau.Danh sách sau đây trình bày bốn

loại ánh sáng mà Direct3D cung cấp.Bạn có thể sử dụng từng loại ánh sáng riêng lẻ hoặc sử dụngkết hợp.• Ambient Light• Directional lights• Point lights• Spotlights

Mỗi loại ánh sáng này cung cấp một loại hiệu ứng ánh sáng khác nhau và được mô tả chitiết trong các phần sau.

Ambient Light

Ambient Light là loại cơ bản nhất của những loại ánh sáng mà Direct3D cung cấp.Ambient Light cung cấp ánh sáng không trực tiếp liên tục cho một cảnh. Bởi vì ánh sáng không phải là đến từ bất kỳ hướng nào đặc biệt và bằng nhau vào tất cả các bên của một đối tượng,không có bóng nào xuất hiện. Ambient Lighting có thể được tạo ra mà không có sự khởi tạo rõràng của Direct3D.

Hình 6.6 cho thấy ấm trà từ trước đó với một ánh sáng môi trường xung quanh màuđỏ.Chú ý rằng ấm trà xuất hiện bằng phẳng bởi vì Ambient Lighting.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 10/28

 

Hình 6.6 - Ấm trà với ánh sáng màu đỏ của Ambient Light

Bởi vì ánh sáng môi trường xung quanh là lây lan trên toàn bộ khung cảnh, chỉ có ánhsáng môi trường mới có thể được hoạt động tại một thời điểm.

Directional Lights

Hình 6.7 - Direction light ảnh hưởng như thế nào

Directional Light cung cấp cho bạn một cách để tạo ra ánh sáng từ một hướng cụ thể.Tấtcả các ánh sáng từ một nguồn ánh sáng hướng đi song song.Ví dụ, nếu bạn muốn để tạo ra ánhsáng trong khung cảnh của bạn tương tự như mặt trời, bạn sẽ sử dụng một directional light.Directional Light có màu sắc và hướng nhưng không có vị trí.

Hình 6.7 cho thấy một direction light ảnh hưởng đến một cảnh như thê nào

Direct3D cho phép sử dụng nhiều Direction light trong một cảnh, mỗi một với tính chất

khác nhau.

Point Lights

Point Light có thể được sử dụng để mô phỏng một nguồn phát ra ánh sáng theo mọihướng. Một bóng đèn ánh sáng là một ví dụ của một nguồn ánh sáng mà thực hiện theo cách này.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 11/28

 

Point Light có vị trí cũng như màu sắc, nhưng là vô hướng. Vị trí một Point Light trongmột cảnh làm cho cảnh được thắp sáng tất cả các hướng xung quanh nguồn sáng.

 Nhiều điểm nguồn ánh sáng có thể có mặt trong một cảnh. Hình 6.8 cho thấy một PointLight phía trên bên trái của ấm trà ảnh hưởng đến cách nó được render.

Hình 6.8 - Ấm trà với 1 nguồn Point Light

Spotlights

Spotlights là một ví dụ của một nguồn ánh sáng mà có vị trí, hướng, và màu sắc.Sự khác biệt chính giữa Spotlights và các loại khác của Lights là làm thế nào ánh sáng được lan truyềntrên bề mặt của một đối tượng.

Ánh sáng phát ra từ Spotlights có một hình nón, với ánh sáng ở trung tâm của một hìnhnón ở một cường độ cao hơn so với ánh sáng được tạo ra ở các cạnh bên ngoài.Cường độ của ánh

sáng giảm dần khi nó lây lan từ trung tâm của hình nón.Một ánh sáng từ một máy bay trực thăng hoặc đèn pha sẽ là một ví dụ về một spotlights.

Hình 6,9 cho thấy làm thế nào một Spotlight ảnh hưởng đến ấm trà khi render như thế nào.

Hình 6.9 - Ấm trà với 1 spotlight.

Note:  Spotlight thường được sử dụng làm nguồn ánh sáng, và cũng tốn thời gian xử lý nhất.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 12/28

 

Light Properties

Mỗi ánh sáng mà bạn tạo ra có tính chất quyết định vật thể như thế nào khi nó được tạo

ra.Cấu trúc D3DLIGHT9 được định nghĩa như sau:

typedef struct _D3DLIGHT9{

D3DLIGHTTYPE Type;D3DCOLORVALUE Diffuse;D3DCOLORVALUE Specular;D3DCOLORVALUE Ambient;D3DVECTOR Position;D3DVECTOR Direction;float Range;float Falloff;float Attenuation0;float Attenuation1;float Attenuation2;float Theta;float Phi;

} D3DLIGHT9;

Cấu trúc D3DLIGHT9 chứa 13 thuộc tính khi bạn tạo ra một ánh sáng:

• Type Loại ánh sáng bạn muốn tạo ra. Có thể chọn bất kỳ giá trị D3DLIGHTTYPE hiểnthị ở đây:

o D3DLIGHT_POINT. Sử dụng khi tạo một Point light

o D3DLIGHT_SPOT. Sử dụng khi tạo một Spotlight

o D3DLIGHT_DIRECTIONAL. Sử dụng khi tạo một Directional light• Diffuse. Màu ánh sáng khuếch tán được tạo ra bới nguồn sáng này . Điều này sẽ ảnh

hưởng đến màu sắc của một đối tượng dựa trên thuộc tính khuếch tán của Material

• Specular. Màu sắc phản chiếu của ánh sáng này.Điều này ảnh hưởng đến màu sắc của bất kỳ điểm phản chiếu trên một đối tượng.

• Ambient . Các màu sắc của môi trường xung quanh của ánh sáng này.Một AmbientLight ảnh hưởng đến tất cả các đối tượng trong một cảnh. Màu sắc của ánh sáng này xácđịnh màu sắc mà đối tượng phản ánh.

• Position .Vị trí của ánh sáng

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 13/28

 

• Direction .Hướng của ánh sáng

• Range. Khoảng cách từ nguồn sáng tới nơi ánh sáng không còn chiếu

Falloff . Chỉ được sử dụng cho Spotlight .Falloff làm giảm ánh sáng giữa các vật thểtrong và ngoài hình nón của ánh sáng.

• Attenuation0. Giá trị này kiểm soát sự thay đổi cường độ ánh sáng như thế nào dựa trênkhoảng cách của nó từ nguồn sáng. Attenuation0 cung cấp một Falloff trên thuộc tínhRange

• Attenuation1 . Giá trị quy định thay đổi cường độ ánh sáng cụ thể như thế nào khi nó xahơn từ nguồn ánh sáng. Attentuation1 ảnh hưởng đến ánh sáng từ một nguồn ánh sángmột cách tuyến tính.

Attenuation2. Giá trị quy định sự thay đổi cường độ ánh sáng như thế nào khi nó đi xahơn từ nguồn ánh sáng. Attentuation2 xác định falloff từ ánh sáng dựa trên một côngthức bậc hai.

• Theta. Chỉ được sử dụng cho Spotlights . Góc tính bằng radian của một hình nón(gócsáng) của Spotlight.

• Phi. Chỉ được sử dụng cho Spotlights. Góc tính bằng radian bên ngoài của một hìnhnón(góc sáng) của Spotlight

Trước khi bạn có thể tạo ra các nguồn sáng, bạn cần phải khai báo với Direct3D để cho phép

sủ dụng ánh sáng. Ánh sáng được tắt theo mặc định. Bạn có thể bật hiệu ứng ánh sáng thông quathuộc tính D3DRS_LIGHTING. Gửi một giá trị TRUE cho thiết lập này để mở hiệu ứng ánhsáng, trong khi một giá trị FALSE sẽ tắt hiệu ứng ánh sánh.

Code sau đây chứng minh làm thế nào để bật hiệu ứng ánh sáng trong Direct3D.

 pd3dDevice->SetRenderState (D3DRS_LIGHTING, TRUE);

Biến pd3dDevice đại diện cho một thiết bị Direct3D hợp lệ

Creating Lights in a Scene

Mỗi ánh sáng mà bạn muốn đặt trong một cảnh đòi hỏi đầu tiên mà bạn khai báo một cấutrúc D3DLIGHT9. Cấu trúc D3DLIGHT9 bao gồm thuộc tính ảnh hưởng đến việc ánh sáng sẽđược tạo ra như thế nào. Ví dụ, cường độ hoặc màu sắc của ánh sáng được định nghĩa trong cácthuộc tính này.

Sau khi có cấu trúc D3DLIGHT9 đúng cách, bạn tạo ra ánh sáng với 1 lời gọi đến hàmSetLight.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 14/28

 

Cấu trúc SetLight được định nghĩa như sau:

HRESULT SetLight(

DWORD Index,

CONST D3DLIGHT9 *pLight);

Phương thức SetLight cần 2 tham số:

• Index. Chỉ số “zero-base” của ánh sáng để tạo ra. Nếu ánh sáng được tạo ra với một chỉsố, các thuộc tính cho ánh sáng được ghi đè.

• pLight. Một con trỏ đến một thuộc tính filled-in của cấu trúc D3DLIGHT9.

Sau khi bạn gọi phương thức SetLight cho việc tạo ra ánh sáng, bạn cần phải kích hoạt nó.Theo mặc định, tất cả các ánh sáng được tắt khi chúng được tạo ra.Khởi động một ánh sáng

đòi hỏi phải có lời gọi phương thức LightEnable được định nghĩa tiếp theo.

HRESULT LightEnable(

DWORD LightIndex,BOOL bEnable

);

Phương thức LightEnable yêu cầu 2 tham số:

• LightIndex. Chỉ số của ánh sáng mà bạn muốn kích hoạt. Nó có chỉ số tương tự như bạnsử dụng trong phương thức SetLight.

• bEnable. Tham số này có thể là TRUE FALSE. Dùng TRUE khởi động ánh sáng ,trong khi dùng FALSE thì vô hiệu hóa nó

Note:

 Nếu bạn cần phải xác định xem một ánh sáng đặc biệt trong khung cảnh của bạn hiệnđang được kích hoạt, bạn có thể thực hiện lời gọi đến phương thức GetLightEnable. Nếubạn bỏ qua phương thức này, chỉ số của ánh sáng mà bạn muốn kiểm tra, phương thức

trả về một giá trị boolean với trạng thái hiện tại của ánh sáng này.

Các phần sau đây cho thấy mã cần thiết để tạo ra một ánh sáng của từng loại đã được thảoluận trước đó.

Creating an Ambient Light

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 15/28

 

Embient Lighting không yêu cầu cụ thể của việc tạo ra một nguồn ánh sáng, do đó, Đơngiản để enable loại ánh sáng này.

Đoạn code sau đây cho thấy làm thế nào để tạo ra một Embient light với một màu trắng.Bạn sẽ nhận thấy rằng Embient light được tạo ra thông qua một lời gọi SetRenderState và

không cần một cấu trúc D3DLIGHT9 đẻ tạo tạo . Bởi vì Embient light lấp đầy toàn bộ khungcảnh, Direct3D hạn chế việc này với một ánh sáng cho mỗi cảnh. Embient light được tạo rathông qua D3DRS_AMBIENT.

 pd3dDevice->SetRenderState (D3DRS_AMBIENT, D3DCOLOR_XRGB (255, 255, 255));

Màu sắc của Embient light được thiết lập bằng cách sử dụng một trong các macroD3DCOLOR mô tả ở trên.Nếu bạn đặt D3DCOLOR với tất cả các số 0, Embient light thì tácdụng không có hiệu lực.

Bạn có thể tìm thấy ví dụ nguồn đầy đủ cho việc tạo ra Embient light trong thư mụcchapter6 \example3 trên đĩa CD-ROM.

Creating a Directional Light

Đoạn code tiếp theo sẽ tạo ra một Directional light:

void createDirectionalLight ( void ){

 // Create and turn on a directional light D3DLIGHT9 light;

 // Set the type of light vlight.Type = D3DLIGHT_DIRECTIONAL;

 // Set the direction that this light will generate light fromvD3DXVECTOR3 vDir( 1.0f, 0.0f, 0.0f );

 // Normalize the light directionD3DXVec3Normalize ((D3DXVECTOR3*) &light.Direction, &vDir);

 // Set the diffuse color for this light light.Diffuse.r = 0.0f;light.Diffuse.g = 0.0f;light.Diffuse.b = 0.5f;

 // Set the ambient color for this light light.Ambient.r = 0.0f;light.Ambient.g = 0.0f;light.Ambient.b = 0.3f;

 // Set the range of this light light.Range = sqrtf (FLT_MAX);

 // Tell Direct3D to set the newly created light  pd3dDevice->SetLight (0, &light);

 // Enable the new light  pd3dDevice->LightEnable (0, TRUE);

}

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 16/28

 

Đoạn mã đầu tiên khai báo một biến để chứa các thuộc tính ánh sáng.Biến ánh sáng đạidiện cho cấu trúc D3DLIGHT9.Trước khi bạn điền vào các thuộc tính cụ thể cho ánh sáng này, bạn phải thiết lập các loại ánh sáng.Trong trường hợp này, các loại ánh sáng được thiết lập làD3DLIGHT_DIRECTIONAL, đại diện cho một ánh sáng hướng.

Bây giờ bạn có thể điền vào các thuộc tính có liên quan với ánh sáng.Bởi vì mộtDirectional light không có vị trí, bạn sẽ nhận thấy rằng thuộc tính vị trí được thiết lập.Tuynhiên, thuộc tính hướng là bắt buộc. Trong trường hợp này, ánh sáng được tạo ra với một vector hướng chỉ theo một hướng dọc theo trục X.

Các màu sắc của ánh sáng được thiết lập thông qua các thuộc tính Diffuse và Embient.Mỗi thuộc tính màu sắc này đòi hỏi các thành phần: màu đỏ, màu xanh lá cây và xanh dương.Một thuộc tính màu sắc phản chiếu có thể được thiết lập cho loại ánh sáng này.

Sau khi thuộc tính được thiết lập, ánh sáng được tạo ra và kích hoạt với lời gọi đếnSetLight và LightEnable. Bạn có thể tìm thấy mã nguồn đầy đủ trong thư mục example4 \chapter6 trên đĩa CD-ROM.

Creating a Point Light

Ví dụ mã sau đây chứng minh làm thế nào để tạo ra một Point light trong một cảnh.

void createPointLight (void){

 // Create and turn on a directional light D3DLIGHT9 light;

 // Set the type of light light.Type = D3DLIGHT_POINT;

 // Set the position for this light light.Position = D3DXVECTOR3( -2500.0f, 0.0f, 0.0f );

 // Set the red, green, and blue diffuse components for this // light source

light.Diffuse.r = 1.0f;light.Diffuse.g = 0.5f;light.Diffuse.b = 0.5f;

 // Set the red, green, and blue ambient components for this // light source

light.Ambient.r = 0.5f;light.Ambient.g = 0.0f;light.Ambient.b = 0.0f;light.Range = sqrtf(FLT_MAX);

 // Tell Direct3D to create the new light  pd3dDevice->SetLight(0, &light );

 // Enable the light  pd3dDevice->LightEnable (0, TRUE);

}

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 17/28

 

Đoạn mã này đầu tiên khai báo một biến để chứa các thuộc tính ánh sáng.Biến ánh sángđại diện cho cấu trúc D3DLIGHT9.Trước khi điền vào các thuộc tính cụ thể cho ánh sáng này,loại ánh sáng phải được thiết lập.Trong trường hợp này, các loại ánh sáng được thiết lập đểD3DLIGHT_POINT, đại diện cho một ánh sáng điểm.

Bây giờ bạn có thể điền vào các thuộc tính có liên quan với ánh sáng.Bởi vì đây là mộtPoint light , thuộc tính Hướng là không cần thiết, nhưng thuộc tính Vị trí cần được thiếtlập.Trong đoạn mã trước đó, vị trí được thiết lập để di chuyển ánh sáng 2.500 đơn vị về bên tráicủa gốc tọa độ dọc theo trục X.

Một lần nữa, màu sắc của ánh sáng được thiết lập thông qua các thuộc tính Diffuse vàEmbient.

Sau khi thuộc tính được thiết lập, ánh sáng được tạo ra và kích hoạt với lời gọi đếnSetLight và LightEnable.Mã nguồn đầy đủ cho Point light là trong thư mục example6 \ chapter6trên đĩa CD-ROM.

Creating a Spotlight

Tạo ra một Spotlight là tương tự như việc tạo ra các loại ánh sáng khác , với việc bổsung thêm một tham số. Spotlight đòi hỏi các giá trị bổ sung:

• Phi. Góc tính theo radian định nghĩa cạnh bên ngoài hình nón của Spotlight.Spotlightnày không sáng bất kỳ điểm nào nằm ngoài cạnh này.Giá trị có thể được giữa 0 và pi.

• Theta. Góc tính theo radian xác định bên trong hình nón của Spotlight.Khu vực này làhoàn toàn được chiếu sáng bởi cường độ của Spotlight.

• Falloff. Một giá trị quyết định giảm ánh sáng giữa bên trong và bên ngoài hình nón củaSpotlight.

Đoạn code sau cho thấy làm sao tạo ra một Spotlight:

void createSpotLight(void){

 // Create and turn on a directional light D3DLIGHT9 light;

 // Set the type of light light.Type = D3DLIGHT_SPOT;

 // Set the position and the direction for this light D3DXVECTOR3 vDir (1.0f, -1.0f, 0.0f);D3DXVec3Normalize ((D3DXVECTOR3*)&light.Direction, &vDir );light.Position = D3DXVECTOR3 (-250.0f, 250.0f, 0.0f);

 // Set the red, green, and blue diffuse color components // for this light source

light.Diffuse.r = 1.0f;light.Diffuse.g = 0.5f;

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 18/28

 

light.Diffuse.b = 0.5f; // Set the red, green, and blue ambient color components // for this light source

light.Ambient.r = 0.5f;light.Ambient.g = 0.0f;

light.Ambient.b = 0.0f; // Set the rangelight.Range = sqrtf(FLT_MAX);

 // spotlight-specific parameterslight.Phi = 1.0f;light.Falloff = 0.5f;light.Theta = 0.5f;

 // Create the light  pd3dDevice->SetLight(0, &light );

 // Enable the new light  pd3dDevice->LightEnable(0, TRUE );

}Đoạn mã này đầu tiên khai báo một biến để chứa các thuộc tính ánh sáng.Biến ánh sáng

đại diện cho cấu trúc D3DLIGHT9.Trước khi bạn điền vào các thuộc tính cụ thể cho ánh sángnày, bạn phải thiết lập loại ánh sáng.Trong trường hợp này, loại ánh sáng được thiết lập làD3DLIGHT_SPOT, đại diện cho một ánh đèn sân khấu.

Bây giờ bạn có thể điền vào các thuộc tính có liên quan với ánh sáng.Spotlight có cả Vịtrí và Hướng.Trong trường hợp này, ánh sáng theo hướng dương X và xuống trục Y.

Một lần nữa, màu sắc của ánh sáng được thiết lập thông qua các thuộc tính Diffuse vàmôi Embient

Spotlight cũng đòi hỏi phải thiết lập thêm ba thuộc tính cụ thể để loại ánh sáng này: Phi,Theta, và Falloff.

Sau khi thuộc tính được thiết lập, ánh sáng được tạo ra và kích hoạt với các lời gọi đếnSetLight và LightEnable. Mã nguồn đầy đủ cho một ánh sáng điểm là trong thư mục example5 \chapter6 trên đĩa CD-ROM.

Giải thích Materials

Materials kiểm soát một đối tượng phản chiếu hoặc phát ra ánh sáng. Các đặc tính củaMaterials mô tả cho Direct3D cách ánh sáng trong một cảnh được phản chiếu bởi các đa giác đãtạo nên một đối tượng. Các thuộc tính sau đây định nghĩa một Material:

o Diffuse reflection - Phảm ánh khuếch táno Ambient reflection – Phản ánh môi trường xung quanho Specular reflection – Phản ánh phản xạ

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 19/28

 

o Light emission – Phát ra ánh sáng

Materials bao gồm những thuộc tính riêng biệt làm việc với nhau để mô tả các đốitượng.Các thuộc tính được mô tả chi tiết hơn trong các phần tiếp theo.

Diffuse ReflectionKhuếch tán ánh sáng là hướng đi của ánh sáng trong một cảnh.Thuộc tính khuếch tán của

Material mô tả làm thế nào ánh sáng khuếch tán được phản ánh từ một đối tượng. Bằng cáchthay đổi thuộc tính khuếch tán, bạn có thể kiểm soát màu sắc mà đối tượng phản ánh.

Ambient Reflection

Bởi vì ánh sáng môi trường xung quanh là không trực tiếp, nó ảnh hưởng đến các đốitượng trong một cảnh từ tất cả các bên.Thuộc tính môi trường xung quanh của Material xác địnhlàm thế nào Embient light được phản chiếu bề mặt của một đối tượng.Thay đổi thuộc tính

embient- môi trường xung quanh- làm thay đổi màu sắc nhận được của đối tượng khi tương tácvới ánh sáng môi trường xung quanh.

Specular Reflection

Specular reflection được tạo ra do “ các điểm phản chiếu” (highlight)trên các đối tượng,làm cho chúng xuất hiện thực tế hơn. Thuộc tính phản chiếu của một Material kiểm soát màu sắccủa “điểm phản chiếu” này, và thuộc tính độ mạnh(power) điều khiển độ sắc nét của “điểm phảnchiếu” này. Giá trị độ mạnh càng cao thì độ sắc nét của “điểm phản chiếu “ sẽ xuất hiện. Hình6.10 cho thấy ấm trà từ trước đó, được render với specular highlight.

Hình 6.10 - Ấm trà được render băng Specular highlight.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 20/28

 

Emission

Thuộc tính phát xạ của Material có thể làm cho một đối tượng xuất hiện phát ra ánh sáng.Tuy nhiên, các đối tượng khác, không thể phản ánh ánh sáng từ tài sản này bởi vì nó không phảilà một ánh sáng thực sự trong hiện trường.Bằng cách thiết lập thuộc tính phát xạ, bạn có thể

kiểm soát màu sắc của ánh sáng mà các đối tượng xuất hiện phát ra.

Materials được sử dung như thế nào

Materials được tạo ra thông qua việc sử dụng cấu trúc D3DMATERIAL9. Cấu trúc nàychứa tất cả các thuộc tính mà material cần để kiểm soát ánh sáng được phản ánh từ một đốitượng. Cấu trúc D3DMATERIAL9 được định nghĩa ở đây:

typedef struct _D3DMATERIAL9{

D3DCOLORVALUE Diffuse;

D3DCOLORVALUE Ambient;D3DCOLORVALUE Specular;D3DCOLORVALUE Emissive;float Power;

} D3DMATERIAL9;

Cấu trúc D3DMATERIAL9 chứa 5 biến:• Diffuse. Màu khuếch tán của Material• Ambient. Màu môi trường xung quanh của Material• Specular. Màu phản chiếu của Material• Emissive. Màu phát xạ của Material•

Power. 1 giá trị xách định độ sắc nét của specular highlight

Specular Highlights

Thiết lập chỉ là gán thuộc tính phản chiếu của một Material là không cho phép một đốitượng cho ra specular highlight , bạn phải kích hoạt highlight trước. Trạng thái render D3DRS_SPECULARENABLE phải được thiết lập để TRUE. Thiết lập giá trị này là FALSE sẽtắt specular highlight.

Đoạn code sau enable specular highlight:

 // Set to use specular highlightsHRESULT hr; // Set the new render state

hr = pd3dDevice->SetRenderState (D3DRS_SPECULARENABLE, TRUE); // If the call to SetRenderState failed, handle the error here

if(FAILED(hr))return false;

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 21/28

 

Biến pd3Device phải chứa giá trị thiết bị Direct3D hợp lệ

Texture Mapping

Tính đến thời điểm này, tất cả các đối tượng 3D mà bạn đã tạo ra trông khá nhàm chán.

Tất nhiên chúng nhiều màu sắc, nhưng chúng thực sự không giống như các đối tượng thế giớithực. Chúng có chiều sâu và ánh sáng, nhưng họ thiếu tính hiện thực. Texture mapping giúpcho trò chơi của bạn hiện thực mà tất cả mọi người mong đợi.

Texture mapping là một quá trình tải một hình ảnh hoặc một hình ảnh và bao nó xungquanh các đối tượng 3D của bạn. Ví dụ, một hình vuông màu xanh lá cây không nhìn giống nhưcỏ, nhưng nếu bạn áp dụng một hình ảnh của cỏ lên hình vuông, nó bắt đầu giống thực hơn . Đólà những gì về Texture mapping : thực tế hóa đến một thế giới khác nhân tạo.

Tôi sẽ mô tả các bước chi tiết cần thiết để thêm kết cấu cho thế giới ảo của bạn.

Direct3D sử dụng Textures như thế nàoGiao diện IDirect3DTexture9 đại diện cho các textures trong Direct3D.Giao diện này

cung cấp cho bạn với các phương pháp thao tác với Textures , chẳng hạn như tạo ra mipmaps,thiết lập mức độ chi tiết của Texture , cũng như khả năng để khóa Texture , tạo cho bạn truy cậptrực tiếp vào các dữ liệu điểm ảnh.

Trước khi bạn có thể sử dụng Textures trong trò chơi của bạn, bạn cần phải tải chúng vàgiao chúng cho giao diện IDirect3DTexture9. Hình 6.11 cho thấy một khối lập phương với mộtTexture mapping được áp dụng cho tất cả các bên.

Hình 6.11 – Khối lập phương với Texture map

Làm thế nào để áp dụng Textures

Texture là ánh xạ tới các đối tượng 3D bằng cách sử dụng các tọa độ texture . Kết cấutọa độ mô tả cho Direct3D phần nào của texture sẽ được áp dụng và ở chổ nào.

Tọa độ Texture bình thường trong phạm vi giá trị từ 0.0f đến 1.0f. Bởi vì những textureimages mà bạn sẽ áp dụng hình chữ nhật, giá trị 0.0f đại diện cho phía bên trái và 1.0f đại diện

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 22/28

 

cho phía bên phải. Tọa độ texture làm việc trong cùng một cách thức theo hướng thẳng đứng,nơi 0.0f đại diện đỉnh của đối tượng và 1.0f đại diện cho đáy của đối tượng. Hình 6,12 cho thấytọa độ texture của một hình vuông.

Sử dụng các tọa độ texture thể hiện trong hình 6,12, bạn sẽ mapping toàn bộ các texture

iamge kết cấu hình vuông. Hình 6,13 cho thấy hình vuông sẽ như thế nào với một texture ápdụng cho nó.

Hình 6.12 Vị trí texture Hình 6.13 – Hình vuông vớiCủa hình vuông texture map được áp dụng

Note: Bạn nên cố gắng giữ cho texture của bạn tương đối nhỏ để làm tăng cơ hội mà chúng sẽ lưu trữ trong bộ nhớ video. Ngoài ra, một số card màn hình yêu cầu rằng kích thướctexture của bạn độ mạnh là 2. Ví dụ, một hình ảnh 64 × 64 đáp ứng cả yêu cầu về kíchthước và độ mạnh là 2.

Texture Coordinates

Tọa độ Texture thường được đại diện trong code do hai giá trị u và v. Để sử dụng teturexmapping trong Direct3D, trước tiên bạn cần phải cập nhật cấu trúc vertex của bạn. Như bạn cóthể nhìn thấy trong cấu trúc CUSTOMVERTEX mới sau đây, hai biến float mới - u và v đã đượcthêm vào.

struct CUSTOMVERTEX{

FLOAT x, y, z; // the untransformed, 3D position for the vertexFLOAT u, v;

};

Bạn cũng cần phải thêm cờ D3DFVF_TEX1 vào định dạng Vertex của bạn. Cờ D3DFVF_TEX1 thông báo Direct3D rằng bạn đã thêm texture vào trong định dạng Vertex của bạn.

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 23/28

 

Cuối cùng, bạn cần phải thêm tọa độ texture vào định nghĩa Vertex .Trước đây, chỉ cóX, Y, và Z giá trị được chỉ định cho mỗi vertex .

Note: Direct3D cho phép dùng đến tám texture được áp dụng bằng cách sử dụng cờ 

 D3DFVF_TEX1 đến cờ D3DFVF_TEX8.Thể hiện bên cạnh là khai báo cập nhật bao gồm tập hợp các tọa texture .

CUSTOMVERTEX g_Vertices [] ={

// X Y Z U V{-1.0f, 1.0f,-1.0f, 0.0f, 0.0f},{ 1.0f, 1.0f,-1.0f, 1.0f, 0.0f},{-1.0f,-1.0f,-1.0f, 0.0f, 1.0f},{ 1.0f,-1.0f,-1.0f, 1.0f, 1.0f}

}

Texture Stages

Giai đoạn texture cho phép bạn áp dụng nhiều hơn một texture cho một đối tượng trong1 lần dựng hình duy nhất. Mỗi lần rendering có thể bao gồm đến tám giai đoạn, với từng giaiđoạn cho phép bạn áp dụng một texture và kiểm soát type và số lượng sử dụng pha trộn được.

Note:Một số phần cứng video có giới hạn số lượng “giai đoạn texture” bạn có thể sử dụng. Luôn luôn kiểm tra khả năng của adapter để xác nhận rằng nó có thể xử lý số lượng của

các ”giai đoạn texture” mà bạn muốn sử dụng.

Các loại texture blending được điều khiển thông qua các trạng thái của “ giai đoạntexture “

Texture Stage States

Các giai đoạn Texture ảnh hưởng đến làm thế nào mà texture được áp dụng cho một đốitượng. Cách bình thường mà một texture được áp dụng là với đầy đủ độ mờ và không pha trộn.Bằng cách thiết lập state cho một “ giai đoạn texture” cụ thể, bạn có thể thay đổi hai texture

được pha trộn với nhau để tạo ra một hiệu ứng giống như mapping lght, hoặc tạo ra một textuređược áp dụng cho một đối tượng 1 cách rõ ràng.

Bạn thay đổi trạng thái của một “giai đoạn texture” thông qua chức năngSetTextureStageState, thể hiện bên cạnh:

HRESULT SetTextureStageState(

DWORD Stage,

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 24/28

 

D3DTEXTURESTAGESTATETYPE Type,DWORD Value

);

Phương thức SetTextureStageState yêu cầu 3 tham số:

• Stage. Con số của stage để áp dụng state vào• Type. Các loại state được áp dụng cho stage. Giá trị hợp lệ được tìm thấy trong liệt kê

D3DTEXTURESTAGESTATETYPE.• Value. Tham số này phụ thuộc vào giá trị quy định trong tham số Type.

Loading a Texture

Bây giờ bạn tìm hiểu texture mapping là gì và cách hoạt động, có lẽ bạn đang tụ hỏi làmthế nào để lấy texture vào trò chơi của bạn. Texture là chỉ là các tập tin hình ảnh như bạn đã sửdụng trước đây. Thông thường, định dạng hình ảnh bitmap được sử dụng cho các ứng dụng được

viết cho Direct3D. Chúng có thể được tải từ ổ đĩa hoặc có thể ở trong ứng dụng thực thi củachính nó như là một tài nguyên. Hai phần sau đây mô tả các bước cần thiết để tải các texture bằng cách sử dụng cả hai phương pháp

Texture Loading from a File

Tải hình ảnh texture từ một đĩa là cách tốt nhất để cung cấp đồ họa trò chơi của bạn. Bởivì các texture không phải là một phần của thực thi, bạn có thể thay đổi chúng một cách dễ dàngmà không cần xây dựng lại ứng dụng của bạn.

Direct3D cung cấp phương thức D3DXCreateTextureFromFile từ thư viện tiện ích

D3DX đẻ tải texutre . Phương thức D3DXCreateTextureFromFile được định nghĩa tiếp theo:

HRESULT D3DXCreateTextureFromFile(

LPDIRECT3DDEVICE9  pDevice,LPCTSTR   pSrcFile,LPDIRECT3DTEXTURE9 * ppTexture

);

Phương thức D3DXCreateTextureFromFile yêu cầu 3 tham số:

pDevice. Một con trỏ đến một thiết bị Direct3D hợp lệ• pSrcFile. Một chuỗi có chứa đường dẫn và tên tập tin của hình ảnh của texture• ppTexture. Một con trỏ kiểu IDirect3DTexture9 sẽ nhận các cấu trúc texture được tạo ra

Đoạn code sau cho thấy cách để tạo ra một Direct3D texture từ các tập tin test.bmp.

HRESULT hr;  // variable to hold the return codeLPDIRECT3DTEXTURE9 g_pTexture = NULL;  // IDirect3DTexture9 object to

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 25/28

 

 // hold the texture // Call D3DXCreateTextureFromFile

hr = D3DXCreateTextureFromFile( pd3dDevice, “test.bmp”, &g_pTexture ); // Check the return code to make sure you have a valid texture

if FAILED (hr)

return false;

Tại thời điểm này, bạn cần phải có một texture Direct3D hợp lệ trong biến g_pTexture.

Phương thức D3DXCreateTextureFromFile cho phép tải các tập tin hình ảnh của texturetrong các định dạng sau:

• Bitmap. Những tập tin có phần mở rộng bmp• Windows DIB. Những tập tin có phần mở rộng DIB• Targa. Những tập tin có phần mở rộng TGA• JPEG. Những tập tin có phần mở rộng JPG• PNG. Những tập tin có phần mor rộng PNG•

DDS. Những file DirectDraw surface. Chúng có phần mở rộng DDS.

Texture nạp dữ liệu từ 1 nguồn

Đôi khi ứng dụng của bạn yêu cầu chỉ có một hoặc hai texture , và nó không tạo ra khungcảnh để vận chuyển các texture như các tập tin riêng biệt.Trong trường hợp này, bạn có thể bócác texture vào file thực thi như là một nguồn tài nguyên. Mặc dù phương pháp này làm tăngkích thước file thực thi của bạn, nó cũng cung cấp cho bạn lợi ích là không yêu cầu các tập tin bên ngoài để hoạt động.

Các thư viện tiện ích D3DX cung cấp cho bạn chức năng trợ giúp

D3DXCreateTextureFromResource để giúp bạn tải các texture của bạn từ file thực thi.D3DXCreateTextureFromResource được đưa ra ở đây:

HRESULT D3DXCreateTextureFromResource(

LPDIRECT3DDEVICE9 pDevice,HMODULE hSrcModule,LPCTSTR pSrcResource,LPDIRECT3DTEXTURE9 *ppTexture

);

Phương thức D3DXCreateTextureFromResource yêu cầu 4 tham số:• pDevice. Một con trỏ tới một thiết bị Direct3D hợp lệ.• hSrcModule. Quản lí các modul khi tài nguyên được xác định. Khi bạn đang tải một

hình ảnh từ tập tin thực thi khác , tham số này là NULL.• pSrcResource. Một chuỗi đại diện cho tên của tài nguyên.• ppTexture. Một con trỏ đến một biến IDirect3DTexture9 l sẽ nhận texture mới đã được

nạp.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 26/28

 

Mã mẫu sau đây cho thấy làm thế nào để tải một texture từ một nguồn.

HRESULT hr; // IDirect3DTexture9 object to hold the texture

LPDIRECT3DTEXTURE9 g_pTexture = NULL;

 // Call D3DXCreateTextureFromResourcehr = D3DXCreateTextureFromResource ( pd3dDevice, NULL,“IDB_BITMAP1”,&g_pTexture );

 // Check the return code to make sure you have a valid textureif FAILED (hr)

return false;

Trong đoạn mã trước đó, texture image cố gắng để tải được gọi là IDB_BITMAP1.Têncủa tài nguyên hình ảnh này được thông qua như là tham số thứ ba cho phương thức

D3DXCreateTextureFromResource. Nếu lời gọi thành công, biến g_pTexture chứa một textureDirect3D hợp lệ.

Applying a Texture

Texture được áp dụng cho các đối tượng thông qua phương thức SetTexture. Phươngthức này báo cho Direct3D biết texture nào sẽ sử dụng để render đa giác hiện tại. Nếu sau khi bộ đầu tiên của đa giác đã kết thúc render, bạn muốn vẽ một bộ thứ hai của đa giác với texturekhác, bạn sẽ cần phải thực hiện lời gọi đến SetTexture với texture mới.

Note:

Một lời gọi đến SetTexture được xếp vào một thay đổi trạng thái. Bạn nên giảm thiểu số lượng “thai đổi trạng thái” bạn thực hiện trong suốt khung hình vì chúng có thể làmchậm tốc độ khung hình tổng thể của bạn.

Phương thức SetTexuture được định nghĩa sau:

HRESULT SetTexture(

DWORD Stage,IDirect3DBaseTexture9 *pTexture

);

Phương thức SetTexture yêu cầu 2 tham số như sau:

• Stage. Giai đoạn mà texture này sẽ được áp dụng cho. Nếu bạn là vẽ một duy nhất 1texture , giá trị này sẽ là 0.

• pTexture. Một con trỏ đến đối tượng IDirect3DTexture9 để sử dụng.

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 27/28

 

Đoạn code sau đây cho thấy một ví dụ về chức năng cập nhật phương thức render áp dụngmột texture lên khối lập phương sẽ được vẽ. Chú ý rằng lời gọi đến SetTexture sẽ được thựchiện trước khi gọi đến DrawPrimitive. Sau khi Direct3D bắt đầu vẽ,nó áp dụng bất cứ texturenào là đang hoạt động. Nếu bạn gọi SetTexture lại lần nữa trong khi gọi DrawPrimitive, tất cảcác đa giác bổ sung sẽ được render với các texture mới được áp dụng.

void Render(void){

 // Clear the back buffer and the Z buffer   pd3dDevice->Clear ( 0,

 NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(255,255,255),1.0f,0 );

 // Tell Direct3D that rendering is about to begin pd3dDevice->BeginScene(); // Set the current texture to use

 pd3dDevice->SetTexture( 0, g_pTexture ); // Set the vertex stream

 pd3dDevice->SetStreamSource( 0, buffer, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

 // Draw the triangle strips that make up the cube pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 4, 2 );

 pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 8, 2 ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 12, 2 ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 16, 2 ); pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 20, 2 );

 // Drawing is now complete pd3dDevice->EndScene();

 // Flip the buffers and display this to the screen pd3dDevice->Present( NULL, NULL, NULL, NULL );

}

Phương thức Render trước yêu cầu 6 lời gọi đến hàm DrawPrimitive, mỗi một lầnrender 1mặt của khối lập phương. Bạn có thể tìm thấy một ví dụ nguồn đầy đủ trong thư mụcchapter6\ example7 trên đĩa CD-ROM.

Tọa độ texture báo cho Direct3D vị trí từng phần của texture sẽ xuất hiện trên 1 đa giácđặc biệt. Cho đến nay, bạn đã sử dụng các giá trị tiêu chuẩn của 0.0f cho phía bên trái của hìnhđa giác và 1.0f cho phía bên phải. Điều này làm cho texture được mapping vào đa giác một lần.Texture mặc dù, có thể được lặp đi lặp lại nhiều lần trên một hình đa giác nếu bạn thao tác vào

5/13/2018 Begining DirectX-Chapter 6-Translate VN - slidepdf.com

http://slidepdf.com/reader/full/begining-directx-chapter-6-translate-vn 28/28

 

“tọa độ texture” . Bạn có thể làm tăng giá trị “tọa độ bên phải texture” thông qua các giá trị tiêuchuẩn 1.0f để đại diện cho số lần lặp lại texture .

Ví dụ, nếu bạn muốn để lặp lại một texture hai lần trên một hình đa giác, bạn sẽ thay đổigiá trị “tọa độ bên phải texture” thành 2.0f. “Tọa độ phía dưới của texture ” làm việc giống như

thế, cho phép kết cấu được lặp đi lặp lại theo hướng lên xuống. Nhìn vào việc cập nhật định nghĩa cấu trúc vertex như sau. Chú ý rằng các tọa độ texture

đã được thay đổi để texture lặp đi lặp lại hai lần trong mỗi hướng.

CUSTOMVERTEX g_Vertices[] ={

// X Y Z U V{-1.0f, 1.0f, -1.0f, 0.0f, 0.0f},{ 1.0f, 1.0f, -1.0f, 2.0f, 0.0f},{-1.0f,-1.0f, -1.0f, 0.0f, 2.0f},

{ 1.0f,-1.0f, -1.0f, 2.0f, 2.0f}}

Khả năng lặp lại texture trên bề mặt rất hữu ích khi bạn muốn giữ số lượng đa giác của bạn thấp và bạn không muốn kéo dài texture của bạn trên một khu vực quá lớn. Lặp đi lặp lạimột texture cỏ trên một cảnh quan và texture gạch trên tường là hai ứng dụng mẫu cho kết cấulặp đi lặp lại. Hình 6,14 cho thấy lặp lại của texture ảnh hưởng đến kết cấu được áp dụng chomột đối tượng.

Hình 6.14 – Một hình lập phương với texture lập lại 2 lần theo mỗi hướng

Một ví dụ nguồn đầy đủ nằm trong thư mục chapter6\ example8 trên đĩa CD-ROM.