Ngoài ra những chương trình giải trí, những trò chơi trên các thiết bị này cũng là một phần không thể thiếu và được mọi người sử dụng hàng ngày.. DANH SÁCH CÁC TỪ VIẾT TẮT API Applicatio
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
- -
LUẬN VĂN TỐT NGHIỆP
NGHIÊN CỨU VÀ XÂY DỰNG THƯ VIỆN HỖ TRỢ
LẬP TRÌNH ĐỒ HỌA OPENGL ES 2.0
STUDYING AND BUILDING A GRAPHICS
PROGRAMMING LIBRARY SUPPORTING ON
OPENGL ES 2.0
Giảng viên hướng dẫn: TS NGÔ THANH HÙNG
Sinh viên thực hiện: NGUYỄN LÂM TÚ
Lớp: CNPM01
Khoá: 2006 - 2011
TP Hồ Chí Minh, tháng 03 năm 2011
Trang 2ABSTRACT
Nowaday, Graphics Programming in embedded devices is interested We have many
technologies and tools in this domain OpenGL ES is a technology which is used to do that However, Programming in devices is not easy and has some special features
because its peculiarities
In the thesis, I study the features of OpenGL ES 1.1, OpenGL ES 2.0 and its problems causing difficulties to programmer After that, I proposed architechture and built a library that support programmer in graphic programming
Its architecture was MVC (Model-View-Controller) It is a popular and useful
architecture So, It could make the library to be flexible and easy to manage It was built
in Object Oriented programming It means we can inherit and reuse or make the libray better and larger The library contained 3D math calculation classes They could help developer solve programmable programming Programmable programming is a different point between OpenGL ES 2.0 and the others version of OpenGL ES Besides that, all classes was specified in the documentation
The library was built in WinCE flatform and could run on AMD Emulator for OpenGL ES 2.0
The support library is built And it can use in OpenGL ES 2.0 programming However, It is just simple and not concise in design In future, It can be more perfect by developing and adding other features
Ho Chi Minh City, March – 2011
Student
Nguyen Lam Tu
Trang 3MỞ ĐẦU
Trong thời đại ngày nay, các thiết bị di động đang đóng một vai trò hết sức quan trọng trong đời sống của mỗi người Mỗi người luôn mang theo mình những thiết bị cầm tay, hay điện thoại thông minh để phục vụ cho việc liên lạc hay làm việc Ngoài ra những chương trình giải trí, những trò chơi trên các thiết bị này cũng là một phần không thể thiếu và được mọi người sử dụng hàng ngày Việc lập trình trên các thiết bị, đặc biệt là các ứng dụng về đồ họa và game được rất nhiều lập trình viên quan tâm
OpenGL ES được coi là thư viện lập trình đồ họa chuyên cho các thiết bị di động Với khả năng thực thi tốt và mạnh mẽ, ngày càng nhiều ứng dụng được viết dựa trên OpenGL ES Tuy nhiên, OpenGL ES được cung cấp dưới dạng đặc tả chuẩn với những hàm cơ bản Việc lập trình với OpenGL ES đòi hỏi người lập trình viên phải tùy biến theo từng chương trình, và tự bản thân phải xây dựng nên cấu trúc riêng Hơn thế nữa, OpenGL ES 2.0 là phiên bản được ra đời gần đây nhất với nhiều cải tiến và thay đổi Cách tiếp xúc và lập trình với nó hoàn toàn khác với phiên bản trước đó, điều đó đã gây
ra một số khó khăn trong việc tiếp cận và lập trình với phiên bản này Đòi hỏi phải xây dựng một số hàm phụ trợ
Từ lý do đó, luân văn mong muốn xây dựng một cấu trúc có sẵn cũng như những hàm, lớp trợ giúp cho người lập trình Làm cho quá trình phát triển ứng dụng được dễ dàng, thuận tiện và nhanh chóng hơn Có thể tiếp cận và giải quyết cũng như sử dụng OpenGL ES 2.0 dễ dàng và hiệu quả hơn Những hàm và lớp được xây dựng sẵn theo kiến trúc hướng đối tượng, người dùng chỉ cần triệu gọi chúng, hoặc có thể tự mình mở rộng chúng bằng cách thừa kế lại Thư viện cũng giúp cho người lập trình có thể chuyển
từ phiên bản cũ qua phiên bản 2.0 dễ dàng hơn Không phải viết lại những hàm không có trong phiên bản mới này từ đầu Với tư tưởng xây dựng một thư viện độc lập với các nền tảng, những lớp trong thư viện luôn được đặc tả trước tiên bởi các lớp ảo, sau đó mới được thực thi bởi lớp cụ thể Việc này sẽ rất hữu ích khi ta chuyển qua nền tảng lập trình khác
Nội dung luận văn được chia làm 5 chương:
Trang 4Trong chương này, chúng ta sẽ tìm hiểu tầm quan trọng và sự phát triển mạnh mẽ của các thiết bị di động và nền tảng di động Kéo theo sự phát triển đó là yêu cầu về phần mềm xử lý đồ họa, ứng dụng hay game cho các thiết bị này Điều đó dẫn đến sự cần thiết phải có một bộ thư viện lập trình đồ họa dành riêng cho chúng, đó chính là OpenGL ES
Nêu lên lý do thực hiện đề tài, tính cấp bách, thiết yếu của đề tài Ngoài ra cũng đưa ra mục đích và kết quả muốn hướng đến của đề tài
Chương 2: Cơ sở toán học đồ họa máy tính
Nêu ra những khái niệm, những luận điểm cơ bản về lập trình ba chiều Bao gồm các khái niệm về toán học, ma trận, … và quá trình biến đổi hình học ba chiều trong các không gian khác nhau
Chương 3: OpenGL ES 2.0 và ngôn ngữ lập trình OpenGL Shading
Nói đến công nghệ được sử dụng để thực hiện đề tài và cũng là phiên bản mạnh mẽ
và mới nhất của OpenGL ES hiện nay Cung cấp cho người đọc một cái nhìn toàn diện về phiên bản của OpenGL So sánh phiên bản OpenGL ES 2.0 với phiên bản trước của nó,
và một số điểm mới trong phiên bản 2.0 Đặc biệt chương này đi sâu nghiên cứu ngôn ngữ OpenGL ES Shading Language, là nét đặc trưng và khác hẳn của OpenGL ES 2.0
Chương 4: Thiết kế, cài đặt thư viện hỗ trợ lập trình đồ họa trên OpenGL ES 2.0
Chương này nêu lên kiến trúc tổng thể của thư viện Đồng thời đi vào chi tiết, đặc tả các lớp được xây dựng trong thư viện
Trang 5LỜI CÁM ƠN
Em xin chân thành cảm ơn Khoa Công Nghệ Phần Mềm, Trường Đại Học Công Nghệ Thông Tin đã tạo điều kiện thuận lợi cho em thực hiện luận văn tốt nghiệp này
Em xin chân thành gửi lời cảm ơn đến thầy Ngô Thanh Hùng đã tận tình chỉ bảo
và hướng dẫn em trong suốt thời gian qua để em có thể hoàn thành tốt đề tài
Em xin chân thành cảm ơn quý thầy cô trong khoa đã tận tình giảng dạy, trang bị cho em nhưng kiến thức quý báu trong những năm học vừa qua
Con xin nói lên lòng biết ơn sâu sắc tới cha mẹ, người đã chăm sóc, nuôi dậy con trưởng thành và không ngừng cổ vũ, động viên tinh thần con
Cũng xin gửi lời cảm ơn tới anh chị, bạn bè đã nhiệt tình giúp đỡ, trao đổi kiến thức, kinh nghiệm, động viên rất nhiều trong thời gian qua
Mặc dù em đã cố gắng hoàn thành luận văn trong phạm vi, khả năng cho phép Nhưng chắc chắn sẽ không tránh khỏi nhưng thiếu sót Em mong nhận được sự cảm thông, đóng góp ý kiến của quý thầy cô và bạn bè
TP.Hồ Chí Minh, Tháng 03 năm 2011
Người thực hiện đề tài
Nguyễn Lâm Tú
Trang 6NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Họ tên, chữ ký của giảng viên hướng dẫn
Trang 7NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN
Họ tên, chữ ký của giảng viên phản biện
Trang 8MỤC LỤC
Trang ABSTRACT Error! Bookmark not defined
MỞ ĐẦU Error! Bookmark not defined LỜI CÁM ƠN Error! Bookmark not defined NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN Error! Bookmark not defined NHẬN XÉT CỦA GIẢNG VIÊN PHẢN BIỆN Error! Bookmark not defined DANH MỤC CÁC BẢNG, SƠ ĐỒ, HÌNH Error! Bookmark not defined DANH SÁCH CÁC TỪ VIẾT TẮT Error! Bookmark not defined
Chương 1: Tổng quan 1
1.1 Các nền tảng di động 1
1.1.1 Một vài nét 1
1.1.2 Lập trình trên thiết bị di động 2
1.2 OpenGL và OpenGL ES 2.0 3
1.2.1 OpenGL và DirectX 3
1.2.2 OpenGL ES 2.0 5
1.3 Lý do xây dựng đề tài 6
1.4 Mục tiêu đề tài 7
Chương 2: Cơ sở toán học đồ họa máy tính 10
2.1 Toán học và phép biến đổi đồ họa 10
2.1.1 Vector trong không gia gian 3 chiều 10
2.1.2 Ma trận 15
2.1.3 Mặt phẳng 24
2.1.4 Tia 26
2.2 Quá trình hiển thị đối tượng qua các hệ trục tọa độ trong không gian ba chiều (Transformation Pipline) 27
Chương 3: OpenGL ES 2.0 và ngôn ngữ lập trình OpenGL Shading 34
Trang 93.1 OpenGL ES 1.1 và OpenGL ES 2.0 34
3.2 Ngôn ngữ lập trình OpenGL Shading 37
3.2.1 Biến và kiểu biến 38
3.2.2 Vector và các thành phần của nó 40
3.2.3 Hằng số 41
3.2.4 kiểu cấu trúc 42
3.2.5 Kiểu dữ liệu mảng 42
3.2.6 Toán tử 43
3.2.7 Hàm 44
3.2.8 Câu lệnh điều khiển 46
3.2.9 Uniform 47
3.2.10 Attributes 48
3.2.11 Varyings 49
3.2.12 Tiền xử lý (Preprocessor) và chỉ thị(Directives) 50
3.2.13 Quá trình tạo và sử dụng Shader 51
Chương 4: Thiết kế, cài đặt thư viện hỗ trợ lập trình đồ họa trên OpenGL ES 2.0 53
4.1 Khái quát chung 53
4.2 Một số kỹ thuật sử dụng trong thư viện 54
4.3 Kiến trúc 57
4.4 Các lớp được xây dựng trong thư viện 62
4.4.1 Manager 62
4.4.2 Shapes 62
4.4.3 Transformation 65
4.4.4 Util 65
4.4.5 Light 66
4.4.6 Texture 67
4.4.7 Fog 68
Trang 104.4.9 EventHandler 70
4.4.10 3DMath 71
4.4.11 CSprite 71
4.4.12 MSkyBox 72
4.4.13 MVBOManager 73
4.4.14 Sử dụng thư viện và demo 74
Chương 5: Kết luận 79
5.1 Kết quả 79
5.2 Hướng phát triển 79
TÀI LIỆU THAM KHẢO 81
PHỤ LỤC 82
Trang 11DANH MỤC CÁC BẢNG, SƠ ĐỒ, HÌNH
Bảng 1.1: Chức năng của thư viện 9
Bảng 3.1: Biến và kiểu biến trong Shading Language 39
Bảng 3.2: Các toán tử 43
Bảng 3.3: Phạm vi của biến 45
Bảng 4.1: Các thành phần của thư viện và phạm vi của chúng 59
Hình1.1: Thời kỳ hậu PC 1
Hình 1.2: OpenGL 3
Hình 1.3: Direct X 4
Hình 2.1: Vector 10
Hình 2.2: Trục tọa độ tay trái và tay phải 11
Hình 2.3: Vector tiêu chuẩn 12
Hình 2.4: Cộng hai vector 13
Hình 2.5: Trừ hai vector 13
Hình 2.6: Nhân có hướng hai vector 15
Hình 2.7: Hệ tọa độ đồng nhất 19
Hình 2.8: Phép dịch chuyển ma trận 21
Hình 2.9: Phép quay ma trận 22
Hình 2.10: Phép co dãn 23
Hình 2.11: Mặt phẳng 24
Hình 2.12: Tính toán điểm gần nhất 26
Hình 2.13: Phép biến đổi hình trong không gian 3 chiều 28
Hình 2.13: Quá trình biến đổi ảnh qua các hệ trục tọa độ 28
Hình 2.14: Tọa độ đối tượng 29
Hình 2.15: Tọa độ thế giới thực 30
Hình 2.16: Hệ tọa độ mắt 30
Hình 2.17: Hệ tọa độ Projection 31
Hình 2.18: Hệ tọa độ thiết bị chuẩn 32
Hình 2.19: Tọa độ màn hình 33
Hình 3.1: Tổng quan về các phiên bản OpenGL 34
Hình 3.2: Quá trình Pipline trong OpenGL ES 1.1 35
Hình 3.3: Quá trình Pipline của OpenGL ES 2.0 36
Hình 3.4: Sử dụng fixed function và programmable 37
Hình 3.5: Cấu trúc của Shading Language 38
Hình 3.6: Cách tạo và sử dụng Shader 52
Hình 4.1: Thành phần Util 66
Trang 12Hình 4.3: Thêm thư viện vào Visual Studio 75
Hình 4.4: Demo dragon fly 76
Hình 4.5: Demo Lake 77
Hình 4.6:Demo CoverFlow 78
Sơ đồ 4.1: Observer và ứng dụng trong thư viện 56
Sơ đồ 4.2: Các package của thư viện 58
Sơ đồ 4.3: Triển khai thư viện trong ứng dụng 60
Sơ đồ 4.4: Quá trình hoạt động của ứng dụng 61
Sơ đồ 4.5: Các thành phần trong Manager 62
Sơ đồ 4.6: Các thành phần Shapes 63
Sơ đồ 4.7: Lớp lưu trạng thái đối tượng 65
Sơ đồ 4.8: Thành phần transformation 65
Sơ đồ 4.9: Thành phần quản lý ánh sáng 67
Sơ đồ 4.10: Thành phần quản lý Texture 68
Sơ đồ 4.11: Thành phần quản lý sương mù 69
Sơ đồ 4.12: Thành phần Picking 70
Sơ đồ 4.13: Thành phần nắm bắt sự kiện chuột 71
Sơ đồ 4 14: Thành phần Sprite 72
Sơ đồ 4.15: Thành phần SkyBox 73
Sơ đồ 4.16: Thành phần Vertex Buffer Object 74
Sơ đồ 5.1: Hướng đến chức năng mở rộng 80
Trang 13DANH SÁCH CÁC TỪ VIẾT TẮT
API (Application Programming Interface): Giao diện lập trình ứng dụng
C (Controller): Điều khiển
Inc (Incorporation): Tổ chức, đoàn thể
M (Model) : model
NDC (Normalized Device Cordinate): Hệ tọa độ độc lập thiết bị
GL (Graphic Language): Ngôn Ngữ đồ họa
GPU (Graphic Process Unit): Bộ xử lý đồ họa
SL (Shading Language): Ngôn ngữ Shading
PC (Personal Computer) : Máy tính cá nhân
2D (2 Demension): Hai chiều
3D (3 Demension): Ba chiều
V (View): Hiện thị, biểu diễn
VBO (Vertex Buffer Object): Đối tượng Vertex trong bộ nhớ đệm
Trang 14ký mới, mà theo Steve Jobs đó là thời kỳ hậu PC(Máy tính để bàn) Steve Jobs khẳng định như đinh đóng cột rằng PC (máy tính để bàn) đang dần trở nên lạc hậu, và rằng thời
“hậu PC” sẽ phải là những thiết bị như iPad hoặc những công nghệ số tương tự Bên cạnh Apple, một số hãng công nghệ tên tuổi khác như Google, Sam Sung, Nokia và cả Microsoft cũng có những đóng góp và chiến lược riêng của mình cho nền tảng di động
Kỷ nguyên hậu PC có vẻ như đã bắt đầu với sự tăng trưởng nhanh chóng của các thiết bị
di động không phải là PC có khả năng truy cập Internet
Hình1.1: Thời kỳ hậu PC
PC đối với nhiều người trên khắp thế giới chỉ còn là một trong vài thiết bị được sử dụng để truy cập Internet, và số lượng các ứng dụng cho giải trí và kinh doanh các loại thiết bị truy cập Internet không phải PC đang tăng nhanh.Hàng tỷ thiết bị được kết nối Internet cũng làm tăng dữ liệu và vấn đề an toàn thông tin đối với thế giới có dây cũng như không dây Kiến trúc sư trưởng phần mềm Ray Ozzie đã rời bỏ Microsoft vào tháng
Trang 1510/2010 đã cảnh báo các đồng nghiệp (tại Microsoft) rằng người khổng lồ phần mềm máy tính phải chống chọi cho thời mới – kỷ nguyên hậu PC đã bắt đầu
1.1.2 Lập trình trên thiết bị di động
Phần mềm mới ra đời cách đây 2 năm của Google đang tiến những bước nhanh nhưng vững chắc và đầy tham vọng để vượt Symbian ngay trong năm 2010 Tính riêng quý IV/2010, số lượng thiết bị Android được xuất xưởng cũng nhiều gấp đôi iPhone
Không chọn phát triển một nền tảng mở cho nhiều đối tác phần cứng như Google, Apple đi theo một hướng khác để xây dựng "hệ sinh thái di động" Với tầm nhìn thiên tài của Steve Jobs, Apple có khả năng cho ra đời các sản phẩm đẹp về thiết kế, đáng tin cậy,
dễ sử dụng và làm cho người dùng cảm thấy nó xứng đáng với số tiền họ bỏ ra Doanh số cao khiến các nhà cung cấp sẵn sàng chấp nhận các điều khoản mà Apple đưa ra và giới phát triển cũng hào hứng viết ứng dụng chạy trên thiết bị của "Quả táo", tạo nên một hệ sinh thái đầy đủ và hấp dẫn
Quyết định hợp tác giữa Nokia và Microsoft được giới chuyên môn nhận định là cơ hội "trời cho" để Android hoặc iOS bước lên bục chiến thắng Tuy vậy, Nokia hiện là công ty điện thoại lớn nhất toàn cầu và họ không bỗng dưng từ bỏ hệ điều hành di động phổ biến nhất thế giới dễ dàng như thế Hãng Phần Lan hẳn phải có niềm tin hoặc lý do riêng để chấp nhận nền tảng chỉ chiếm thị phần chưa bằng 1/7 Symbian Giám đốc điều hành Stephen Elop (cựu lãnh đạo của Microsoft) tin rằng việc bắt tay với tập đoàn phần mềm số một thế giới sẽ giúp họ đánh bại 4 đối thủ chính là Apple (iOS), Google (Android), RIM (BlackBerry) và HP (webOS) và biến phần mềm Windows Phone thành thỏi nam châm thu hút giới lập trình viên, các nhà sản xuất và người tiêu dùng
Khi Microsoft công bố Windows Phone đầu năm 2010, nhiều người cho rằng một hệ điều hành mới ra đời vào thời điểm đó là quá muộn Nhưng với một hãng đã có nhiều kinh nghiệm tham gia các cuộc chiến nền tảng, Microsoft tin không có khái niệm "trâu
Trang 16bằng cách ký kết với hàng loạt hãng phần cứng để tạo ra những hệ thống PC giá rẻ Vài năm trước, Facebook hạ gục mạng xã hội đang ngự trên đỉnh cao thế giới là MySpace khi cung cấp một nền tảng đủ sôi động để giữ chân hơn 500 triệu người sử dụng
Trong khi đó, RIM vẫn có một lượng fan trung thành dù các nhà phát triển liên tục phàn nàn rằng rất khó viết ứng dụng chạy trên dòng thiết bị này Mới đây, trang
Bloomberg đưa tin RIM đang phát triển một công nghệ cho phép thiết bị của họ có thể
chạy ứng dụng Android Còn HP lại gặp vấn đề ngược lại: Họ có một nền tảng được đánh giá cao nhưng cơ sở người dùng lại khiêm tốn khiến các chuyên gia không hào hứng xây dựng ứng dụng cho nó Do vậy, giới chuyên môn nhận định, trong thời kỳ hậu Symbian, cuộc đua sẽ chỉ xoay quanh Android và iOS nhưng vẫn để ngỏ khả năng cho sự phát triển
"xuất thần" của Windows Phone
Trang 17tổ chức phi lợi nhuận và bao gồm nhiều đại diện của các công ty OpenGL được hỗ trợ bởi tất cả các flatform game như Mac, Windows, linux, PS3… ngoại trừ Xbox
mà nó có khả năng sử dụng những tính năng mới của GPU tốt hơn OpenGL được
sử dụng cho tất cả các flatform từ Windows đến Linux Nhờ cộng đồng lớn của mình mà OpenGL thường được phát triển những tính năng nội trội sớm hơn
DirectX Ví dụ như tính năng Tessellation [11]
- OpenGL chạy được đa nền tảng: khi mà thị phần Windows đang bị cạnh tranh bởi nền tảng mở, Linux và Mac thì yêu cầu về một bộ thư viện có khả năng chạy trên tất cả các nền tảng này ngày càng cần thiết Khi đó các ứng dụng đồ họa và game
Trang 18DirectX mới không thể chạy trên hệ điều hành XP trong khi đó một nửa người dùng vẫn đang tiếp tục sử dụng hệ điều hành này [12]
- OpenGL là hướng phát triển cho tương lai: Chúng ta cần một nền tảng mở và một nền tảng mạnh mẽ để phát triển đồ họa OpenGL là một nền tảng mà các ứng dụng
có thể có giá thành rẻ nhất và chất lượng tốt nhất Ngoài ra các ứng dụng này có thể chạy trên đa nền tảng
1.2.2 OpenGL ES 2.0
Sử dụng chuẩn công nghệ tăng tốc đồ hoạ chuyên nghiệp, trò chơi Vijay Singh Pro Golf 3D do Gameloft giới thiệu có chất lượng hình ảnh sống động nhất từ trước đến nay
trên môi trường di động
Trò chơi này sẽ được tích hợp sẵn trong điện thoại P990 và M600 của Sony-Erricson Đây cũng là 2 thiết bị di động đầu tiên trên thế giới hỗ trợ công nghệ tăng tốc đồ hoạ từ phần cứng OpenGL ES, một phiên bản đặc biệt của chuẩn đồ họa chuyên nghiệp
OpenGL dành cho điện thoại di động, giao tiếp với phần mềm qua các hàm giao diện lập trình ứng dụng (Application Programming Interface - API) đã được tối ưu hoá cho việc thể hiện đồ hoạ 3 chiều trong game trên các hệ điều hành di động Symbian hoặc máy ảo BREW
Vậy OpenGL ES và OpenGL ES 2.0 là gì?
OpenGL ES là một bộ thư viện đồ họa 3D nằm trong bộ thư viện OpenGL, chuyên dành cho phát triển các ứng dụng trên thiết bị cầm tay như Mobile, PDA Được quản lý bởi tổ chức phi lợi nhuận Khronos Group, inc
Một số phiên bản khác nhau của bộ thư viên này đã ra đời Phiên bản OpenGL ES 1.0 được đặc tả dựa trên bản đặc tả của OpenGL 1.3, phiên bản OpenGL ES 1.1 được đặc
Trang 19tả trên bản đặc tả cảu OpenGL 1.5 và phiên bản OpenGL ES 2.0, là phiên bản mới nhất hiện nay, được đặc tả trên phiên bản OpenGL 2.0
OpenGL ES 2.0 được công bố vào tháng 3 năm 2007 Một đặc điểm nổi bật của phiên bản này khác hẳn với nhưng phiên bản trước, đó là nó đã bỏ các fixed function Các fixed function là các hàm tính toán đồ họa sẵn có, giúp người phát triển xử lý các phép toán và dựng hình trên không gian 3 chiều Thay vào đó là cách lập trình theo kiều Programmable Cách lập trình này bắt người phát triển phải tự viết những đoạn code tính toán các yếu tố đồ họa dựa vào ngôn ngữ Shading Language Một ngôn ngữ được sử lý bởi GPU và có cấu trúc rất giống với ngôn ngữ C
1.3 Lý do xây dựng đề tài
OpenGL ES 2.0 ra đời (2007) trở thành một thư viện lập trình mới, và có khả năng thực thi hơn hẳn phiên bản cũ Tuy nhiên, các phiên bản này hoàn toàn khác nhau Một bên là fixed function API và một bên là programmable API Như thế chúng cùng tồn tại song song với nhau Tuy nhiên theo xu hướng về hiệu quả thì OpenGL ES 2.0 ngày càng được sử dụng nhiều hơn Trong phiên bản Iphone 3G và 3GS, chỉ có 3GS là hỗ trợ OpenGL ES 2 0 Khả năng đồ họa và cấu hình của thiết bị này cũng hơn hẳn phiên bản 3G Opengles 2.0 đã mở ra một thời kỳ thay đổi trong việc lập trình đồ họa và game trên các thiết bị di động
Tuy nhiên việc lập trình trên bộ API này cũng có một số thay đổi và khó khăn cho người lập trình viên Opengles 2.0 sử dụng shader language và không có các fixed functions Điều đó buộc người lập trình viên phải tự thiết kế theo hướng sử dụng shader language và tự viết các fixed function của mình
Sự ra đời của lập trình hướng đối tượng là một bước tiến trong kỹ thuật lập trình Lập trình hướng đối tượng đã thể hiện được sự hiện đại và mạnh mẽ của mình Giúp cho việc lập trình dễ dàng và đạt hiệu quả cao hơn Tuy nhiên Khronos chỉ đưa ra các hàm API đơn thuần và đơn giản Việc kết hợp chúng cũng như viết các thành phần bổ trợ để hình thành một cấu trúc hướng đối tượng cho OpenGL ES là một việc cần thiết Một điểm
Trang 20chúng ta cần hướng đến một kiến trúc trừu tượng và phổ biến Đó cũng là một điểm mà luận văn cố gắng hướng tới
1.4 Mục tiêu đề tài
Khuôn khổ nội dung của luận văn là giúp người lập trình hướng tới một cách tiếp cận bộ thư viện này đơn giản hơn, với một cách nhìn mới mẻ từ phía lập trình hướng đối tượng Song song với việc phần cứng hỗ trợ OpenGL ES 2.0, nhiều thiết bị cũng băt đầu
hỗ trợ nền tảng C++ Lập trình hướng đối tượng là lối lập trình hiện đại, có khả năng phát triển và mở rộng mạnh mẽ
Từ tính đặc thù của OpenGL ES 2.0 và lập trình trên thiết bị di động mà có một số vấn đề đặt ra:
- Lập trình theo hướng programmable thay thế fixed function, tạo ra một cấu trúc để
sử dụng và triệu gọi Shader
- Thư viện được thiết kế theo hướng đối tượng
- Kiến trúc được hướng đến chạy trên đa nền tảng Các lớp đều phải triển khai các interface
Trong phạm vi Luận văn, chỉ hướng đến xây dựng một “Lõi” cho bộ thư viện Lõi của thư viện này đáp ứng được những yêu cầu sử dụng căn bản của người lập trình Những
yêu cầu đưa ra:
Khởi tạo tự động các thành phần của
một ứng dụng đồ họa trên nền
OpenGL ES 2.0
Vấn đề: Tạo ra chương trình như nào? Khởi tạo các đối tượng cần thiết ra sao? Tạo một bộ khung cho ứng dụng chạy
Kết nối ứng dụng với flatform cụ thể Vấn đề: Làm sao để chương trình khung định ra
trước có thể kết nối với flatform đang sử dụng
Xử lý vẽ tùy biến Vấn đề: Tùy vào từng ứng dụng mà cách tạo hàm
vẽ và thao tác vẽ khác nhau
Trang 21Xây dựng các fixed function riêng Vấn đề: OpenGL ES 2.0 không hỗ trợ fixed
function, do đó ta cần tự xây dựng các hàm của riêng mình
Xây dựng các thao tác cơ bản tính
toán trên không gian 3D
Vấn đề: Chúng ta đang làm việc và xử lý các ứng dụng 3D do đó việc tính toán với vector, ma trận
là hết sức cần thiết
Các cấu trúc toán học 3D cơ bản Vấn đề: Tự tạo lập các cấu trúc 3D cơ bản
Một số model mẫu Vấn đề: Đôi khi người lập trình cần những ví dụ
mẫu hay đối tượng đặc trưng như hình hộp, hình cầu…
Texture Vấn đề: Texture luôn là một điều quan trọng
trong ứng dụng Nhưng cũng gây không ít khó khăn khi nó xử lý tác vụ trên các bit Do đó cần thiết phải xây dựng cấu trúc và hàm xử lý
Xử lý sự kiện Vấn đề: Ứng dụng luôn tương tác với người
dùng, do đó cần thiết phải xây dựng bộ xử lý sự kiện
Xử lý picking Vấn đề: Picking là một trong những vấn đề cơ
bản, thường gặp và cũng được sử dụng nhiều nhất
Lưu lại trạng thái Vấn đề: Cần thiết phải lưu lại trạng thái để sau
này sử dụng
Một số tiện ích khác Vấn đề: Tạo dưng cấu trúc phổ thông cho tất cả
các ứng dụng: #define, định nghĩa các kiểu màu,
… Quản lý các tính năng đồ họa căn
bản: Fog, Lighting
Vấn đề: Có một cấu trúc hướn đối tượng dễ dàng tiếp xúc và thao tác trên các tính năng đồ họa căn bản
Trang 22(SkyBox) động và gần với thực tế hơn
Xây dựng cơ chế load model từ file
Trang 23Chương 2: Cơ sở toán học đồ họa máy tính
2.1 Toán học và phép biến đổi đồ họa
2.1.1 Vector trong không gia gian 3 chiều:
Vector là một đoạn thẳng có hướng Vector bao gồm 2 thuộc tính là độ dài và hướng Vector được sử dụng rộng rãi trong toán hình học, trong Vật Lý học để biểu diễn các thành phần lực hay vận tốc
Trong không gian 3 chiều, Vector được sự dụng để miêu tả về hướng Hướng của một tia, hướng của camera hay hướng của bề mặt vật (Vector pháp tuyến)
Hình 2.1: Vector
Hai Vector được coi là bằng nhau khi chúng có cùng độ dài và hướng, không phụ thuộc vào vị trí của chúng trong không gian Chính vì thế Vector cũng không phụ thuộc vào bất kỳ trục tọa độ nào
Trang 24Hệ trục tọa độ bàn tay trái và bàn tay phải
Hình 2.2: Trục tọa độ tay trái và tay phải
Có 2 hệ trục tọa độ đước sử dụng nhiều nhất trong không gian 3 chiều đó là hệ trục tọa độ bàn tay trái và bàn tay phải Hệ trục tọa độ bàn tay trái, trục Z được hướng vào trong, trong khi đó hệ trục tọa độ bàn tay phải, trục Z hướng ra ngoài
Bởi vì tọa độ của Vector không làm thay đổi các thuộc tính của Vector, do đó chúng
ta có thể di chuyển Vector trong không gian, mà song song với nó Khi mà gốc Vector trùng với gốc tọa độ thì ta gọi Vector được đặt ở vị trí tiêu chuẩn Khi Vector được đặt ở
vị trí tiêu chuẩn, ta có thể xác định Vector này theo hệ trục tọa độ hiện hành dựa vào điểm đầu của Vector
Trang 25Hình 2.3: Vector tiêu chuẩn
Vector thường được viết dưới dạng chữ thường in đậm, đôi lúc người ta cũng dùng cả chữ hoa in đậm để biểu diến Với các thành phần tương ứng tọa độ đẩu Vector khi nó được đặt ở vị trí tiêu chuẩn
u = (ux, uy), N = (Nx, Ny, Nz), c = (cx, cy, cz, cw)
Có một số Vector đặc biệt: Zero-Vector 0 =(0, 0, 0) và các Vector đơn vị lân lượt
theo trục x, y và z trong không gian 3 chiều:
i = (1, 0, 0); j = (0, 1, 0); k = (0, 0, 1)
Một số phép tính trên Vector:
So sánh 2 Vector: hai Vector chỉ bằng nhau khi chúng có độ lớn và hướng như nhau
Tính độ lớn của 1 Vector: cho Vector u = (ux, uy, uz), độ lớn của Vector được tính như sau:
Chuẩn hóa một Vector: Chuẩn hó một Vector nghĩa làm cho Vector có độ lớn bằng 1 mà
hướng vẫn không đổi Ta chuẩn hóa một Vector như sau:
Trang 26Phép cộng cộng 2 Vector: hai Vector u = (ux, uy, uz) và v = (vx, vy, vz) có phép cộng là
u + v = (ux + vx, uy + vy, uz + vz)
Hình 2.4: Cộng hai vector
Phép trừ 2 Vector: Cũng tương tự như phép cộng 2 Vector, phép trừ 2 Vector được tính
bằng cách cộng với Vector nghịch đảo của Vector trừ
u - v = u + (- v ) = (ux - vx, uy - vy, uz - vz)
Hình 2.5: Trừ hai vector
Trang 27Phép nhân Vector với một số:Chúng ta có thể nhân một Vector với một số, kết quả của
phép nhân sẽ làm thay đổi thuộc tính của Vector:
- Độ lớn Vector sẽ thay đổi một số lần bằng với giá trị của số nhân k
- Chiều của Vector phụ thuộc vào dấu của k Nếu k>=0 thì chiều của Vector không
đổi Nếu k < 0, chiều của Vector kết quả sẽ ngược với chiều của Vector ban đầu.(Đảo chiều)
ku = (kux, kuy, kuz)
Nhân vô hướng 2 Vector: Nhân vô hướng là một trong 2 phép nhân của Vector Kết quả
trả về là một số Công thức được tính như sau:
u*v = uxvx + uyvy + uzvz = s Công thức trên không mang tính hình học, chúng ta có thể sử dụng một công thức khác, mang nhiều ý nghĩa về hình học:
u*v = |u||v|cos(u,v) Công thức trên nói lên rằng: giá trị của phép nhân vô hướng 2 Vector chính bằng phép nhân độ lớn của 2 Vector với cosin góc giữa 2 Vector đó Khi u, v là các Vector đơn vị thì độ lớn phép nhân 2 Vector chính bằng cosin của góc giữa 2 Vector đó
Từ công thức trên ta có thể suy ra một số quên hệ dựa trên kết quả phép nhân:
- u*v = 0 u ┴ v
- u*v > 0 góc giữa hai Vector nhỏ hơn 90 độ
- u*v < 0 góc giữa hai Vector lớn hơn 90 độ
Phép nhân có hướng giữa hai Vector: Phép nhân thứ hai là phép nhân có hướng giữa 2 Vector Không giống như phép nhân vô hướng, kết quả của phép nhân có hướng là một Vector
p = u*v = ((uyvz - uzvy), (uzvx - uxvz), (uxvy - uyvx))
px = uyvz - uzvy
py = uzvx - uxvz
pz = uxvy - uyvx
Trang 28Hình 2.6: Nhân có hướng hai vector
Trang 29Các phép toán trên ma trận:
Hai ma trận bằng nhau, nhân với một số và cộng 2 ma trận:
- Hai ma trận được coi là bằng nhau khi chúng có cùng chiều và các entry tương ứng như nhau
- Từ phép cộng 2 ma trận ta cũng có thể suy ra được phép trừ hai ma trận Phép trừ 2
ma trận được thực hiện bằng cách cộng ma trận bị trừ với ma trận trừ nhân với (-1) Phép trừ được thực hiện trên từng cặp thành phần tương ứng Kết quả của phép tính
là một ma trận
Phép nhân hai ma trận:
Nhân hai ma trận là một phép tính quan trọng và được dùng nhiều trong đồ họa 3 chiều Thông qua phép nhân hai ma trận ta có thể biến đổi Vector hay biến đổi hình học trong không gian 3 chiều
Trang 30của ma trân B
Ma trận kết quả C có các thành phần được tính theo công thức: cij = ai * bj
Phép nhân trong ma trận không có tính chất hoán vị do đó ma trận trong phép nhân AB khác với ma trận trong phép nhân BA (Ngoại trừ nhân với ma trận đơn vị)
Giả sử ma trân A có chiều là m * n và ma trân B có chiều là n * p thì ma trận kết quả C
có chiều là m * p
Ma trận đơn vị:có một ma trận đặc biệt được gọi là ma trận đơn vị Ma trận đơn vị là ma
trận trong đó các thành phần của ma trận đều bằng 0 riêng các thành phần trên đường chéo chính đều có giá trị bằng 1
Trong phép nhân có ma trận đơn vị, ta có thể hoán vị hai ma ma trận cho nhau
MI = IM = M Trong đó I là ma trận đơn vị
Trang 31Ma trận nghịch đảo:Trong toán ma trận, không có phép chia tuy nhiên lại có phép nhân
nghịch đảo Phép nhân với ma trận nghịch đảo sẽ biến đổi một ma trận về ma trận đơn vị Một số đặc điểm quan trọng của ma trận nghịch đảo:
- Chỉ có ma trận vuông (số cột và số hàng bằng nhau) thì mới có ma trận nghịch đảo
- Ma trận nghịch đảo của ma trận M (n*n) là một ma trận (n*n) và được kí hiệu là M-1
- Không phải bất kỳ ma trận vuông nào cũng có ma trận nghịch đảo
- Phép nhân ma trận với ma trận nghịch đảo của nó cho kết quả là một ma trận đơn vị Trong khi biến đổi với ma trận, do không thể thực hiện phép chia nên ma trận nghịch đảo
có vai trò quan trọng trong việc tìm ra các ma trận thành phần hay thao tác chuẩn hóa kết quả Để tìm ra ma trân p trong phép nhân với ma trận R, ta nhân kết quả của phép nhân
đó với ma trận nghịch đảo R-1
p’ = p*R p = p’ * R-1
= p*(R*R-1)
Ma trận đảo ngược: Ma trận đảo ngược được tạo thành khi ta hoán đổi vị trí của hàng
và cột ma trận với nhau Như vậy ma trận M (m * n) sau khi đảo ngược sẽ tạo ra ma trận
MT có chiều là (n * m)
Ứng dụng của ma trận trong biến đổi đồ họa: Ma trận có vai trò quan trọng trong các
phép biến đổi đồ họa 3 chiều Thành phần cơ bản của đồ họa 3 chiều là các Vertex và tam giác Các thao tác dịch chuyển, quay hay tịnh tiến chúng đều phụ thuộc vào các ma trận
sử dụng trong trục tọa độ hiện hành của chúng Một hình ảnh chỉ được hiện thị lên màn hình khi nó được thông qua quá trình biến đổi hình (Pipline) nhờ vào các ma trận Như vậy ma trận được sử dụng trong việc tính toán trong không gian 3 chiều
Trước khi đi vào một số phép biến đổi cơ bản, chúng ta sẽ xem xét hệ trục tọa độ đồng
nhất (homogeneous)
Trang 32Trong hình học Euclidean thì 2 đường thẳng song song sẽ không cắt nhau, chúng sẽ không gặp nhau ở bất kỳ điểm nào Điều này rất quen thuộc đối với nhiều người
Hình 2.7: Hệ tọa độ đồng nhất
Tuy nhiên điều này là không hoàn toàn đúng, khi không gian được xét đến là không gian hình chiếu(projection space).Trên hình là 2 đường ray xe lửa 2 đường ray này song song với nhau, nhưng chúng gặp nhau ở một điểm xác định trong không gian hình chiếu Hình học Euclidean có thể miêu tả dạng hình học 2D, 3D tốt tuy nhiên nó không thể miêu
tả được hình học trong không gian hình chiếu
Trong hình học Euclidean thì một điểm được biểu diễn dạng (x, y) Một điểm ở rất xa thì
sẽ được biểu diễn như nào? Dựa vào cách biểu diễn trong Euclidean thì nó có dạng (∞,∞) Tuy nhiên với cách biểu diễn này thì nó không mang ý nghĩa gì trong hình học Euclidean Toán hình học cần tìm ra một giải pháp cho vấn đề này
Giải pháp: Hệ trục tọa độ đồng nhất
Hệ trục tọa độ đồng nhất được giới thiệu bởi August Ferdinand Möbius, việc tính toán với hình học và đồ họa trong không gian hình chiếu được thực hiện Hệ trục tọa độ đồng nhất nhằm đến việc biểu diễn hệ tọa độ N-chiều với N+1 thành phần
Trang 33Để biến đổi một điểm trong không gian 2D dạng (x,y) sang hệ tọa độ đồng nhất ta chỉ cần
thêm thành phân w Như thế một điểm trong hệ tọa độ 2D Euclipdean (X,Y) được chuyển
sang hệ trục tọa độ đồng nhất sẽ có dạng (x, y, w) Việc biến đổi này được cho bởi công thức:
X = x/w; và Y = y/w
Ta có thể thấy rằng, các điểm(1,2,3), (2,4,6) và (4, 8,12) chuyển qua hệ tọa độ Euclidean
là điểm(1/3, 2/3) Người ta nói rằng các điểm này “đồng nhất” vì chúng cùng biểu diễn một điểm trong không gian Euclidean(hay Cartesian)
Cho phương hệ phương trình đường thẳng trong không gian Euclidean:
Hệ phương trình không có nghiệm vì C ≠ D Trong trường hợp C = D thì 2 đường thẳng
là trùng nhau
Ta hay viết lại hệ trên dưới dạng sau:
Trang 34Hệ phương trình trở thành: (C - D)w = 0 Ta có vô số nghiệm dạng (x, y, 0) với w = 0 Như vậy hai đường thẳng song song với nhau gặp nhau tại (x,y,0) đó là điểm cần xác định
Hệ tọa độ đồng nhất là khái niệm cơ bản và thường được dùng đến trong đồ họa máy tính, ví dụ như trong việc chiếu cảnh 3D lên mặt phẳng 2D
Phép dịch chuyển
Hình 2.8: Phép dịch chuyển ma trận
Ta sẽ dịch chuyển điểm từ vị trí original đến vị trí final một đoạn dx theo trục x và dy theo trục y Ma trân dịch chuyển có dạng sau:
Trang 35Một điểm có tọa độ (x, y, z, 1) ban đầu, sau phép nhân ma trận dịch chuyển sẽ có dạng (x+dx, y + dy, z+dz,1)
Phép quay:
Hình 2.9: Phép quay ma trận
Trong không gian 3D thì vật có thể quay theo 3 trục là x, y và z Các ma trận quay của các trục là:
Trang 36Phép biến dạng hình:
Hình 2.10: Phép co dãn
Hình có thể được biến dạng theo cả 3 trục x, y, z thông qua ma trận biến đổi hình sau:
Ma trận nghịch đảo của nó được tính theo công thức:
Trang 37Đặc điểm, tính chất:
- Khi Vector n có độ dài bằng độ dài Vector đơn vị, thì d = -n.po là khoảng cách ngắn nhất từ trục tọa độ tới mặt phẳng
Trang 38- n.po = d Cách thứ hai: chúng ta có thể xác định được một mặt phẳng thông qua 3 điểm nằm trên mặt phẳng đó Cho 3 điểm: p0, p1, p2, chúng ta xây dựng 2 Vector:
Chuẩn hóa mặt phẳng:đôi khi ta có một mặt phẳng và muốn chuẩn hóa Vector pháp
tuyến của nó Chúng ta có thể nghĩ rằng sẽ chuẩn hóa Vector này giống như chuẩn hóa các Vector thông thường Nhưng hãy để ý rằng d = -n.p0 do đó khi ta chuẩn hóa Vector pháp tuyến đồng nghĩa với việc tính toán lại giá trị của d
Ta thấy rẳng:
Như vậy muốn chuẩn hóa mặt phẳng (n, d) ta có công thức chuẩn hóa sau:
Trang 39Tìm điểm gần nhất với một điểm cho trước mà nằm trên mặt phẳng:
Trong đó p 0 là điểm gốc của tia, u là hướng của tia va t la tham biến Tham biến có đoạn
giá trị [0; ∞] để miêu tả một tia
Trang 40Chúng ta muốn biết liệu mặt phẳng và tia có giao nhau không và điểm giao nhau có tọa
độ bao nhiêu Từ phương trình của tia và mặt phẳng ta có:
n.p(t) + d = 0 n.(p0 + tu) + d = 0 n.p0 + n.tu + d = 0 n.tu = - d - (n.p0) t(n.u) = - d – (n.p0)
t = [- d- (n.p0)] / nu
từ đó ta có công thức tính điểm giao nhau giữa tia và mặt phẳng là:
2.2 Quá trình hiển thị đối tượng qua các hệ trục tọa độ trong không gian ba chiều (Transformation Pipline)
Tổng quan
Quá trình hiện thị hình ảnh 3 chiều trên màn hình thực chất là quá trình biến đổi hình ành 3 chiều sang hình anh 2 chiều có thể biểu diễn được trên màn hình Quá trình này tương tự như qua trình chụp hình của một máy ảnh