1. Trang chủ
  2. » Luận Văn - Báo Cáo

LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx

55 379 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 55
Dung lượng 1,62 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Chương 3, sẽ được dành để trình bày các phương pháp triển khai các kĩ thuật được sử dụng để cung cấp khả năng mô phỏng các hiện tượng tự nhiên cho Game Engine, dựa trên mô hình quản lí

Trang 1

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Trang 2

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ

Trần Thái Dương

XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG

MÔ PHỎNG TỰ NHIÊN

KHOÁ LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY

Ngành: Công nghệ thông tin

Cán bộ hướng dẫn: ThS Vũ Quang Dũng

HÀ NỘI - 2009

Trang 3

LỜI CẢM ƠN

Trước hết tôi xin gửi lời cảm ơn chân thành tới Thạc sĩ Vũ Quang Dũng người trực tiếp hướng dẫn và giúp đỡ tôi trong suốt quá trình hoàn thành khóa luận này Tôi xin bày tỏ lòng biết ơn sâu sắc đến các thầy cô đã giảng dạy tôi trong suốt bốn năm học vừa qua, đã cung cấp cho tôi những kiến thức quý báu và phương pháp tư duy đúng đắn để tôi có thể có được nền tảng vững chắc bước đi trên con đường của mình

Tôi xin gửi lời cảm ơn tới các bạn trong nhóm làm khóa luận đã giúp đỡ tôi thực hiện khóa luận này Tôi cũng xin cảm ơn phòng thí nghiệm Toshiba đã giúp đỡ vào tạo cho tôi môi trường làm việc và học tập trong quá trình thực hiện khóa luận của mình

Và lời cuối cùng, tôi xin tỏ lòng biết ơn sâu sắc đến gia đình, bạn bè và những người thân đã luôn ở bên cạnh động viên, ủng hộ tôi trong những lúc khó khăn nhất, giúp tôi vượt qua được nhưng khó khăn trong học tập cũng như trong cuộc sống

Hà Nội, ngày 22 tháng 05 năm 2009

Sinh viên

Trần Thái Dương

Trang 4

TÓM TẮT

Ngày nay, Game Engine là thành phần không thể thiếu trong bất cứ một quy trình phát triển trò chơi điện tử nào Sức mạnh của trò chơi phụ thuộc chính vào sức mạnh của Game Engine được sử dụng để phát triển nó

Trong khóa luận này, tôi sẽ giới thiệu sơ lược kiến trúc chung của Game Engine đang được phát triển nằm trong dự án “Xây dựng Game Engine đa nền tảng” trong

chương 1 và chương 2 Chương 3, sẽ được dành để trình bày các phương pháp triển

khai các kĩ thuật được sử dụng để cung cấp khả năng mô phỏng các hiện tượng tự nhiên cho Game Engine, dựa trên mô hình quản lí khung cảnh 3D được trình bày trong khóa luận của bạn Trương Đức Phương và mô hình quản lí tài nguyên được trình bày trong khóa luận của bạn Hoàng Tuấn Hưng

Cuối khóa luận sẽ đưa ra một số thông tin chạy thử của các ứng dụng demo cho các kĩ thuật đã được triển khai Qua đó đánh giá bước đầu về hiệu quả ứng dụng của các kĩ thuật đó Cuối cùng tôi sẽ đưa ra định hướng tiếp theo sau khi hoàn thành khóa luận này

Trang 5

MỤC LỤC

Chương 1 Đặt vấn đề 2

1.1 Bối cảnh nghiên cứu 2

1.2 Mục tiêu 2

1.3 Giới thiệu chung 3

Chương 2 Kiến trúc tổng thể 4

2.1 Thành phần Các kiểu dữ liệu cơ bản 5

2.2 Thành phần Giao tiếp với hệ điều hành 6

2.3 Thành phần Render Engine 7

2.3.1 Khái quát về Render Engine 7

2.3.2 Kiến trúc của Render Engine 8

2.4 Các thành phần còn lại 9

Chương 3 Mô phỏng Tự nhiên 10

3.1 Khái Quát 10

3.2 Mô phỏng mặt nước 11

3.2.1 Thiết kế cơ bản 11

3.2.2 Thiết kế chức năng 14

3.2.3 Triển khai lớp đề xuất: 21

3.3 Hệ thống hạt 24

3.3.1 Thiết kế cơ bản 25

3.3.2 Thiết kế chức năng 26

3.3.3 Triển khai lớp đề xuất 28

3.4 Địa hình 31

3.4.1 Thiết kế cơ bản 33

3.4.2 Thiết kế chức năng 34

3.4.3 Triển khai lớp đề xuất 38

Chương 4 Kết luận 42

4.1 Kết quả 42

4.1.1 Mô phỏng mặt nước 42

4.1.2 Hệ thống hạt 43

4.1.3 Địa hình 44

4.2 Hướng phát triển 44

Trang 6

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ể 4

Hình 3: Sơ đồ 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 event 7

Hình 5: Kiến trúc phân tầng của Render Engine 8

Hình 6: Biểu đồ gói của Render Engine 8

Hình 7: Sơ đồ lớp cơ bản của package Mô phỏng Mặt Nước 12

Hình 8: Quá trình hoạt động của package Mô Phỏng Mặt Nước 13

Hình 9: Sơ đồ luồng thực hiện chức năng Tiền khởi tạo 14

