ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ Bùi Hoàng Khánh XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG -
HIỆU ỨNG ÁNH SÁNG VÀ VẬT LIỆU KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công nghệ thông tin
HÀ NỘI – 2009
ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Đặc biệt, tôi xin chân thành cảm ơn giảng viên, thạc sĩ Vũ Quang Dũng. Cảm ơn
thầy vì những định hướng, nhận xét quý báu và động viên kịp thời của thầy đã giúp tôi
hoàn thành khóa luận này. Tôi cũng xin cảm ơn phòng thí nghiệm Toshiba – Coltech
đã tạo điều kiện cho tôi có môi trường làm việc trong quá trình thực hiện khóa luận
này.
Cuối cùng tôi xin bày tỏ lòng biết ơn sâu sắc tới gia đình và bạn bè, những người
đã luôn động viên, giúp đỡ tôi cả về vật chất lẫn tinh thần trong suốt những năm tháng
qua.
Hà Nội, ngày 19 tháng 05 năm 2009
Sinh viên
Bùi Hoàng Khánh ii
TÓM TẮT
Sự phát triển của công nghệ mô phỏng và giải trí, ngày càng có nhiều ứng dụng
đồ họa và trò chơi 3D được xây dựng nhằm phục vụ mục đích nghiên cứu, mô phỏng
và giải trí… Cùng với đó, công nghệ phần cứng cũng phát triển rất nhanh, đặc biệt là
các phần cứng xử lý đồ họa có thể lập trình được và các ngôn ngữ lập trình trên các
phần cứng này. Tuy nhiên, để xây dựng một ứng dụng đồ họa và trò chơi 3D đảm bảo
các yêu cầu: hỗ trợ một dải phần cứng và phần mềm (cụ thể là hệ điều hành) lớn, có
khả năng lựa chọn API đồ họa mức thấp (OpenGL, OpenGL ES hay DirectX), dễ d àng
quản lý và phát triển các tài nguyên; các ứng dụng này được xây dựng từ một game
engine, chứ không phát triển từ nguyên thủy.
Xuất phát từ thực tế đó, khóa luận tập trung nghiên cứu xây dựng một hệ thống
Game Engine hỗ trợ xây dựng ứng dụng đồ họa và trò chơi 3D trên nhiều nền tảng
khác nhau. Hệ thống Game Engine được xây dựng sẽ cung cấp giao diện lập trình ở
1.2.2.1. Thành phần Cấu trúc dữ liệu cơ bản .............................................. 5
1.2.2.2. Thành phần Giao tiếp với Hệ điều hành ........................................ 6
1.2.2.3. Thành phần Render Engine ........................................................... 7
1.2.2.4. Các thành phần còn lại ................................................................... 8
Chương 2: CƠ SỞ LÝ THUYẾT............................................................... 9
2.1. Ánh sáng trong đồ họa máy tính .............................................................. 9
2.1.1. Các thành phần của ánh sáng ................................................................ 9
2.1.2. Các mô hình tạo bóng ......................................................................... 11
2.2. Đổ bóng ..................................................................................................... 12
2.2.1. Bóng của đối tượng trong khung cảnh ................................................ 12
2.2.2. Phương pháp đổ bóng ......................................................................... 12
2.3. Đối tượng có bề mặt phức tạp ................................................................ 13
2.3.1. Đối tượng với mạng lưới nhiều đa giác .............................................. 13
2.3.2. Kỹ thuật sử dụng bản đồ vector pháp tuyến ....................................... 13
2.3.3. Không gian Texture ............................................................................ 14
iv
Chương 3: MÔ HÌNH ĐỀ XUẤT ............................................................ 16
3.1. Các yêu cầu chung của mô đun .............................................................. 16
3.2. Các thành phần trong mô đun ................................................................ 17
Chương 4: THIẾT KẾ CHI TIẾT ........................................................... 19
4.1. Chiếu sáng ................................................................................................ 19
4.1.1. Vật liệu ................................................................................................ 19
4.1.2. Chiếu sáng bằng mô hình OpenGL cung cấp ..................................... 20
4.1.3. Chiếu sáng bằng mô hình tự định nghĩa ............................................. 22
4.1.3.1. Lớp DLightSceneNode ................................................................ 22
4.1.3.2. Sử dụng DLightSceneNode ......................................................... 25
4.2. Hiệu ứng đổ bóng ..................................................................................... 27
4.3. Hiệu ứng Bump ........................................................................................ 30
Chương 5: THỰC NGHIỆM ................................................................... 34
DANH MỤC HÌNH VẼ
Hình 1: Kiến trúc phân tầng của GEM ................................................................... 3
Hình 2: Kiến trúc tổng thể của GEM ...................................................................... 4
Hình 3: Biểu đồ lớp của thành phần Các kiểu dữ liệu cơ bản ................................ 5
Hình 4: Quá trình điều phối sự kiện ....................................................................... 6
Hình 5: Kiến trúc phân tầng của Render Engine .................................................... 7
Hình 6: Tác động của Ánh sáng trong đồ họa 3D .................................................. 9
Hình 7: Vẽ vật thể với áng sáng Ambient ............................................................ 10
Hình 8: Vẽ vật thể với thành phần Diffuse ........................................................... 10
Hình 9: Vẽ vật thể với thành phần Specular ......................................................... 11
Hình 10: Kết quả của một số mô hình tạo bóng ................................................... 11
Hình 11: Kết quả của cùng một mô hình ánh sáng trên Vertex và Pixel.............. 12
Hình 12: Mô hình của SV ..................................................................................... 13
Hình 13: So sánh giữa sử dụng bản đồ pháp tuyến và thiết kế mô hình .............. 14
Hình 14: Mô hình liên kết với các thành phần khác bên ngoài ............................ 16
Hình 15: Các thành phần của mô đun Hiệu ứng ánh sáng và vật liệu .................. 17
Hình 16: Quá trình Chiếu sáng ............................................................................. 19
Hình 17: Lớp Material .......................................................................................... 20
Hình 18: Lớp LightSceneNode ............................................................................. 20
Hình 19: Sơ đồ “bật” nguồn sáng ......................................................................... 21
Hình 20: Lớp DLightSceneNode .......................................................................... 22
Hình 21: Sơ đô trạng thái “bật” nguồn sáng động ................................................ 23
Hình 22: Lớp DLightEffect .................................................................................. 24
Hình 23: Ví dụ về một lớp sử dụng DLightSceneNode ....................................... 25
Hình 24: Quá trình chiếu sáng bằng hệ thống ánh sáng động .............................. 26
vii
Hình 25: Lớp Shadow ........................................................................................... 27
Hình 26: Sơ đồ trạng thái vẽ bóng ........................................................................ 27
xử lý đồ họa và tương tác ấn tượng thường được phát triển bởi một đội ngũ đông đảo
gồm nhà thiết kế, lập trình viên… trong khoảng thời gian liên tục từ một đến ba năm.
Để đảm bảo các yêu cầu: hỗ trợ một dải phần cứng và phần mềm (hệ điều hành) lớn,
có khả năng lựa chọn API đồ họa mức thấp (OpenGL, OpenGL ES hay DirectX), dễ
dàng quản lý và phát triển các tài nguyên, và có khả năng tái sử dụng mã nguồn cao;
các ứng dụng này thường được phát triển lên từ một game engine thay vì phát triển từ
nguyên thủy.
Ở Việt Nam hiện nay, các trò chơi trực tuyến mới chỉ thực sự thâm nhập vào thị
trường cách đây 06 năm; chỉ trong khoảng thời gian ít ỏi đó, chúng ta đã hình thành
hàng chục các nhà phát hành, và số trò chơi trực tuyến được phát hành cũng tương ứng
với số lượng đó. Nhưng một thực trạng đáng buồn là gần như hầu hết các trò chơi trực
tuyến đang được phát hành nhập khẩu từ nước ngoài, chủ yếu là Trung Quốc và Hàn
Quốc (trừ một số trò chơi nhỏ chơi trên nền web như đánh bài, đánh cờ…). Một câu
hỏi mà có lẽ tất cả người chơi đều trăn trở là “bao giờ mới được chơi game Việt
Nam?”.
Từ thực tế đó, chúng tôi chọn đề tài này không có tham vọng quá lớn, mà chỉ
muốn đi những bước chập chững đầu tiên vào thế giới phát triển game rộng lớn, để thu
lượm kiến thức về lĩnh vực khó khăn nhưng đầy thú vị này; và hi vọng ở một tương lai
không xa, chúng tôi có thể góp một phần sức lực giải đáp trăn trở của cộng đồng người
chơi game Việt Nam.
Khóa luận nghiên này cứu xây dựng một hệ thống Game Engine đa nền tảng
(được đặt tên là GEM) (trước mắt sẽ hỗ trợ Window PC và Linux PC) và nhắm đến thị
trường trò chơi nhập vai trực tuyến. Đây là mục tiêu dài hạn, còn hiện tại, do hạn chế
về thời gian (khoảng 5 tháng) nên chúng tôi chỉ tập trung hoàn thiện thành phần
Render Engine trong Game Engine. Để giải quyết vấn đề này, khóa luận tập trung
nghiên cứu và phân tích môi trường phát triển đồ họa 3D (gồm cả phần cứng và phần
2
mềm), các công nghệ đã được triển khai trong một số game engine khác hiện có trên
thị trường. Từ đó khóa luận đưa ra phương pháp và xây dựng hệ thống tổ chức và quản
triển ứng dụng game một cách nhanh chóng và đơn giản, đồng thời cung cấp khả năng
tái sử dụng mã nguồn cao do có thể phát triển nhiều ứng dụng từ một game engine.
Hình 1: Kiến trúc phân tầng của GEM
GEM là một game engine nên dĩ nhiên nó cũng tuân theo mô hình này (Hình 1).
1.2. Mô hình của GEM
1.2.1. Các đặc điểm của GEM
Như đã giới thiệu, GEM hỗ trợ đa nền (Window PC và Linux PC) và nhắm đến
thị trường phát triển game nhập vai trực tuyến, nên GEM có các đặc điểm sau:
Đầu tiên là khả năng chạy đa nền. Để đạt được điều này, GEM sử dụng các bản
build khác nhau trên các nền tảng khác nhau (chứ không phải sử dụng thông dịch). Các
đoạn code phụ thuộc nền tảng sẽ được phân chia bằng việc sử dụng các cờ tiền biên
dịch, hạn chế tối đa việc sử dụng các lớp ảo – vì việc nằm sẽ làm giảm đáng kể hiệu
suất chương trình [4][5]. Cũng vì lí do này chúng tôi lựa chọn OpenGL làm giao diện
lập trình đồ họa 3D cấp thấp cho GEM, do chuẩn OpenGL là chuẩn mở và không bị
phụ thuộc vào hệ điều hành; và sử dụng Cg Shading Language làm ngôn ngữ tạo bóng.
Thứ hai, GEM được thiết kế hướng đối tượng và yêu cầu về hiệu năng chạy cao
nên chúng tôi sử dụng ngôn ngữ C++ - ngôn ngữ đáp ứng hoàn hảo các điều kiện trên.
4
Cuối cùng, do GEM nhắm đến thị trường phát triển game nhập vai trực tuyến,
nên sẽ được thiết kế để tương thích với một phạm vi rộng cấu hình phần cứng, dự kiến
sẽ hỗ trợ các card đồ họa hỗ trợ OpenGL 1.4 và Shader 1.0 trở lên (Bảng 1).
Bảng 1: Dòng card đồ họa được GEM hỗ trợ
Hãng sãn xuất Dòng card hỗ trợ
nVIDIA Từ GeForce4 Ti trở lên
ATI Từ Radeon 9500 trở lên
Intel (card tích hợp) Từ Intel® GMA 3100 (chipset G31,Q33) trở lên
1.2.2. Kiến trúc tổng thể
GEM là được chia thành nhiều thành phần để tiện cho việc phát triển và bảo trì.
z
max
).
6
o Sphere: hình cầu được mô tả bởi tọa độ tâm và bán kính.
o LineSequent, Line, Ray: mô tả đoạn thẳng, đường thẳng, và tia.
o Matrix: ma trận sử dụng để biểu diễn các phép biến đổi: dịch, xoay, co
giãn trong không gian 3 chiều.
o Plane: mặt phẳng được mô tả bởi phương trình ax + by + cz + d = 0.
o Frustum: là hình chóp cụt biểu diễn khung nhìn của camera, được mô
tả bằng 6 mặt phẳng tạo nên nó.
- Các kiểu đối tượng lưu trữ:
o String: lưu trữ xâu kí tự.
o Array: mảng động có thể tùy biến với hệ số mở rộng.
o GemAllocator: thực thi cấp phát và giải phóng bộ nhớ.
o List: Danh sách liên kết hai chiều.
o Stack: đặc tả ngăn xếp.
1.2.2.2. Thành phần Giao tiếp với Hệ điều hành
Hình 4: Quá trình điều phối sự kiện
7
Giao tiếp với Hệ điều hành là thành phần thực thi các công việc cần giao tiếp
với hệ điều hành như điều phối sự kiện, đọc ghi file, lấy thời gian hệ thống… Trong đó
quan trọng nhất là quá trình điều phối sự kiện (Hình 4).
GEM lấy sự kiện từ Message System của hệ điều hành, từ đó lấy các thông tin
cần thiết tạo ra một đối tượng GemEvent - lý do cần tạo ra GemEvent là để tránh bị
phụ thuộc vào hệ điều hành. Sau đó, GemEvent sẽ được gửi lần lượt đến các thành
phần có khả năng nhận và xử lý sự kiện này.
lửa, khói… Mô đun này được trình bày chi tiết trong khóa luận “Xây dựng Game
Engine đa nền tảng – Mô phỏng tự nhiên” - Trần Thái Dương.
- Chuyển động của đối tượng là mô đun mở rộng các thành phần của Quản lý
hung cảnh, thực hiện quá trình nội suy trong các mô hình chuyển động (thường
là các nhân vật trong game) thông qua hai kĩ thuật thông dụng là keyframe và
skinning. Mô đun này được trình bày chi tiết trong khóa luận “Xây dựng Game
Engine đa nền tảng – Quản lý tài nguyền và chuyển động nhân vật” - Hoàng
Tuấn Hưng.
1.2.2.4. Các thành phần còn lại
Phát hiện va chạm và Tính toán vật lý là thành phần tính toán mô phỏng vật lí,
phát hiện va chạm giữa các vật thể và phản hồi.
Network là thành phần thực hiện việc truyền thông qua mạng TCP/IP.
Trí thông minh nhân tạo là thành phần xử lí các công việc cần trí thông minh
nhân tạo như dò đường, xử lí tình huống…
Âm thanh là thành phần xử lí âm thanh.
Các thành phần này chưa được triển khai nên chúng tôi không đề cập chi tiết
trong tài liệu này.
9
Chương 2: CƠ SỞ LÝ THUYẾT
2.1. Ánh sáng trong đồ họa máy tính
Đồ họa 3D ngoài việc sử dụng các thuật toán giống với đồ họa 2D như: đồ họa
vectơ trong mô hình khung dây (wire frame model) và đồ họa mành (raster graphics)
trong giai đoạn hiển thị cuối cùng. Bên cạnh đó, đồ họa 3D còn thực hiện chiếu sáng
bằng các mô hình tạo bóng, dựa vào các thông tin về nguồn sáng và nguyên liệu cấu
tạo nên bề mặt đối tượng, để tính toán màu sắc của đối tượng trong khung cảnh; tạo ra
hình ảnh gần với thực tế hơn (khoảng cách xa gần giữa các đối tượng, vật liệu tạo nên
đối tượng…).
2.1.2. Các mô hình tạo bóng
Mô hình tạo bóng định nghĩa cách tính toán màu sắc dựa vào thông tin về nguồn
sáng và đối tượng được chiếu sáng [7][12].
Các mô hình tạo bóng khác nhau, thì triển khai tính toán các thành phần ánh sáng
khác nhau; tạo ra các hình ảnh khác nhau với cùng một thông tin đầu vào của nguồn
sáng và đối tượng được chiếu sáng.
Hình 10: Kết quả của một số mô hình tạo bóng
12
Bên cạnh đó, việc triển khai mô hình tạo bóng dựa vào vertex hay fragment (hay
pixel) cũng tạo ra kết quả khác nhau. Với cùng một vật thể, cùng một mô hình tạo
bóng, nhưng mô hình này triển khai theo chương trình pixel thì cho kết quả tốt hơn.
Các triển khai của OpenGL đều triển khai mô hình ánh sáng Phong, và thực thi trên
chương trình vertex.
Hình 11: Kết quả của cùng một mô hình ánh sáng trên Vertex và Pixel
2.2. Đổ bóng
2.2.1. Bóng của đối tượng trong khung cảnh
Các đối tượng trong khung cảnh 3D, ngoài sự khác nhau về màu sắc của các bề
mặt so với nguồn sáng, còn có các vùng tối mà ánh sáng không chiếu đến được. Vùng
tối này gọi là bóng của vật thể.
Quá trình chiếu sáng dựa vào thực thi của OpenGL không tạo ra bóng, nên quá
trình vẽ bóng của vật thể được tính toán như một đối tượng độc lập dựa vào thông tin
về vị trí, cấu trúc (các đỉnh, cạnh và mặt của vật thể tạo bóng).
2.2.2. Phương pháp đổ bóng
Có nhiều phương pháp tạo bóng khác nhau như: bản đồ độ sâu (depth map), vùng
đổ bóng (shadow volume) …
Đổ bóng trong GEM triển khai kĩ thuật vùng đổ bóng [1][2][6].
Vùng đổ bóng (SV) là một model gồm:
phản xạ của ánh sáng.
- Áp dụng nhiều loại bề mặt cho cùng một mô hình mà không phải thiết kế
nhiều mô hình khác nhau
Hình 13: So sánh giữa sử dụng bản đồ pháp tuyến và thiết kế mô hình
Mỗi vector pháp tuyến ứng với một pixel trong ảnh bitmap. Vector pháp tuyến là
vector ba chiều <x,y,z> và khoảng giá trị của mỗi thành phần nằm trong khoảng [-1,1].
Trong khi đó, mỗi pixel trên ảnh bitmap là một bộ gồm ba thành phần <r, g, b> và
khoảng giá trị của các thành phần trong khoảng [0, 1]. Vì vậy, cần phải chuyển đổi qua
lại giữa các giá trị trong hai khoảng trên [7]:
- Công thức chuyển đổi từ vector pháp tuyến sang màu của pixel
- Công thức chuyển đổi ngược lại
2.3.3. Không gian Texture
Để triển khai kỹ thuật bump, bản đồ pháp tuyến thường được tạo ra và lưu theo
dạng bản đồ độ cao (height map) – pháp tuyến tại một điểm được tính thông qua độ
cao của các đỉnh xung quanh và bản đồ này được lưu trong không gian Texture [7].
normalComponent = 2 * (colorComponent - 0.5)
colorComponent = 0.5 * normalComponent + 0.5
15
Do đó, cần phải chuyển đổi qua lại từ không gian Texture và không gian World
[9]. Ma trận chuyển đổi TBN được định nghĩa như sau:
Với T = (T
y
B
z
N
x
N
y
N
z