BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA CÔNG NGHỆ PHẦN MỀM BÁO CÁO ĐỒ ÁN 2 TÌM HIỂU VỀ OPENGL VÀ THIẾT KẾ 2D GAME ENGINE Giảng viên hướng dẫn ThS Thái Thụy Hàn Uyển Sinh viên th[.]
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO ĐỒ ÁN 2 TÌM HIỂU VỀ OPENGL VÀ THIẾT KẾ 2D GAME
ENGINE
Giảng viên hướng dẫn : ThS Thái Thụy Hàn Uyển Sinh viên thực hiện 1 : Nguyễn Viết Lưu – 19520155 Sinh viên thực hiện 2 : Vũ Đức Trung - 19520324
Thành phố Hồ Chí Minh, tháng 12 năm 2022
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO ĐỒ ÁN 2 TÌM HIỂU VỀ OPENGL VÀ THIẾT KẾ 2D GAME
ENGINE
Giảng viên hướng dẫn : ThS Thái Thụy Hàn Uyển Sinh viên thực hiện 1 : Nguyễn Viết Lưu – 19520155 Sinh viên thực hiện 2 : Vũ Đức Trung - 19520324
Thành phố Hồ Chí Minh, tháng 12 năm 2022
Trang 3Lời cảm ơn
Đồ án 2 là môn học có nhiều thử thách, đòi hỏi người học phải dành nhiều thời gian, công sức để nghiên cứu, tìm tòi và xây dựng Đồng thời, đây cũng là cơ hội để sinh viên thực hành những gì đã học trong suốt những năm đại học và học hỏi thêm nhiều kiến thức, kinh nghiệm và kỹ năng mới phục vụ cho công việc sau này Hơn hết, đồ án 2 là bước chuẩn bị cuối cùng để nhóm phát triển lên thành khóa luận tốt nghiệp Cho nên đây được xem là thử thách và cũng là cơ hội để sinh viên được rèn luyện, hoàn thiện bản thân bằng những kĩ năng tích lũy được trong suốt quá trình làm đồ án
Để có thể đi đến đoạn cuối của hành trình là cả sự nỗ lực, cố gắng và kiên trì Đồng hành cùng sinh viên vượt qua thử thách này là sự có mặt và giúp đỡ của những người thầy tận tâm trong công việc
Nhóm xin chân thành cảm ơn cô Thái Thị Hàn Uyển đã tận tình giúp đỡ nhóm em hoàn thành đồ án 2 của mình Chính nhờ những sự góp ý, động viên của cô đã giúp đồ án của nhóm được hoàn thiện và chuyên nghiệp nhiều hơn Bên cạnh đó, nhóm đã học hỏi được rất nhiều kiến thức, kinh nghiệm và bài học thú vị trong quá trình làm khoá luận, đó
sẽ là những hành trang hữu ích cho nhóm sau này
Nhóm cũng xin chân thành cảm ơn các anh chị, bạn bè đã giúp đỡ nhóm trong quá trình thực hiện đồ án Nhờ mọi người mà nhóm có nhiều góc nhìn khác nhau về đề tài đang làm, từ đó giúp hoàn thiện đồ án của nhóm Một lần nữa, nhóm xin chân thành cảm ơn cô
và mọi người
Trang 4Lời nhận xét của giảng viên hướng dẫn
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
………
Trang 5Mục lục
Lời cảm ơn 3
Lời nhận xét của giảng viên hướng dẫn 4
Mở đầu 7
Chương 1 Tổng quan 8
1.1 Lý do chọn đề tài 8
1.1.1 Giới thiệu sơ lược về OpenGL 8
1.1.2 Giới thiệu sơ lược về Game Engine 8
1.1.3 Các Game Engine đã có trên thị trường 8
1.1.4 Lý do lựa chọn đề tài 9
1.2 Mục tiêu đồ án 10
1.2.1 Yêu cầu về nghiên cứu 10
1.2.2 Yêu cầu về tính năng sản phẩm 10
1.2.3 Yêu cầu về kỹ thuật sản phẩm 10
1.3 Hướng tiếp cận dự kiến 10
1.3.1 Công nghệ dự kiến sử dụng 10
1.3.2 Đối tượng phạm vi dự án nhắm đến 10
Chương 2 Cơ sở lý thuyết 11
2.1 Cách một game hoạt động 11
2.1.1 Loop 11
2.1.2 Render 11
2.1.3 Game object 11
2.1.3 Component 11
2.1.4 Script 11
2.2 OpenGL 11
2.2.1 OpenGL là gì? 11
2.2.2 OpenGL hoạt động như thế nào? 11
2.2.3 Lịch sử hình thành, các phiên bản của OpenGL 12
2.2.4 Đối thủ cạnh tranh của OpenGL 13
2.2.5 Tại sao cần có OpenGL? 13
2.2.6 Tại sao Shader lại chạy nhanh tới mức như vậy? 13
2.3 Game Engine 15
Trang 62.3.1 Game Engine là gì? 15
2.3.2 Mục đích ra đời 15
2.3.3 Game Engine trong thời điểm hiện tại 16
2.3.5 Những thành phần nào cấu thành nên Game Engine 16
2.3.6 Quy trình tạo ra game dựa vào Game Engine 16
Chương 3 Thiết kế hệ thống 17
3.1 Kiến trúc hệ thống 17
3.2 Mô tả các thành phần trong hệ thống 17
Chương 4 Phân tích thiết kế 18
4.1 Phân tích chức năng 18
4.1.1 Bảng tính năng 18
4.1.2 Danh sách các tính năng đã phát triển 18
4.1.3 Danh sách các tính năng đang trong quá trình phát triển 21
4.2 Thiết kế giao diện 21
4.2.1 Sơ đồ thiết kế giao diện 21
4.2.2 Danh sách giao diện 22
4.2.3 Mô tả chi tiết giao diện 22
Chương 5 Thực nghiệm 23
5.1 Thực nghiệm chương trình 23
5.1.1 Phương pháp đánh giá 23
5.1.2 Kết quả đánh giá 24
Kết luận 25
Hướng phát triển 26
Cài đặt và sử dụng 27
Phân công công việc 28
Tài liệu tham khảo 29
Trang 7Mở đầu
Ngày nay, tốc độ phát triển của nghành Công nghệ thông tin phải nói là nhanh đến chóng mặt từ những bước ban đầu chỉ dùng để tính toán, xem tin tức, lưu trữ một số thông tin quan trọng và cho đến bây giờ, nó gần như cho phép con người có thể đi vào một thế giới quan với những thao tác gõ phím đấp chuột là có thể xây dựng nên một Game đơn giản như là Mario, Pinball, … Một phần tạo nên sự thành công ấy là công nghệ OpenGL OpenGL là viết tắt cho "Open Graphics Library" và nó được dùng rất nhiều trong ngôn ngữ máy tính
Bên cạnh sự phát triển nhanh chóng ấy, xu hướng có thể tạo một tựa Game đơn giản đang dần được mọi người yêu thích quan tâm Và chúng ta có thể ngày nay có rất nhiều phần mềm giúp con người tạo được những tựa Game từ đơn giản đến nâng cao Đó là lí
do mà chúng em tìm hiểu về công nghệ OpenGL và làm nên phần mềm công cụ giúp thiết kế Game 2D một cách dễ dàng dễ hiểu cho người dùng
Các công việc chính mà phần mềm hỗ trợ để giúp cho việc phát triển game một cách
dễ dàng hơn là: Hỗ trợ render hình ảnh với FPS cao, kéo thả các vật thể trong game, dễ dàng thêm các component cho vật thể trong game, hỗ trợ phát âm thanh, tạo animation,
Trang 8Chương 1 Tổng quan
1.1 Lý do chọn đề tài
1.1.1 Giới thiệu sơ lược về OpenGL
OpenGL là viết tắt của “Open Graphics Library”, là một API đa nền tảng, đa ngôn ngữ cho việc render đồ họa 2D và 3D
OpenGL xử lý các phép tính đồ họa trực tiếp trên GPU thay vì CPU, điều này làm cho giảm các công việc cực nhọc trên GPU, từ đó làm cho đồ họa được render nhanh hơn
1.1.2 Giới thiệu sơ lược về Game Engine
Game Engine là một phần mềm dùng để xây dựng và thiết kế trò chơi điện tử Hình dung một cách đơn giản thì game engine cung cấp cho các nhà sản xuất game những nguyên liệu cơ bản để từ đó họ sẽ dễ dàng hơn trong việc phát triển game của mình
Lợi ích của Game Engine:
• Tạo ra game mà hạn chế hoặc không sử dụng lập trình
• Tiết kiệm thời gian, công sức và tiền bạc
• Đồ họa chân thực
• Hỗ trợ đa nền tảng
1.1.3 Các Game Engine đã có trên thị trường
Hiện nay có rất nhiều Game Engine trên thị trường, đây là một số game engine nổi bật:
Unreal Engine
Unreal Engine cũng là một trong số những game engine phổ biến nhất trên toàn thế giới được phát triển bởi Epic Games Nó là một game engine đa nền tảng Game được tạo ra bởi Unreal Engine được hỗ trợ trên Microsoft Windows, macOS, Linux, SteamOS, HTML5, iOS, Android, Nintendo Switch, PlayStation 4, Xbox One Nó có một Market của riêng mình, nơi mà các packages có thể được mua Ngoài ra, đối với những chương trình nặng về
Trang 9đồ họa, nó yêu cầu một máy tính mạnh hơn những engine khác như Unity Một số game được làm bởi Unread Engine: Fornite, Batman Arkham City,…
CryEngine
Được phát triển bởi CryTek CryEngine là một trình chỉnh sửa Sandbox 1đầy đủ tính năng dùng để phát triển cho hầu hết nền tảng chính bao gồm: Xbox, PlayStation, PC và Oculus Một số game được phát triển bởi CryEngine: War of Rights, Last Kingdom,…
Coco’s Creator
Nó là một công cụ tập trung vào việc tạo nội dung được phát triển bởi Xiamen; nó có một bộ các tính năng mạnh mẽ và rất thân thiện với người dùng Đây là một công cụ phát triển trò chơi đa nền tảng hỗ trợ nhiều nền tảng khác nhau, bao gồm web, iOS, Android, Windows và Mac Nó hỗ trợ cả phát triển trò chơi 2D và 3D Họ cũng cung cấp các giải pháp khác như Cocos 2D và Cocos 2Dx Một số game được phát triển bởi Coco’s Creator: Magic Rush, Ark of Conquest, Idle Heroes,…
Amazon Lumberyard
Được phát triển bởi Amazon Nó chủ yếu được sử dụng để phát triển game 3D Nó hỗ trợ chế độ xem trước VR (VR preview mode), kịch bản trực quan (visual script) và tích hợp Twitch của Adobe Photoshop Amazone Lumberyard hỗ trợ phát triển game online nhiều người chơi một cách dễ dàng Nó sử dụng C++ làm ngôn ngữ lập trình chính Một số game được phát triển bởi Amazon Lumberyard: New World, Star Citizen,…
Godot
Godot là một Game Engine sử dụng miễn phí, được mã nguồn mở thông qua giấy phép MIT Godot là một công cụ phát triển mã nguồn mở chạy trên máy tính Windows, Linux và Mac Công cụ hỗ trợ cả khả năng 2D và 3D, và nó có trình chỉnh sửa hình ảnh và hệ thống cảnh linh hoạt để đưa ra tiến trình trò chơi Ngoài ra, Godot sử dụng ngôn ngữ GDScript, là một ngôn ngữ lập trình cấp cao có cú pháp khá giống với Python Một số game được phát triển bởi Godot: Kingdoms of the Dump, Hardcored,…
GameMaker: Studio
Được phát triển bởi Yoyo, Đây là một nền tảng phát triển trò chơi 2D không yêu cầu kinh nghiệm hoặc kiến thức lập trình Thay vào đó, người dùng có thể “point and click” để tạo trò chơi nhanh hơn nhiều so với viết mã bằng ngôn ngữ mẹ đẻ Nhìn chung, công cụ này rất thân thiện với người mới bắt đầu và mở ra khả năng phát triển trò chơi cho tất cả mọi người Một số game được phát triển bưởi GameMaker: Undertale, Hotline Miami,…
Trang 10đầu tìm hiểu về lập trình game cũng nên tìm hiểu Vì nó cũng cấp cho những người mới rất nhiều kiến thức, thuật ngữ quan trọng
Với định hướng của cả nhóm và mong muốn thử thách chính mình, chúng em quyết định chọn đề tài “Tìm hiểu về OpenGL và thiết kế 2D Game Engine” để làm đề tài cho môn Đồ
án 2
1.2 Mục tiêu đồ án
1.2.1 Yêu cầu về nghiên cứu
• Hiểu những khái niệm cơ bản về OpenGL
• Hiểu và nắm rõ các kiến thức, quy trình phát triển 2D Game Engine
1.2.2 Yêu cầu về tính năng sản phẩm
Được lấy cảm hứng từ Hazel Engine Sản phẩm 2D Game Engine cần có những yêu cầu
về tính năng như sau:
• Hỗ trợ phát triển game 2D
• Hỗ trợ kéo thả (drag and drop)
• Hạn chế lập trình khi sản xuất game (no-code)
1.2.3 Yêu cầu về kỹ thuật sản phẩm
Sản phẩm 2D Game Engine cần có những yêu cầu về kỹ thuật như sau:
• Giao diện thân thiện, trực quan, hiện đại
o OpenAL (Open Audio Library): API hỗ trợ phát âm thanh
o GLFW (Graphics Library Framework): Thư viện hỗ trợ làm việc với OpenGL, xử lý dữ liệu đầu vào từ chuột, bàn phím, pad,
o LWJGL (Lightweight Java Game Library): Thư viện hỗ trợ render đồ họa trong Java
o JOML (Java math library for OpenGL): Hỗ trợ tính toán các phép tính render
Trang 11Chương 2 Cơ sở lý thuyết
2.1.3 Component
Một Game object được cấu thành từ một hoặc nhiều Component Component được hiểu
là một thành phần cấu tạo nên game object Ví dụ: Mario thì có hình ảnh của chính nó,
animation, vị trí, vùng va chạm,…
2.1.4 Script
Script (kịch bản) được hiểu rằng là một Component, nhưng nó khác ở chỗ là Component này do người lập trình viên tạo ra Ví dụ: Mario sẽ di chuyển theo hướng trái/phải dựa trên phím bấm của người chơi hay Viên đạn được xuất hiện khi người dùng bắn nó từ tàu con thoi Những thứ đó được gọi là Script
2.2.2 OpenGL hoạt động như thế nào?
OpenGL là nơi gần nhất giữa CPU (cái mà những developer chạy các ứng dụng trên các ngôn ngữ lập trình) và GPU (chip xử lý đồ họa) Vì vậy OpenGL cần phải được hỗ trợ bởi các nhà sản xuất card đồ họa (vd: NVidia) và được cài đặt bởi những đối tác phát triển hệ điều hành (giống như Apple hay Microsoft) và cuối cùng OpenGL cho chúng ta một API thống nhất để làm việc API này là các "Ngôn ngữ miễn phí" (hoặc hầu như miễn phí) Việc này quá thuận lợi vì nếu sử dụng C hoặc C++ hay thậm chí là Objective-C, Perl, C# hay Javascript hay bất kỳ ngôn ngữ nào bạn muốn, API của OpenGL luôn giống nhau, xử lý giống nhau, chung chức năng, dòng lệnh
Đi sâu vào bộ xử lý tính toán của OpenGL, ta thấy OpenGL sử dụng tính toán trực tiếp trên GPU - phần cứng xử lý đồ họa cho máy tính - và sử dụng dấu phảy động (floating points) CPU (Central Processing Unit) là chip xử lý của máy tính Còn GPU (Graphics Processing Unit)
là chip xử lý đồ họa Chip xử lý đồ họa này giúp cho CPU giảm thiểu các công việc nặng nhọc:
Trang 12nó có thể xử lý ảnh trước khi hiện ra màn hình Hay sâu hơn, những gì OpenGL thực hiện chính
là trên GPU, thay vì tính toán trên CPU GPU nhanh hơn rất rất nhiều với các số thực so với
CPU Đây là lý do cơ bản để các trò chơi 3D chạy nhanh hơn khi có card đồ họa Đây cũng chính
là lý do cho các phần mềm xử lý 3D chuyên nghiệp giúp chúng ta làm việc với "Software's
Render" (xử lý trên CPU) hoặc "Graphics Card's Render" (xử lý trên GPU) Một vài phần mềm cũng cho chúng ta một tùy chọn: Có dùng OpenGL hay không? Và đó, giờ bạn đã biết rồi Tùy chọn đó chính là dành cho việc xử lý sẽ ở trên GPU hay không Vì vậy, OpenGL sẽ hoàn toàn
làm việc với GPU hay không? câu trả lời là không chắc Chỉ những thao tác xử lý ảnh và vài thứ khác thôi OpenGL cho chúng ta rất nhiều chức năng để lưu trữ ảnh, dữ liệu, thông tin trong một định dạng cụ thể Những định dạng này được xử lý trực tiếp bởi GPU Vì vậy OpenGL phụ thuộc
13 vào phần cứng Nếu phần cứng không hỗ trợ OpenGL, chúng ta không thể sử dụng nó Quá buồn! Các phiên bản mới của OpenGL thường xuyên cần những tính năng mới của GPU Nhưng cũng đừng lo lắng, OpenGL luôn cần những nhà sản xuất tích hợp vào, chúng ta (những
developer - coder) sẽ làm việc trên các phiên bản OpenGL mới chỉ khi thiết bị đã sẵn sàng
Trong thực tế, tât cả các chip đồ họa hiện tại đều hỗ trợ OpenGL Vì vậy bạn có thể sử dụng
OpenGL với rất nhiều ngôn ngữ và thiết bị Thậm chí với Microsoft Windows
2.2.3 Lịch sử hình thành, các phiên bản của OpenGL
Những năm 1980, việc phát triển phần mềm có thể hoạt động trên nhiều loại phần cứng
đồ họa thực sự là một thử thách Các nhà phát triển phần mềm đã tùy chỉnh interfaces và drivers cho từng phần cứng Điều này gây ra tốn kém và nỗ lực gấp bội Trong những năm đầu thập niên
1990, Silicon Graphics, Inc.(SGI) là công ty dẫn đầu trong lĩnh vực đồ họa 3D cho các máy trạm IRIS GL trở thành tiêu chuẩn công nghiệp, được sử dụng rộng rãi hơn PHIGS Điều này được lý giải là do IRIS GL dễ sử dụng hơn và vì nó được hỗ trợ chế độ render tức thì Ngược lại, PHIGS được coi là khó sử dụng và lỗi thời về chức năng Đối thủ cạnh tranh của SGI (bao gồm: Sun
Microsystems, Hewlett-Packark, MBI) đã tung ra thị trường các phần cứng 3D được hỗ trợ bởi extensions theo tiêu chuẩn của PHIGS Điều này gây áp lực khiến cho SGI phải mã nguồn mở một phiên bản IRIS GL như một tiêu chuẩn công khai được gọi là Open GL vào năm 1992
Các phiên bản:
1.0 June 30, 1992 First release
1.1 1995 Texture objects, Vertex Arrays
1.2
the imaging subset useful to image-processing applications
1.2.1 October 14, 1998 A concept of ARB extensions
2.0 September 7, 2004 GLSL 1.1, MRT, Non Power of Two textures, Point Sprites,
Two-sided stencil
Buffer Object (FBO)
3.1
Object, Primitive restart
Trang 133.2 August 3, 2009 GLSL 1.5, Geometry Shader, Multi-sampled textures
instanced, shader packing, performance improvements
storage buffer objects, high-quality ETC2/EAC texture compression, increased memory security, a multi-application robustness extension, compatibility with OpenGL ES 3.0
4.4
July 22, 2013
GLSL 4.40, Buffer Placement Control, Efficient Asynchronous Queries, Shader Variable Layout, Efficient Multiple Object Binding, Streamlined Porting of Direct3D applications, Bindless Texture Extension, Sparse Texture Extension
4.5
August 11, 2014
GLSL 4.50, Direct State Access (DSA), Flush Control, Robustness, OpenGL ES 3.1 API and shader compatibility, DX11 emulation features
4.6
July 31, 2017
GLSL 4.60, More efficient geometry processing and shader execution, more information, no error context, polygon offset clamp, SPIR-V, anisotropic filtering
2.2.4 Đối thủ cạnh tranh của OpenGL
OpenGL ra đời bản đầu tiên vào 1992, cùng thời điểm đó, Microsoft đã có Windows 3
Như Microsoft luôn tin rằng "không gì được tạo ra, mọi thứ được copy", Microsot đã có gắng
copy OpenGL trong những gì họ gọi là DirectX và được giới thiệu lần đầu năm 1995 trong
Windows 95 tương ứng
2.2.5 Tại sao cần có OpenGL?
Đơn giản là chúng ta cần một màn hình của chúng ta render hình ảnh thật mượt mà, đặc biệt là game, thứ yêu cầu render nhanh đến mức 60FPS hay 120FPS
2.2.6 Tại sao Shader lại chạy nhanh tới mức như vậy?
Hãy tưởng tượng CPU là một dây chuyền công nghiệp lớn, và mọi tác vụ đi qua dây
chuyền là một khâu Có vài khâu đồ sộ hơn các khâu khác, tức là chúng cần nhiều thời gian và
năng lượng hơn để xử lý Ta nói chúng cần nhiều năng lực xử lý hơn Kiến trúc của máy tính
khiến mỗi khâu phải thực hiện tuần tự; khâu này kết thúc rồi mới đến khâu tiếp theo Máy tính
hiện đại thường có tới 4 bộ xử lý tương tự như 4 dây chuyền sản xuất này, lần lượt thực thi từng
tác vụ nhỏ Mỗi dây chuyền nhỏ trong đó gọi là một thread
Trang 14Các trò chơi điện tử và các ứng dụng đồ hoạ cần nhiều năng lực xử lý hơn hẳn các phần mềm khác Vì các nội dung đồ hoạ của chúng yêu cầu thực hiện rất nhiều phép toán, cho từng điểm ảnh một Mỗi điểm ảnh trên màn hình đều phải được tính đến, còn trong các trò chơi 3 chiều thì cả các vật thể lẫn các góc camera cũng phải được tính luôn
Quay trở lại phép so sánh về dây chuyền và tác vụ Mỗi điểm ảnh trên màn hình đại diện cho 1 tác vụ nhỏ Bản thân từng tác vụ không phải là vấn đề lớn với CPU, nhưng (vấn đề ở đây là) các tác vụ bé xíu này lại phải được thực thi cho từng điểm ảnh trên cả màn hình Có nghĩa là trên màn hình cũ có độ phân giải 800x600, có tới 480.000 điểm ảnh cần phải được xử lý mỗi khung hình, tương đương với 14.400.000 phép tính mỗi giây! Đúng thế! Đó chính là điều khiến
bộ vi xử lý bị quá tải Còn ở màn hình retina thời hiện đại có độ phân giải 2880x1800 hiển thị 60 khung hình một giây, thì số phép tính mỗi giây lên tới 311.040.000 Bằng cách nào mà các kỹ sư
đồ hoạ giải quyết được vấn đề này?
Đây là lúc mà xử lý song song trở thành một giải pháp tốt Thay vì phải trang bị vài bộ vi
xử lý to lớn và mạnh mẽ, hoặc các dây chuyền, sẽ là thông minh hơn nếu để cho hàng loạt các bộ
vi xử lý tí hon chạy song song Và đó chính là việc mà các bộ xử lý đồ hoạ (GPU) làm