Hình 10: Sơ đồ luồng thực hiện việc khởi tạo đối tượng WaterSceneNode 16

Hình 11: Sơ đồ tạo hiệu ứng tăng giảm cường độ sóng theo thời gian 17

Hình 12: Quá trình render normal map 18

Hình 13: Sơ đồ hoạt động của chương trình Render mặt nước 20

Hình 14: Sơ đồ lớp WaterParameters 21

Hình 15: Sơ đồ triển khai lớp WaterEffect 22

Hình 16: Sơ đồ triển khai lớp WaterSceneNode 23

Hình 17: Thiết kế lớp cơ bản của hệ thống hạt 25

Hình 18: Sơ đồ thực hiện chức năng Khởi tạo đối tượng ParticleSystemSceneNode 26

Hình 19: Sơ đồ cập nhật vị trí hạt 27

Hình 20: Sơ đồ hoạt động của chức năng Render Hệ thống hạt 28

Hình 21: Sơ đồ triển khai Lớp ParticleParameters 28

Hình 22: Sơ đồ triển khai lớp ParticleEffect 29

Hình 23: Sơ đồ quan hệ Lớp mô đun Hệ thống hạt 31

Hình 24: Kiến trúc cơ bản của mô đun Địa hình 33

Hình 25: Sơ đồ hoạt động của mô đun Địa hình 34

Hình 26: Luồng thực hiện chức năng khởi tạo 35

Hình 27: Sơ đồ hoạt động của chức năng Cập nhật Clipmap 36

Hình 28: Sơ đồ hoạt động chương trình Render Block 37

Hình 29: Triển khai Lớp TerrainParameters 38

Hình 30: Lớp TerrainEffect 39

Hình 31: Sơ đồ lớp TerrainSceneNode và các lớp thành phần 40

Hình 32: Hình ảnh demo hệ thống hạt 43

Hình 33: Hình ảnh chương trình demo Mô phỏng mặt nước 45

Trang 7

Bảng thuật ngữ và các kí hiệu viết tắt (nếu có)

Animated Mesh Là một mesh được dùng để mô tả các đối

tượng chuyển động

Bounding box Hình hộp bé nhất chứa trọn vẹn đối tượng

3D Bounding Sphere Hình cầu bé nhất chứa trọn vẹn đối tượng

3D clip space không gian tọa độ vertex được chiếu lên bởi

camera clipmap là phương pháp lưu trữ tạm thời một bộ

phận của nguồn dữ liệu có kích thước lớn Cube Map Là tập hợp 6 texture 2D được xếp liên tục

trong 6 mặt của hình hộp Environment Map Là texture lưu trữ thông tin về ánh sáng

phản xạ từ môi trường Thường có dạng cubemap

event Là đơn vị truyền thông liên tiến trình được

gửi đến bởi Hệ điều hành fragment program chương trình shader xử lí các biến đổi đối

với mỗi pixel

Graphic Processor Unit Đơn vị xử lí đồ họa, có nhiệm vụ render ra

màn hình hình ảnh 3D

GPU

heightfield mảng lưu trữ giá trị độ cao

heightmap texture lưu trữ giá trị độ cao của bề mặt địa

hình local space không gian riêng của đối tượng 3D

Massively Multiplayer

Online Role-Playing Game

Trò chơi nhập vai trực tuyến nhiều người chơi

MMORPG

Mesh Mạng lưới các đa giác dùng để mô tả hình

dạng của vật thể trong không gian 3 chiều

Message System Là hệ thống quản lí các thông điệp trao đổi

giữa các tiến trình của Hệ điều hành normal map texture lưu giữ các giá trị các vector pháp

tuyến trên bề mặt

Trang 8

offscreen render render nhưng hình ảnh được tạo ra không

được vẽ lên màn hình Render Tái tạo hình ảnh phản chiếu 2D của đối

tượng 3D trong camera

shader Là tập các chỉ lệnh cho GPU được dùng để

render các hiệu ứng shading language ngôn ngữ được dùng để triển khai shader

cho GPU Texture Các bức ảnh được dùng để dán lên các đối

tượng 3D nhằm làm tăng độ chi tiết cho đối tượng

vertex program chương trình shader xử lí các biến đổi đối

với vertex

View Frustum Trường quan sát của camera

View frustum culling Thực hiện cắt bỏ các đối tượng nằm ngoài

vùng quan sát của camera world space không gian thế giới trong OpenGL

Trang 9

Mở đầu

Hiện nay, cùng với sự phát triển của ngành công nghiệp phần mềm, quy trình phát triển game cũng đã thay đổi rất nhiều Thay vì phát triển các game dựa trên các giao diện lập trình đồ họa 3D cấp thấp, người ta thường phát triển Game Engine như là một hệ thống phần mềm trung gian cho quy trình phát triển game

Thực tế, ngành công nghiệp phát triển game không chỉ đem lại lợi ích lớn về kinh

tế cho các công ty phát hành game mà nó còn thúc đẩy sự phát triển của phần mềm cũng như phần cứng máy tính Đặc biệt là nó thúc đẩy sự phát triển của các kĩ thuật xử

lí tái tạo thực tại ảo trở nên chân thực hơn và được ứng dụng rộng rãi trong các lĩnh vực khác của đời sống xã hội như giáo dục, y tế

