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ỤC LỤC

LỜI CẢM ƠN . . . i

TÓM TẮT . . . . ii

MỤC LỤC . . . . iii

BẢNG CÁC TỪ VIẾT TẮT . . . v

DANH MỤC HÌNH VẼ . . . vi

DANH MỤC BẢNG BIỂU . . . viii

MỞ ĐẦU . . . . 1

Chương 1: TỔNG QUAN VỀ GEM . . 3

1.1. Khái niệm Game Engine . 3

1.2. Mô hình của GEM . 3

1.2.1. Các đặc điểm của GEM . 3

1.2.2. Kiến trúc tổng thể . 4

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

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

5.1. Thực nghiệm chương trình . 34

5.1.1. Phương pháp đánh giá . 34

5.1.2. Kết quả đánh giá . 34

5.2. Demo chương trình . 35

KẾT LUẬN . . . 37

Kết luận . 37

Hướng phát triển . 37

PHỤ LỤC . . . . 38

TÀI LIỆU THAM KHẢO . . . a

pdf51 trang | Chia sẻ: maiphuongdc | Lượt xem: 1335 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Engine đa nền tảng. Chương này cũng trình bày mô hình chung của một Game Engine và một số thành phần cơ bản khác của hệ thống. Chương 2: Trình bày các cơ sở lý thuyết để xây dựng nên mô đun Hiệu ứng ánh sáng và vật liệu. Trong đó chương này trọng tâm vào trình bày một cách tổng quan nhất về các lý thuyết được áp dụng để thiết kế và cài đặt mô đun này. Chương 3: Trình bày mô hình tổng quan của mô đun Hiệu ứng ánh sáng và vật liệu. Đó là đưa ra quan hệ giữa mô đun này với các mô đun khác trong hệ thống, cũng như quan hệ giữa các thành phần trong cùng mô đun. Chương 4: Trình bày chi tiết việc cài đặt các thành phần cơ bản của mô đun Hiệu ứng ánh sáng và vật liệu. Đó là cấu trúc lớp để quản lý các thành phần của hệ thống, và các luồng điều khiển thực thi. Chương 5: Trình bày các đánh giá thực nghiệm và các demo tính năng mà mô đun Hiệu ứng ánh sáng và vật liệu thực hiện được. 3 Chương 1: TỔNG QUAN VỀ GEM 1.1. Khái niệm Game Engine Game Engine là một công cụ hỗ trợ, một lớp trung gian ở giữa các ứng dụng game và nền tảng bên dưới, các thư viện lập trình cấp thấp. Game Engine giúp phát 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ì. Cụ thể GEM gồm các thành phần như sau: Hình 2: Kiến trúc tổng thể của GEM 5 Do giới hạn về thời gian, nên phạm vi của luận văn này chúng tôi tập trung hoàn thành các 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 tác với chúng. 1.2.2.1. Thành phần Cấu trúc 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…, và 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. Hình 3: Biểu đồ lớp của thành phần Các kiểu dữ liệu cơ bản Các kiểu dữ liệu này có thể chia thành 02 nhóm chính: - Các yếu tố trong không gian 3D: o Vector2, Vector, Vector4: các loại vector biểu diễn tọa độ 2 chiều, 3 chiều và đồng nhất. o Aabb: hình hộp chữ nhật có các cạnh dọc theo các trục xyz, được mô tả bằng 2 điểm (xmin, ymin, zmin ), (xmax, ymax, zmax). 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. 1.2.2.3. Thành phần Render Engine Render Engine là thành phần cốt lõi của một Game Engine. Nó hỗ trợ người dùng 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 các API đồ họa 3D, tạo các hiệu ứng… mà quản lý logic các đối tượng bằng các giao diện do Render Engine cung cấp. Đây là thành phần duy nhất trong GEM giao tiếp với phần cứng đồ họa thông qua thư viện đồ họa 3D cấp thấp, cụ thể ở đây là OpenGL và Cg. Hình 5: Kiến trúc phân tầng của Render Engine Thành phần này được thiết kế làm các mô đun sau: - Graphic Driver là mô đun trực tiếp sử dụng các API đồ họa 3D (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 card đồ họa. 8 - 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 một khung cảnh 3D như mạng lưới, texture 2D, cubemap… 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. - 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 chuyển 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 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” - Trương Đức Phương. - 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à vật liệu. Mô đun này được trình bày chi tiết ở phần sau của khóa luận này. - 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 đượ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…). Hình 6: Tác động của Ánh sáng trong đồ họa 3D 2.1.1. Các thành phần của ánh sáng Mỗi nguồn sáng được chia làm ba thành phần sáng cơ bản [7][12]: Thành phần Ambient Thành phần ánh sáng bao quanh vật thể, và đến từ mọi hướng. Vì thế nó không phụ thuộc vào vị trí của nguồn sáng mà phụ thuộc vào độ phản xạ ánh sáng của vật thể và màu sắc của nguồn sáng. 10 Hình 7: Vẽ vật thể với áng sáng Ambient Thành phần Diffuse Thành phần ánh sáng đến từ một nguồn sáng cụ thể, sau đó phản xạ tại bề mặt vật thể theo nhiều hướng. Màu sắc của vật thể được chiếu sáng bởi thành phần này phụ thuộc vào vị trí, hướng, màu sắc của nguồn sáng và độ phản xạ của vật thể. Hình 8: Vẽ vật thể với thành phần Diffuse Thành phần Specular Thành phần ánh sáng này cũng đến từ một nguồn sáng cụ thể, nhưng khác với thành phần diffuse là nó phản xạ theo một hướng theo đúng định luật phản xạ gương. 11 Quá trình chiếu sáng ngoài phụ thuộc vào vị trí, hướng, màu sắc của nguồn sáng; độ phản xạ ánh sáng của vật thể, còn phụ thuộc vào hướng nhìn của mắt. Hình 9: Vẽ vật thể với thành phần Specular Ngoài ra, mỗi nguồn sáng còn có một số đặc trưng riêng, mô tả cho các loại nguồn sáng khác nhau, như: hướng ánh sáng, vị trí nguồn sáng, cường độ ánh sáng và vùng giới hạn chiếu sá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: 13 - Mặt nhận sáng (Light Cap): tập các đa giác có pháp tuyến hướng về phía nguồn sáng. - Mặt tối (Dark Cap): tập các đa giác có pháp tuyến hướng ra xa nguồn sáng. - Cạnh bên (Shadow side): là mặt đa giác chứa hai đỉnh v0, v1 của cạnh nằm giữa mặt nhận ánh sáng và một mặt tối; và hai đỉnh này được đưa ra vô cực. Hình 12: Mô hình của SV Bóng của vật thể được xác định bằng những điểm nằm trong vùng SV. Xác định các điểm P này bằng cách tính số giao điểm của tia nh ìn hướng đến P với các cạnh của vùng đổ bóng [6]. 2.3. Đối tượng có bề mặt phức tạp 2.3.1. Đối tượng với mạng lưới nhiều đa giác Các đối tượng trong đồ họa máy tính 3D được xấp xỉ theo các mô hình có mạng lưới (mesh) gồm nhiều đa. Mức độ chi tiết của đối tượng các cao thì số lượng đa giác càng lớn. Điều đó đồng nghĩa với chi phí thiết kế, lưu trữ và vẽ đối tượng tăng. Về cơ bản, các chi tiết khác nhau chỉ được nhận thấy khi vật thể được chiếu sáng, do vector pháp tuyến của từng mặt đa giác khác nhau. 2.3.2. Kỹ thuật sử dụng bản đồ vector pháp tuyến Quá trình chiếu sáng bề mặt vật thể dựa vào bản đồ vector pháp tuyến được lưu trong một ảnh bitmap, hay còn gọi là kỹ thuật bump [7][10]. Kỹ thuật này cho phép tạo ra: 14 - Bề mặt phức tạp mà không cần nhiều đa giác tạo nên vật thể dựa vào hiệu ứng 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 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 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 = (Tx Ty Tz) là thành phần tiếp tuyến, B = (Bx By Bz) là thành phần phó pháp tuyến, N = (Nx Ny Nz) là thành phần pháp tuyến. Tx Ty Tz TBN = Bx By Bz Nx Ny Nz 16 Chương 3: MÔ HÌNH ĐỀ XUẤT 3.1. Các yêu cầu chung của mô đun Các thành phần của mô đun được thiết kế để đảm bảo: - Các nút được tổ chức và quản lý theo dạng cây của đồ thị khung cảnh 3D scenegraph, tức là các nút này được quản lý bởi mô đun Quản lý khung cảnh. - Toàn bộ tài nguyên gồm dữ liệu về vật liệu, mạng lưới đa giác và các chương trình tạo bóng bằng ngôn ngữ Cg được quản lý bởi mô đun Quản lý tài nguyên. - Các hiệu ứng về ánh sáng được triển khai bằng ngôn ngữ tạo bóng Cg, được lưu vào file với phần mở rộng .cgfx và .cgh. Các nút xử lý cùng một hiệu ứng thì được gắn với một triển khai này (tham chiếu đến định danh của hiệu ứng). Các chương trình tạo bóng này được biên dịch trong thời điểm thực thi (runtime) nhờ các API của thư viện Cg (Cg lib). Hình 14: Mô hình liên kết với các thành phần khác bên ngoài Bên cạnh đó, mô đun này còn xây dựng một hệ thống chiếu sáng có cơ chế hoạt động giống với cơ chế chiếu sáng của OpenGL cung cấp, nhưng có tính khả chuyển cao giữa các mô hình tạo bóng. 17 3.2. Các thành phần trong mô đun Hình 15: Các thành phần của mô đun Hiệu ứng ánh sáng và vật liệu Để đảm bảo các yêu cầu đặt ra, mô đun chia các thành phần thành ba nhóm cơ bản: - Nhóm thứ nhất bao gồm các thành phần đóng vai trò là các nút trong cây đồ thị khung cảnh scenegraph như các lớp LightSceneNode, DLightSceneNode, BumpSceneNode, và SolidSceneNode được dẫn xuất từ lớp SceneNode; và lớp Shadow. Đây là các lớp định nghĩa đối tượng trong khung cảnh 3D. Trong đó, lớp LightSceneNode và DLightSceneNode là các đối tượng trừu tượng, có nhiệm vụ lưu thông tin về nguồn sáng. Các lớp còn lại là các đối tượng được hiển thị trực quan trên màn hình. - Nhóm thứ hai gồm các lớp dẫn xuất từ lớp Parameter: ShadowParameter, DLightParameter, và BumpParameter. Các lớp này lưu thông tin cần thiết tương ứng với các thông tin lưu trong các nút, phục vụ cho quá trình cập nhật tham số cho chương trình tạo bóng trong thời điểm thực thi. 18 - Nhóm thứ ba gồm các lớp dẫn xuất từ lớp Effect: DLightEffect, ShadowEffect, và BumpEffect. Đây là các lớp gắn với một triển khai hiệu ứng trên ngôn ngữ Cg, và chứa các điều khiển cập nhật thông tin cho chương trình tạo bóng này. Chi tiết cài đặt chức năng của các lớp này được trình bày ở chương sau. 19 Chương 4: THIẾT KẾ CHI TIẾT 4.1. Chiếu sáng Quá trình chiếu sáng trong đồ họa máy tính được thực hiện giống với quá trình hoạt động của đèn ở thế giới thực. Các bước thực hiện như sau (Hình 16): - Bật nguồn sáng: thiết lập các thông số về nguồn sáng như vị trí, hướng, vùng chiếu sáng và thuộc tính của các thành phần sáng. - Vẽ các đối tượng: Mỗi đối tượng được gắn với một Render Context (Xem Mô đun Quản lý Khung cảnh) và chỉ những đối tượng nào đăng ký được chiếu sáng thì mới được chiếu sáng. - Tắt nguồn sáng: hủy bỏ các thông số đã thiết lập cho từng nguồn sáng. Hình 16: Quá trình Chiếu sáng Nguồn sáng ở trong GEM là một đối tượng trừu tượng - chỉ lưu thông tin mà không hiển thị trực quan trong khung cảnh 3D; tuy nhiên, nó lại được quản lý như một nút trong cây khung cảnh scenegraph. 4.1.1. Vật liệu Vật liệu định nghĩa tính chất phản xạ ánh sáng của bề mặt vật thể, bao gồm các thành phần cấu thành sau: illum mô tả mô hình tạo bóng được sử dụng; Ka, Kd, Ks lần 20 lượt mô tả các tính chất phản xạ các thành phần ánh sáng đã nêu ở chương trước của bề mặt; và Ni mô tả độ bóng của bề mặt khi tính độ phản xạ specular. Hình 17: Lớp Material Các tính chất vật liệu này được thiết kế trước cho từng mạng lưới của mô hình vật thể và được tải vào thông qua phương thức loadFromMtl() (Xem chi tiết ở Mô đun Quản lý tài nguyên). Trong quá trình vẽ đối tượng, vật liệu được thiết lập trước. 4.1.2. Chiếu sáng bằng mô hình OpenGL cung cấp OpenGL cung cấp các API để định nghĩa nguồn sáng, thiết lập thông số về vật liệu cho các đối tượng được chiếu sáng bởi nguồn sáng. Hình 18: Lớp LightSceneNode Mỗi nguồn sáng cũng được coi là một nút, tức là lớp LightSceneNode dẫn xuất từ lớp SceneNode. Ngoài những thông tin được lưu ở SceneNode, lớp LightSceneNode lưu thông tin về Loại nguồn sáng (type), hướng (direction), cường độ các thành phần ánh sáng (Ka, Kd, Ks), góc giới hạn vùng chiếu sáng (outerCone), và sự thay đổi cường độ sáng theo khoảng cách (kC, kL, kQ). Phương thức render() được lớp LightSceneNode triển khai quá trình “bật” nguồn sáng bằng các câu lệnh OpenGL. Như đã giới thiệu, ngoài ba thành phần sáng cơ bản, nguồn sáng còn có những tính chất riêng đặc tả sự khác nhau giữa các nguồn sáng. Dựa vào các tính chất này, GEM chia các nguồn sáng được chia làm 04 loại sau: 21 - Nguồn sáng môi trường (ambient light): nguồn sáng mô tả ánh sáng môi trường, có cường độ và màu sắc đồng đều ở mọi nơi trong khung cảnh 3D. - Nguồn sáng điểm (point light): nguồn sáng mô tả ánh sáng phát ra từ một vị trí xác định trong khung cảnh 3D, phát ra theo mọi hướng và có cường độ giảm dần theo khoảng cách. - Nguồn sáng có góc giới hạn chiếu (spot light): nguồn sáng này giống với nguồn sáng điểm, chỉ khác là ánh sáng phát ra trong một vùng giới hạn nhất định – vùng giới hạn này được đặc trưng bởi hình nón có đỉnh ở vị trí nguồn sáng và đường cơ sở hợp với trục chính một góc outerCone (ví dụ như đèn học, đèn sân khấu). - Nguồn sáng có hướng song song (directional light): nguồn sáng này mô tả các nguồn sáng ở rất xa vật bị chiếu sáng, và có cường độ sáng gần như không đổi (ví dụ như mặt trời). Loại nguồn sáng này chỉ cần quan tâm đến hướng ánh sáng. Hình 19: Sơ đồ “bật” nguồn sáng 22 Do loại nguồn sáng được đặc trưng bởi các thuộc tính khác nhau, nên quá trình “bật” nguồn sáng của từng loại cũng khác nhau, theo các bước sau (Hình 19): - Cập nhật ma trận Model: tính lại ma trận và định lại vị trí mới trong trong khung cảnh 3D nếu có sự thay đổi vị trí của nguồn sáng. - Thiết lập vị trí, Cường độ, Màu sắc các thành phần sáng: Các bước này được thực hiện với tất cả các loại nguồn sáng. - Nếu nguồn sáng là: + Nguồn sáng có góc giới hạn chiếu: Thiết lập vùng chiếu sáng. + Nguồn sáng có hướng song song: Thiết lập hướng chiếu sáng. Các thiết lập thông số này sử dụng phương thức glLightfv(GLenum light, GLenum pname, const GLfloat * params) [8][12]. 4.1.3. Chiếu sáng bằng mô hình tự định nghĩa Như đã giới thiệu, OpenGL cung cấp mô hình tạo bóng Phong và thực thi trên chương trình tạo bóng theo từng đỉnh (vertex progam), nên có một số hạn chế: - Quá trình nội suy màu sắc theo các đỉnh không được chính xác, đặc biệt là quá trình chiếu sáng với nguồn sáng có vùng giới hạn chiếu. - Phải thiết kết mô hình chi tiết hơn (nhiều đa giác hơn) nếu muốn có kết quả tốt, nhưng tốc độ sẽ giảm đi đáng kể trong khi bộ nhớ lưu trữ mô hình tăng. Như vậy, chúng ta cần phải triển khai một cơ chế như OpenGL cung cấp nhưng cho phép lựa chọn mô hình tạo bóng khác nhau (như Blinm, Lambert…), thứ nữa là tạo ra kết quả hình ảnh tốt bằng cách thực thi mô hình tạo bóng này theo chương trình tạo bóng theo từng pixel (fragment program). 4.1.3.1. Lớp DLightSceneNode Hình 20: Lớp DLightSceneNode 23 Lớp DLightSceneNode được thiết kế như là một đối tượng lưu thông tin về nguồn sáng, và truyền các thông số này cho các nút khác có đăng ký sử dụng hiệu ứng ánh sáng. Lớp DLightSceneNode được dẫn xuất từ lớp LightSceneNode. DLightSceneNode có thêm các thành phần parameter, dlight_effectID và using_IDs. Thành phần parameter là một đối tượng DLightParameter, các thành phần cấu thành nên đối tượng này tương ứng với các thành phần trong DLightSceneNode – các thông tin về nguồn sáng. Thành phần dlight_effectID là một tham chiếu định danh đến một đối DLightEffect – được quản lý bởi mô đun quản lý tài nguyên. Thành phần using_IDs chứa danh sách các định danh của các Effect và dẫn xuất của nó mà có đăng ký sử dụng hiệu ứng ánh sáng; danh sách này cập nhật động khi có Effect mới được khởi tạo. Hình 21: Sơ đô trạng thái “bật” nguồn sáng động Phương thức render() của lớp DLightSceneNode thực hiện “bật” nguồn sáng và cập nhật tham số của Effect cho các nút sử dụng DLightSceneNode (Hình 21): - Cập nhật ma trận Model: tính lại ma trận model và định lại vị trí nếu nguồn sáng thay đổi vị trí. - Bật nguồn sáng bằng OpenGL: gọi phương thức render() của lớp cơ sở LightSceneNode. - Cập nhật DLightParameter: gọi phương thức updateParameters(), thực hiện cập nhật tham số của đối tượng parameter. 24 - Cập nhật DLightEffect: cập nhật các tham số về nguồn sáng cho đối tượng dlight_effectID và các đối tượng có trong danh sách using_IDs. Lớp DLightEffect được thừa kế từ lớp Effect. Lớp này gồm các thành phần hLighti* là các tham số lưu thông tin của tất cả các nguồn sáng có trong hệ thống – với triển khai trong GEM là 10 nguồn sáng (0≤i≤10). Nguồn sáng thứ i được bật, phương thức updateEffecParameter() được gọi để cập nhật tham số cho hLighti*, và gọi phương thức updateLightParameter() cập nhật tham số nguồn sáng cho đối tượng trong using_IDs của DLightSceneNode. Hình 22: Lớp DLightEffect GEMDlight.cgfx chứa chương trình fragment shader, triển khai mô hình tạo bóng; và việc chuyển đổi giữa các mô hình ánh sáng bằng cách gắn lại các chương trình Cg được triển khai trong file GEMDLight.cgfx. Chương trình dưới đây triển khai mô hình tạo bóng Phong, với tham số đầu vào là nguồn sáng light gồm (loại, vị trí, hướng, thành phần ambient, diffuse, specular, cường độ, và góc giới hạn), hướng nhìn V, điểm được chiếu sáng P, và tính chất vật liệu gMaterial . Quá trình này thực hiện như sau: - Tính cường độ sáng attenuation tại điểm P, cường độ này giảm dần theo khoảng cách từ nguồn sáng đến P. - Tính vùng chiếu sáng spotEffect, nếu là nguồn sáng spotlight thì vùng này là một hình nón có đỉnh là vị trí nguồn sáng. 25 - Tính các thành phần sáng ambient, diffuse và specular dựa vào hướng nhìn, hướng chiếu sáng và điểm được chiếu sáng. - Tính màu tại điểm P dựa vào các thành phần sáng và vật liệu tại điểm P. Chương trình fragment shader được triển khai trong GEMDLight.cgfx float4 lightPS() : COLOR { float attenuation = calculateAttenuation(P, light); //tính cường độ sáng float spotEffect = calculateConeSpotlight(P, light); //tính vùng chiếu sáng //tính thành phần ambient ambientResult = light.Ka * attenuation * spotEffect; //tính thành phần diffuse float3 L = normalize(light.position.xyz - P); if(light.type == 3) //nguồn sáng có hướng song song L = normalize(-light.direction.xyz); float diffuseLight = max(dot(N, L), 0); diffuseResult = light.Kd * diffuseLight * attenuation * spotEffect; //tính thành phần specular float3 H = normalize(L + V); float specularLight = pow(max(dot(N, H), 0), shininess); if (diffus

Các file đính kèm theo tài liệu này:

  • pdfBui Hoang Khanh_K50CNPM_Khoa luan tot nghiep dai hoc.pdf