Ở Việt Nam hiện nay, MMORPG đang bùng nổ mạnh mẽ với số lượng người chơi đông đảo và thu hút người chơi ở nhiều đối tượng, lứa tuổi khác nhau Tuy nhiên, người chơi vẫn thường phải chơi game được phát hành bởi các công ty nước ngoài hoặc game được phát hành bởi các công ty trong nước được phát triển bởi các công ty nước ngoài Vì vậy nhóm chúng tôi đã bắt đầu thực hiện việc tìm hiểu và xây dựng một Game Engine dành cho việc phát triển MMORPG với mục tiêu mong muốn dần làm chủ được công nghệ xây dựng và phát triển game

Để mô phỏng khung cảnh ngoài trời của game, Game Engine phải cung cấp khả năng mô phỏng lại các hiện tượng tự nhiên đáp ứng thời gian thực Vì đòi hỏi đó, tôi

đã thực hiện khóa luận này với mục đích xây dựng mô đun Mô phỏng Tự nhiên trong

dự án “Xây dựng Game Engine đa nền tảng”

Tuy nhiên, vì giới hạn về thời gian và kiến thức, hiện tại trong khóa luận này tôi

sẽ chỉ diễn giải các phương pháp triển khai các kĩ thuật mô phỏng địa hình, mặt nước

và hệ thống hạt Với các chức năng đó, ta có thể tạo ra được khung cảnh 3D ngoài trời đơn giản từ

Hai chương đầu của khóa luận dành để giới thiệu chung về Game Engine và kiến trúc tổng thể của nó Nội dung chính phương pháp triển khai các kĩ thuật trong mô đun

Mô phỏng Tự nhiên sẽ được trình bày chi tiết trong chương 3 của khóa luận này

Trang 10

Chương 2 Đặt vấn đề

2.1 Bối cảnh nghiên cứu

Ngành công nghiệp phát triển game trên thế giới đang phát triển như vũ bão Cách đây 20 năm, game rất đơn giản và chỉ cần một người hoặc một nhóm nhỏ người phát triển nhưng ngày nay, các game hiện đại với đồ họa và khả năng tương tác ấn tượng thường được phát triển bởi một đội ngũ đông đảo người thiết kế game, lập trình viên, nghệ sĩ… trong thời gian ròng rã từ một đến ba năm Chính việc game ngày càng trở nên phức tạp như vậy nên hiện nay, các game thương mại không còn phát triển từ nguyên thủy nữa mà được phát triển lên từ game engine Game engine hỗ trợ việc xây dựng game một cách nhanh chóng, đơn giản hơn đồng thời cung cấp khả năng tái sử dụng code cao do có thể phát triển nhiều game từ một game engine

Ở Việt Nam, Game online mới chỉ thực sự thâm nhập vào thị trường cách đây 6 năm nhưng chỉ trong khoảng thời gian ít ỏi đó, chúng ta đã có một số lượng nhà phát hành game lên tới con số hàng chục, số game được phát hành cũng tương ứng với số lượng đó Nhưng theo như chúng tôi được biết, gần như tất cả các game online đang được phát hành ở Việt Nam là được 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ố game nhỏ chơi trên web như đánh bài, đánh cờ ) Một câu hỏi mà có lẽ tất cả những người chơi game đều trăn trở là “bao giờ mới được chơi game Việt Nam?”

Chúng tôi chọn đề tài này làm khóa luận tốt nghiệp không phải với một tham vọng quá lớn, chỉ là muốn đi những bước chân 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

2.2 Mục tiêu

Xây dựng một Game Engine đa nền có thể chạy trên nhiều hệ điều hành khác nhau, hướng đến phân khúc phát triển game nhập vai trực tuyến (MMORPG) Game

Engine này được đặt tên là GEM Đây là mục tiêu dài hạn, còn hiện tại, do thời gian

làm luận văn chỉ khoảng 5 tháng nên nhóm chúng tôi chỉ tập trung hoàn thiện thành phần Render Engine trong Game Engine (Xem chi tiết ở chương 2)

Trang 11

2.3 Giới thiệu chung

Như đã giới thiệu ở trên, Game Engine là một lớp trung gian giữa game và nền tảng bên dưới, các thư viện lập trình cấp thấp GEM là một game engine nên dĩ nhiên

nó cũng tuân thủ theo nguyên tắc này

Đặc điểm đầu tiên của GEM là khả năng chạy đa nền Để đạt được điều đó, GEM

sử dụng các bản build trên các nền tảng khác nhau (không 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 abstract – vì việc này sẽ làm giảm hiệu suất

chương trình đáng kể Error! Reference source not found Cũng vì lí đo chạy đa nền

nên hiện tại chúng tôi sử dụng 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

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 Đa số các Game Engine trên thế giới hiện nay đều được phát triển bằng ngôn ngữ C++

Chúng tôi thiết kế GEM nhắm đến phân khúc phát triển MMORPG, nên khả năng tương thích với một phạm vi rộng cấu hình phần cứng là một điều kiện quan trọng Mục tiêu thiết kế GEM là hoạt động được trên các GPU hỗ trợ openGL 1.4 và shader 1.0 trở lên

Bảng 1: Bảng GPU tối thiểu được hỗ trợ

Trang 12

ATI Từ Radeon 9500 trở lên

Intel ( card tích hợp ) Từ Intel® GMA 3100 ( chipset G31,Q33) trở lên

Chương 3 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ì

Cụ thể GEM gồm các thành phần như sau:

Ghi chú : Do thời gian làm luận văn có hạn, chúng tôi mới chỉ hoàn thành những

thành phần sau: Giao tiếp với hệ điều hành, Các kiểu dữ liệu cơ bản, Render Engine

Những thành phần này đủ để hỗ trợ người sử dụng tạo ra các khung cảnh 3D và tương

Hình 2: Kiến trúc tổng thể

Trang 13

tác với chúng

3.1 Thành phần Các kiểu dữ liệu cơ bản

Các kiểu dữ liệu cơ bản là thành phần bao gồm các cấu trúc dữ liệu cơ bản như

mảng động, vector, ma trận…, các phép toán trên các kiểu dữ liệu đó cung cấp cho thành phần khác sử dụng

Các kiểu dữ liệu này có thể chia thành 2 nhóm chính:

1 Các yếu tố không gian 3D

‒ Vector2, Vector, Vector4 : các loại vector biểu diễn tọa độ 2 chiều, 3 chiều và tọa độ đồng nhất

Hình 3: Sơ đồ lớp của thành phần Các kiểu dữ liệu cơ bản

Trang 14

‒ Aabb (Axis aligned bounding box) : hình hộp chữ nhật có các cạnh dọc theo 3 trục xyz, được mô tả bằng 2 điểm (xmin, ymin, zmin ), ( xmax, ymax,

zmax )

‒ Sphere : hình cầu, được mô tả bởi tọa độ tâm và bán kính

‒ LineSequent, Line, Ray : đoạn thẳng, đường thẳng, tia

‒ Matrix : ma trận sử dụng để thực hiện các phép biến đổi trong không gian 3 chiều

‒ Plane : mặt phẳng được mô tả bằng các hệ số của phương trình: ax +

by + cz + d = 0

‒ 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ó

2 Các kiểu đối tượng lưu trữ

‒ String : lớp lưu trữ dữ liệu kiểu xâu kí tự

‒ Array : mảng động với hệ số mở rộng có thể tùy biến

‒ GemAllocator : sử dụng bởi các lớp khác để thực thi việc cấp phát và giải phóng bộ nhớ

‒ List : danh sách liên kết 2 chiều

‒ Stack : ngăn xếp

3.2 Thành phần Giao tiếp với hệ điều hành

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 event, đọ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 event:

GEM lấy event 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 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ý event (Hình 4)

Trang 15

3.3 Thành phần Render Engine

3.3.1 Khái quát về Render Engine

Render Engine là thành phần cốt lõi của một Game Engine Nó hỗ trợ người lập

trình game các công việc thiết yếu để tạo ra một khung cảnh 3D Người dùng sẽ không cần biết nhiều đến những công việc tầng thấp như quá trình đọc file tài nguyên, sử dụng 3D Graphic API, triển khai các hiệu ứng trên GPU… mà chỉ cần dùng giao diện

do Render Engine cung cấp

Render Engine là thành phần duy nhất trong Game Engine giao tiếp với các thư

viện đồ họa cấp thấp (cụ thể ở đây là openGL và Cg - Hình 5)

Hình 4: Quá trình điều phối event

Trang 16

3.3.2 Kiến trúc của Render Engine

Render engine được chia thành các mô đun sau (Hình 6):

‒ Graphic Driver là mô đun duy nhất trực tiếp sử dụng 3D Graphic API

(openGL), cung cấp cho các mô đun khác một giao diện đơn giản hơn để tương tác với thiết bị xử lí đồ họa

‒ Quản lý tài nguyên là mô đun quản lý các tài nguyên cần thiết để xây dựng

Hình 6: Biểu đồ gói của Render Engine

Hình 5:

Kiến trúc phân tầng của Render Engine

Trang 17

một khung cảnh 3D như mesh, animated mesh, texture 2D, cubemap… Mô đun này được bạn Hoàng Tuấn Hưng trình bày 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 đối tượng”

‒ Quản lý khung cảnh là mô đun thực hiện việc tổ chức và kiểm soát các đối

tượng tồn tại trong một khung cảnh 3D, từ đó thực hiện quá trình render toàn

bộ khung cảnh đó tạo nên hình ảnh 2D tại vị trí nhìn Mô đun này được bạn Trương Đức Phương 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í khung cảnh”

‒ Hiệu ứng ánh sáng và vật liệu là mô đun mở rộng các thành phần của

Quản lý khung cảnh để tạo các hiệu ứng về ánh sáng, vật liệu, và đổ bóng

Mô đun này được bạn Bùi Hoàng Khánh trình bày chi tiết trong khóa luận

“Xây dựng Game Engine đa nền tảng – Hiệu ứng ánh sáng và vật liệu”

‒ Mô phỏng tự nhiên là mô đun mở rộng các thành phần của Quản lý khung

cảnh để mô phỏng các yếu tố tự nhiên cần có trong game như nước, địa hình,

lửa, khói… Mô đun này sẽ được trình bày chi tiết trong chương 3 của khóa

luận này

‒ 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ý khung 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 đối tượng” của Hoàng Tuấn Hưng

3.4 Các thành phần còn lại

Các thành phần Mạng, Trí tuệ nhân tạo, Tính toán vật lí, Âm thanh chưa được

triển khai nên chúng tôi không đề cập đến trong tài liệu này

Trang 18

Chương 4 Mô phỏng Tự nhiên

4.1 Khái Quát

Mô phỏng tự nhiên là một nhiệm vụ hết sức cơ bản và cũng đóng vai trò rất quan trọng trong các trò chơi 3D hiện nay Nhiệm vụ của mô đun này là hỗ trợ việc tạo ra các đối tượng đặc biệt trong khung cảnh 3D – các đối tượng tự nhiên như là nước, lửa, khói, bụi, mưa, địa hình, cây cỏ … Các đối tượng này thường xuất hiện trong các khung cảnh ngoài trời Vì vậy đây là phần không thể thiếu được trong bất kì một game 3D nào có khung cảnh ngoài trời Vì thời gian không cho phép nên mục tiêu ban đầu của chúng tôi là triển khai kĩ thuật mô phỏng mặt nước, địa hình và hệ thống hạt – hệ thống cơ bản được sử dụng để mô phỏng mưa, bụi, khói, lửa, Với những hiệu ứng

cơ bản này ta đã có thể tạo ra được một khung cảnh 3D ngoài trời đơn giản

Hiệu ứng cho các đối tượng ở đây được triển khai chủ yếu sẽ thực thi bằng GPU

để giảm gánh nặng cho CPU, nơi mà các công việc của những phần sau này của hệ thống vốn sẽ tốn rất nhiều tài nguyên CPU ( đặc biệt quá trình tính toán và xử lí vật lí ) Vì vậy, để triển khai nó chúng ta cần phải lựa chọn một ngôn ngữ lập trình thích hợp cho GPU Các tiêu chí được đưa ra để lựa chọn là:

‒ ngôn ngữ lập trình bậc cao, dễ hiểu và triển khai hiệu quả

Như đã nói ở trên mô đun này hiện tại có 3 mô đun con độc lập:

‒ Mô phỏng mặt nước: triển khai kĩ thuật mô phỏng mặt nước từ mô hình vật

lí Error! Reference source not found

‒ Hệ thống hạt: mô phỏng các hiện tượng như mưa, lửa, vụ nổ, pháo hoa, khói, tuyết, hay các hiệu ứng thị giác như phép thuật

‒ Địa hình: render địa hình có ứng dụng kĩ thuật LOD

Trang 19

máy tính cá nhân, với điều kiện kích thước vùng nước không quá lớn Error! Reference source not found Tuy nhiên để triển khai việc mô phỏng mặt nước trong

Game Engine, ta cần có kĩ thuật đơn giản để có thể triển khai trên GPU Vì với ứng dụng mô phỏng lớn như các trò chơi 3D, thì ngoài việc mô phỏng được hình ảnh 3D bạn còn phải cần thực hiện rất nhiều tính toán khác như xử lí vật lí, trí tuệ nhân tạo Các thành phần này đã chiếm một lượng lớn tài nguyên của CPU và bộ nhớ máy tính

Vì vậy mô đun này sẽ thực hiện việc triển khai kĩ thuật mô phỏng mặt nước từ

mô hình vật lí được giới thiệu chi tiết trong tài liệu Error! Reference source not found Tư tưởng chính của kĩ thuật này là sử dụng mô hình vật lí là:

‒ Tính toán các sóng lan truyền trên bề mặt theo điều kiện thời tiết (gió)

‒ Tổng hợp các sóng để tính độ cao của bề mặt và normal map

‒ Tính độ trong suốt nước phụ thuộc vào độ sâu nước và ánh sáng phản xạ từ environment map

Như vậy, sau khi render ta có được hình ảnh sóng nước trên bề mặt chuyển động phụ thuộc vào điều kiện thời tiết và tính chất của vùng nước (nông, sâu) và môi trường xung quanh

4.2.1 Thiết kế cơ bản

Mô đun sẽ được triển khai thành 3 class ( xem Hình 7 ):

‒ WaterEffect: lớp trực tiếp quản lí và có nhiệm vụ là tầng giao tiếp với các chương trình Cg của hiệu ứng mặt nước Thừa kế từ lớp Effect, các đối tượng của lớp sẽ được lưu trữ và quản lí bởi EffectBank thuộc package Quản Lí Tài Nguyên( Chi tiết về cách thức lưu trữ và quản lí xem trong tài

liệu Quản Lí Tài Nguyên – Hoàng Tuấn Hưng)

‒ WaterParameters: lớp này lưu trữ các tham số sẽ được truyền cho các

Trang 20

chương trình Cg Các tham số này quyết định tính chất mặt nước sẽ được render bởi chương trình Cg Ví dụ như khoảng bước sóng, tỉ lệ của bước sóng và biên độ, độ dốc của sóng, tính phản xạ ánh sáng

‒ WaterSceneNode: lớp mở rộng của lớp SceneNode để được gắn vào

scenegraph của hệ thống RenderEngine Lớp này sẽ chứa một đối tượng

WaterParameters để lưu trữ các tham số đầu vào cho chương trình Cg

(Thông tin chi tiết về SceneNode và SceneGraphManager có thể xem trong tài liệu Quản Lí Khung Cảnh – Trương Đức Phương)

Thêm nữa, chúng ta phải triển khai 2 chương trình Cg:

‒ NormProg: chương trình render normalmap của mặt nước Các hàm sóng

truyền cho chương trình là các hàm sóng riêng và độc lập so với các hàm sóng tạo nên chuyển động sóng trong chương trình WaterSim

‒ WaterSim: chương trình render mặt nước dựa trên bốn hàm sóng và

normalmap đã được tính trước của bề mặt Các hàm sóng truyền cho chương trình đã được tạo ngẫu nhiên trước bởi CPU trong lớp WaterEffect dựa trên Hình 7: Sơ đồ lớp cơ bản của package Mô phỏng Mặt Nước

Trang 21

những ràng buộc về tính chất của mặt nước như khoảng bước sóng, độ dốc, mức độ phản xạ ánh sáng, Các ràng buộc này được thiết lập cho đối tượng WaterSceneNode và lưu trữ trong đối tượng WaterParameters

Với mô hình như trên, mô đun sẽ hoạt động cơ bản như sau:

‒ Bước 1: tạo ra RenderContext cho

renderList của WaterSceneNode và

WaterEffect Mọi đối tượng

WaterSceneNode đều được gắn vào

renderList này và sử dụng

WaterEffect để render với tham số

của mình

‒ Bước 2: khởi tạo đối tượng

WaterSceneNode Trong đó nhiệm

vụ chủ yếu là gắn đối tượng vào

renderList và khởi tạo tham số cho

ràng buộc cho WaterEffect

‒ Bước 3: Tạo ngẫu nhiên các hàm

sóng dựa trên các tham số ràng

buộc Song song với việc tạo sóng,

ta cũng phải triệt tiêu dần các hàm

sóng theo thời gian Rồi tái tạo lại

sóng mới khi một sóng bị triệt tiêu hoàn toàn

‒ Bước 4: render normal map ra texture với các hàm sóng đã tạo bởi chương

trình Cg NormProg

‒ Bước 5: render mặt nước với các hàm sóng và normalmap texture đã tạo

Quá trình render được thực hiện bởi chương trình WaterSim viết bằng Cg

Quay lại bước 3

Như vậy sau khi kết thúc bước 5, ta có một hình ảnh mặt nước tại một thời điểm Quá trình lặp từ bước 3 đến bước 5 sẽ cho ta một hình ảnh mặt nước động với các tính chất đã được xác định ban đầu

Hình 8: Quá trình hoạt động của package Mô Phỏng Mặt Nước

Trang 22

4.2.2 Thiết kế chức năng

Dựa trên mô hình cơ bản ở trên, ta cần thiết kế các chức năng sau:

‒ Tiền khởi tạo: tạo RenderContext và WaterEffect

‒ Khởi tạo: khởi tạo đối tượng WaterSceneNode và đặt các tham số cho WaterEffect

‒ Tạo sóng: tạo các ngẫu nhiên sóng từ các tham số ràng buộc

‒ Render normalmap: render normalmap ra texture

‒ Render mặt nước: render mặt nước với thông số về sóng, và normal map đã tính trước

Tiền khởi tạo

Chức năng này được thiết kế thực thi theo sơ đồ luồng như sau:

Theo sơ đồ trong Hình 9, bước đầu tiên ta phải tạo ra rendercontext và đặt các cờ trạng thái thích hợp cho quá trình render đối tượng WaterSceneNode Việc tiếp theo là tạo ra WaterEffect để render WaterSceneNode Sau đó gắn effect này vào effectBank trong scenegraphmanager Việc lưu trữ và quản lí effect hoàn toàn được kiểm soát bởi effectBank (mô đun Quản lí Tài Nguyên) Do đó ta chỉ cần lưu lại ID của effect để có

Hình 9: Sơ đồ luồng thực hiện chức năng Tiền khởi tạo

Trang 23

thể truy cập khi cần Sau cùng, ta phải gắn RenderContext đã tạo vào render list trong scenegraphmanager Việc render list nào được gán sẽ được quyết định bởi người lập trình khi viết chương trình 3D Đồng thời chỉ số của render list đó

Chú ý, vì tất cả các đối tượng WaterSceneNode đều sử dụng chung một đối tượng RenderContext và WaterEffect nên việc lưu trữ chỉ số của render list hay WaterEffect ở trong mỗi đối tượng WaterSceneNode là không cần thiết Ta có thể đưa các thuộc tính này trở thành thành phần thuộc lớp thay vì thuộc tính riêng của từng đối tượng Do đó hàm thực hiện chức năng này cũng thuộc lớp và cần được gọi trước khi tạo ra các đối tượng WaterSceneNode thực sự

Khởi tạo

Các bước chính để khởi tạo một đối tượng WaterSceneNode là:

‒ Bước 1: gắn node vào water render list được xác định trong quá trình tiền khởi tạo

‒ Bước 2: khởi tạo đối tượng WaterParameters với các tham số mặc định

‒ Bước 3: khởi tạo các sóng từ các tham số mặc định Và bắt đầu quá trình cập nhật các tham số của sóng theo thời gian

Ngoài các bước chính như phân tích trên, trong sơ đồ (Hình 10) ta có thêm một

‒ Khởi tạo các texture để thực hiện offscreen render – dùng trong render normal map

Trang 24

Như vậy, sau khi tạo xong một đối tượng WaterSceneNode Thì đối tượng đó đã sẵn sàng để được render trong khung cảnh 3D

Tạo sóng

Đây là chức năng tạo ra các hàm sóng ngẫu nhiên theo các ràng buộc là các tham

số trong WaterParameters Ngoài ra nó còn đảm nhận việc triệt tiêu dần các sóng theo thời gian và tạo lại sóng mới khi một sóng đã hết thời gian sống và bị triệt tiêu hoàn toàn Sóng mới được tạo ra vẫn phải được tuân theo ràng buộc như các tham số ban đầu

Trạng thái một sóng có thể được đặc tả bởi các thông số sau:

Trang 25

Để tạo ra các sóng ngẫu nhiên, trong các tham số cho hiệu ứng thay vì lưu trữ các giá trị chính xác của sóng, ta lưu trữ các tham số ràng buộc miền giá trị như bước sóng lớn nhất (Lmax) và bước sóng nhỏ nhất (Lmin)

Để tạo ra các sóng khác nhau nhưng có cùng dáng điệu ta sẽ thể hiện biên độ của sóng theo một hệ số tỉ lệ cố định giữa biên độ và bước sóng

Ngoài ra để tạo ra sự khác biệt về phương truyền sóng, ta còn lưu trữ thêm một tham số lưu trữ góc lệch tối đa so với hướng gió

V

ới các tham

số như trên ta

có thể tính ra tất cả các thông

số trạng thái của sóng với hệ

số ngẫu nhiên được sinh trong khoảng

từ [0 1] với mỗi lần tạo sóng Thêm nữa để tạo hiệu ứng sóng tăng dần khi mới được sinh ra rồi bị triệt tiêu dần khi đạt đến mức cao nhất Ta có thông số về cường độ sóng

F được khởi tạo với giá trị 0, sóng đạt cực đại khi F = 1 Và một tham số đặc trưng cho tốc độ thay đổi cường độ sóng sau mỗi khung hình, kí hiệu là T Ngoài ra, ta còn thêm

Hình 11: Sơ đồ tạo hiệu ứng tăng giảm cường độ sóng theo thời gian

Trang 26

một tham số là Idx xác định chỉ số sóng đang thay đổi Vì ta sẽ thay đổi lần lượt cường

độ từng sóng Quá trình thực hiện xem Hình 11

Render normalmap

Được thực hiện bởi chương trình viết bằng ngôn ngữ Cg và xử lí qua GPU Nhiệm vụ của nó là render normal map từ các tham số đầu vào và hai texture là BiasNoise và CosineLUT

CosineLUT là texture lưu trữ giá trị tính trước của

hàm sốsin 2 u k− 1 cos 2 u Việc tính trước giá trị hàm

số này sẽ tiết kiệm rất nhiều phép tính trong các chương

trình Cg Nơi mà mỗi một phép tính thừa sẽ khiến chương

trình chạy chậm đi rất nhiều do, mỗi chương trình xử lí

pixel được gọi n lần với n là số pixel cần được render Hơn

nữa đây chỉ là chương trình render normalmap, mục đích

chính là tính ra vector normal với mỗi khung hình Cho nên

cần phải giảm thời gian xử lí để tính ra vector normal nhanh

nhất có thể Để cung cấp vector normal cho chương trình

render chính sử dụng

BiasNoise là texture lưu trữ các giá trị ngẫu nhiên

trong khoảng [0 1] Các giá trị này được cộng thêm vào

vector normal để tạo ra bức ảnh không quá láng mịn Nó có

thể tăng thêm độ chi tiết và đem lại cảm giác thật hơn

Theo kĩ thuật được giới thiệu trong sách GPU

GemsError! Reference source not found. ta sẽ sử dụng 16 sóng cho

texture vì để tối ưu cho tính toán ta sẽ quá trình xử lí của

chương trình Cg làm 5 giai đoạn Bốn giai đoạn đầu, mỗi

giai đoạn xử lí 4 sóng Để cộng gộp giá trị tính toán ta xử

dụng phương pháp trộn màu giữa các giai đoạn Giai đoạn cuối là cộng giá trị noise (xem Hình 12)

Lưu ý là, chương trình render normal sẽ không render hình ảnh vector normal mà

nó render ra một texture Texture này được sử dụng như là tham số đầu vào và được truy cập bởi chương trình vẽ mặt nước

Hình 12: Quá trình render normal map

Trang 27

Render mặt nước

Đây là chức năng chính có nhiệm vụ render ra màn hình hình ảnh 3D của mặt nước Chức năng này cũng được thực hiện bởi chương trình Cg chạy trong GPU So với chương trình render normalmap thì chương trình này sẽ chỉ chạy một lần vì số sóng được sử dụng để tổng hợp là ít hơn chỉ có 4 sóng Các dữ liệu có thể được gói chung vào trong các vector-4 chiều, để lợi dụng các phép toán vector được hỗ trợ bởi GPU

Chương trình xử lí vertex phải thực hiện những việc sau (xem Hình 13):

‒ Chuyển tọa độ vertex từ local space sang world space Vì các tính toán trong chương trình đều tính trong world space

‒ Tính tọa độ texture uv của normal texture

‒ Tính hệ số lọc theo độ sâu Hệ số này được dùng để lọc hay giảm bớt biên

độ sóng ở vùng nước nông

‒ Tính lại tọa độ vertex bằng cách lấy tổng của các hàm sóng

‒ Tính vector nhìn – vector từ mắt đến vertex Vector này được truyền cho fragment program để tính tia sáng đến

‒ Tính ma trận chuyển vector normal sang không gian world Vì vector normal đã tính ở bước trên là tọa độ trong không gian uv của texture

‒ Tính tọa độ cuối cùng của vertex ( trong không gian Clip )

‒ Tính lại màu nước theo độ sâu và truyền cho fragment program

Ngày đăng: 28/06/2014, 01:20

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[2] Mark Finch of Cyan Worlds. Chapter 1. “Effective Water Simulation from Physical Models” – GPU Gems, Addison-Wesley, 2004 Sách, tạp chí
Tiêu đề: Effective Water Simulation from Physical Models
[3] Tessendorf, Jerry. 2001. "Simulating Ocean Water." In Proceedings of SIGGRAPH 2001 Sách, tạp chí
Tiêu đề: Simulating Ocean Water
[4] A. Asirvatham, H. Hoppe. Chapter 2. “Terrain rendering using GPU-based geometry clipmaps” – GPU Gems 2, R. Fernando, eds., Addison-Wesley, March 2005 Sách, tạp chí
Tiêu đề: Terrain rendering using GPU-based geometry clipmaps
[5] Losasso, Frank, and Hugues Hoppe. 2004. "Geometry Clipmaps: Terrain Rendering Using Nested Regular Grids." ACM Transactions on Graphics (Proceedings of SIGGRAPH 2004) 23(3), pp. 769–776 Sách, tạp chí
Tiêu đề: Geometry Clipmaps: Terrain Rendering Using Nested Regular Grids
[6] Mark Duchaineau, Murray Wolinsky, David E. Sigeti, Mark C. Miller, Charles Aldrich, Mark B. Mineev-Weinstein. “ROAMing Terrain: Real-time Optimally Adapting Meshes”. 1997 Sách, tạp chí
Tiêu đề: ROAMing Terrain: Real-time Optimally Adapting Meshes
[7] The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics [8] Gerasimov, Philip, Randima Fernando, and Simon Green. 2004. "ShaderModel 3.0: Using Vertex Textures." NVIDIA white paper DA-01373-001_v00, June 2004 Sách, tạp chí
Tiêu đề: Shader Model 3.0: Using Vertex Textures
[1] Karel Driesen and Urs Hửlzle, The Direct Cost of Virtual Function Calls in C++, 1995 ACM Khác

HÌNH ẢNH LIÊN QUAN

Bảng thuật ngữ và các kí hiệu viết tắt (nếu có) - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Bảng thu ật ngữ và các kí hiệu viết tắt (nếu có) (Trang 7)
Bảng 1: Bảng GPU tối thiểu được hỗ trợ - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Bảng 1 Bảng GPU tối thiểu được hỗ trợ (Trang 11)
Hình 3: Sơ đồ lớp của thành phần Các kiểu dữ liệu cơ bản - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 3 Sơ đồ lớp của thành phần Các kiểu dữ liệu cơ bản (Trang 13)
Hình 4: Quá trình điều phối event. - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 4 Quá trình điều phối event (Trang 15)
Hình 7: Sơ đồ lớp cơ bản của package Mô phỏng Mặt Nước - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 7 Sơ đồ lớp cơ bản của package Mô phỏng Mặt Nước (Trang 20)
Hình 8: Quá trình hoạt động của  package Mô Phỏng Mặt Nước. - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 8 Quá trình hoạt động của package Mô Phỏng Mặt Nước (Trang 21)
Hình 9: Sơ đồ luồng thực hiện chức năng Tiền khởi tạo - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 9 Sơ đồ luồng thực hiện chức năng Tiền khởi tạo (Trang 22)
Hình 10: Sơ đồ luồng thực hiện việc khởi tạo đối tượng WaterSceneNode - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 10 Sơ đồ luồng thực hiện việc khởi tạo đối tượng WaterSceneNode (Trang 24)
Hình 11: Sơ đồ tạo hiệu ứng tăng giảm cường độ sóng theo thời gian - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 11 Sơ đồ tạo hiệu ứng tăng giảm cường độ sóng theo thời gian (Trang 25)
Hình 12: Quá trình  render normal map - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 12 Quá trình render normal map (Trang 26)
Hình 13: Sơ đồ hoạt động của chương trình Render mặt nước - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 13 Sơ đồ hoạt động của chương trình Render mặt nước (Trang 28)
Hình 14: Sơ đồ lớp WaterParameters - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 14 Sơ đồ lớp WaterParameters (Trang 29)
Hình 15: Sơ đồ triển khai lớp WaterEffect - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 15 Sơ đồ triển khai lớp WaterEffect (Trang 30)
Hình 17: Thiết kế lớp cơ bản của hệ thống hạt - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 17 Thiết kế lớp cơ bản của hệ thống hạt (Trang 33)
Hình 18: Sơ đồ thực hiện chức  năng Khởi tạo đối tượng  ParticleSystemSceneNode - LUẬN VĂN: XÂY DỰNG GAME ENGINE ĐA NỀN TẢNG MÔ PHỎNG TỰ NHIÊN docx
Hình 18 Sơ đồ thực hiện chức năng Khởi tạo đối tượng ParticleSystemSceneNode (Trang 34)

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm