Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 59 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
59
Dung lượng
2,02 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƢỜNG ĐẠI HỌC SƢ PHẠM KHOA TIN HỌC Đề tài: XÂY DỰNG GAME HIGHWAY BẰNG OPENGL ES 2.0 Giáo viên hướng dẫn Sinh viên thực Lớp : ThS Lê Thị Bích Hồng : Nguyễn Thị Ngọc Thúy : 10CNTT4 Đà Nẵng, 05/2014 Xây dựng game Highway OpenGL ES 2.0 LỜI CẢM ƠN Lời em xin bày tỏ lòng biết ơn sâu sắc đến tất quý thầy cô khoa Tin học trường đại học Sư phạm – Đại học Đà Nẵng tận tình dạy dỗ, truyền đạt cho em kiến thức quý giá suốt năm học trường, tiền đề sở giúp cho em thực đồ án Xin chân thành cảm ơn cô Lê Thị Bích Hồng tận tình bảo, hướng dẫn giúp đỡ cho em suốt trình thực để hoàn thành đồ án thời hạn Trong suốt trình thực đồ án, cố gắng để hồn thành, nhiên, kinh nghiệm vốn kiến thức hạn chế nên khơng tránh khỏi thiếu sót Em mong nhận góp ý, nhận xét thầy cô bạn Em xin chân thành cảm ơn ! Sinh viên Nguyễn Thị Ngọc Thúy Xây dựng game Highway OpenGL ES 2.0 LỜI CAM ĐOAN Em xin cam đoan: Những nội dung báo cáo em thực hướng dẫn trực tiếp Lê Thị Bích Hồng Mọi tham khảo dùng báo cáo trích dẫn rõ ràng tên tác giả, tên cơng trình, thời gian địa điểm công bố Mọi chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trái, em xin chịu hoàn toàn trách nhiệm Sinh viên thực Nguyễn Thị Ngọc Thúy Xây dựng game Highway OpenGL ES 2.0 MỤC LỤC MỞ ĐẦU CHƢƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Giới thiệu thƣ viện đồ họa OpenGL 1.1.1 OpenGL gì? 1.1.2 Cấu trúc lệnh OpenGL 1.2 Giới thiệu thƣ viện đồ họa OpenGL ES 1.2.1 OpenGL ES gì? 1.2.2 Hệ trục tọa độ thiết bị chuẩn NDC 1.3 Các khái niệm đồ họa 1.4 Mô hình đƣờng ống – Quá trình vẽ tam giác 1.4.1 Mơ hình đƣờng ống 1.4.2 Quá trình vẽ tam giác 1.5 Các thành phần đối tƣợng 10 1.5.1 Shader 10 1.5.2 Model 13 1.5.3 Texture 14 1.6 Các phép biến đổi Affine 3D 14 1.6.1 Hệ tọa độ đồng 14 1.6.2 Phép biến đổi tịnh tiến 15 1.6.3 Phép biến đổi quay quanh trục 15 1.6.4 Phép biến đổi tỉ lệ 16 1.6.5 Thứ tự phép biến đổi 17 1.6.6 Phép chiếu 18 1.7 Hệ tọa độ 3D đối tƣợng camera 19 1.7.1 Hệ tọa độ 3D 19 1.7.2 Hệ tọa độ đối tƣợng 20 1.7.3 Hệ tọa độ giới thực 20 1.7.4 Hệ tọa độ camera 21 Xây dựng game Highway OpenGL ES 2.0 1.8 Tổng quan Android 23 1.8.1 Android gì? 23 1.8.2 Các tính mở Android 23 1.8.3 Một số phiên Android 23 CHƢƠNG 2: PHÂN TÍCH THIẾT KẾ GAME HIGHWAY 25 2.1 Kịch game 25 2.2 Phân tích yêu cầu 25 2.3 Đặc tả chức game 26 2.3.1 Biểu đồ Use case 26 2.3.2 Mô tả Actor 27 2.4 Xây dựng game engine 27 2.4.1 Trạng thái game vòng lặp game 27 2.4.2 Xây dựng cấu trúc game 29 2.4.3 Xử lý va chạm đối tƣợng 35 2.5 Xây dựng cầu nối game Windows Android 36 2.5.1 Trên Windows 36 2.5.2 Trên Android 37 2.5.3 Port từ C++ qua Android 39 CHƢƠNG 3: MỘT SỐ KẾT QUẢ ĐẠT ĐƢỢC 41 KẾT LUẬN 45 TÀI LIỆU THAM KHẢO 46 PHỤ LỤC 47 Xây dựng game Highway OpenGL ES 2.0 DANH SÁCH TỪ VIẾT TẮT STT Mô tả Chữ viết tắt API Viết tắt Application Programming Interface có nghĩa phƣơng thức lập trình ứng dụng Game Các trị chơi nói chung thiết bị điện tử Game Engine Mơ hình thiết kế, xây dựng thành phần cần thiết để xây dựng game hồn chỉnh 3D, 2D Khơng gian ba chiều hai chiều OpenGL Một thƣ viện lập trình đồ họa 3D 2D OpenGL ES Một thƣ viện lập trình đồ họa 2D, 3D dành cho thiết bị di động, cầm tay… GPU Graphic Processing Unit có nghĩa đơn vị xử lý đồ họa Render Pipline Là trình GPU để hồn tất vẽ thành phần hình học Texture Các hình ảnh 2D 10 Texture Cube Map Một loại texture có sáu mặt hình lập phƣơng, mặt hình ảnh 11 Shader Một loại chƣơng trình dùng để xử lý đỉnh phân mảnh cho GPU hoạt động 12 Vertex Đỉnh tam giác 13 Fragment Phân mảnh mặt 14 GLUT Glut thƣ viện cung cấp hàm để tạo cửa sổ Window cho chƣơng trình 15 NDC Là môi trƣờng thiết bị chuẩn (NDC: Normal Device Context) Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang i Xây dựng game Highway OpenGL ES 2.0 DANH MỤC CÁC HÌNH ẢNH Hình 1: Sự khác quy tắc bàn tay trái bàn tay phải Hình 2: Tọa độ NDC Hình 3: Hệ màu RGB Hình 4: Mơ hình đƣờng ống OpenGL ES 2.0 Hình 5: Quá trình lắp ráp đỉnh Hình 6: Biên dịch Biên dịch Vertex shader Fragment shader 13 Hình 7: Mơ hình 3D 13 Hình 8: Kết hợp mơ hình với hình ảnh tạo nhân vật 14 Hình 9: Tịnh tiến điểm 15 Hình 10: Phép quay quanh trục 16 Hình 11: Phép chiếu tỉ lệ 17 Hình 12: Áp dụng phép quay sau áp dụng phép biến đổi tỷ lệ 17 Hình 13: Áp dụng phép biến đổi tỷ lệ trƣớc áp dụng phép biến đổi quay 17 Hình 14: Áp dụng phép biến đổi tịnh tiến trƣớc quay 18 Hình 15: Áp dụng phép biến đổi quay trƣớc tịnh tiến 18 Hình 16: Hình ảnh phép chiếu phối cảnh 19 Hình 17: Hình ảnh phép chiếu vng góc 19 Hình 18: Hệ trục tọa độ 20 Hình 19: Đối tƣợng hệ tọa độ 20 Hình 20: Đối tƣợng hệ tọa độ giới thực 21 Hình 21: Các đối tƣợng giới thực dƣới góc nhìn camera 22 Hình 22: Sơ đồ biến đổi đối tƣợng vào NDC 22 Hình 23: Sơ đồ Use case 26 Hình 24: Mơ hình chuyển đổi trạng thái game 28 Hình 25: Vịng lặp game 29 Hình 26: Cấu trúc game engine 30 Hình 27: Lớp dẫn xuất lớp Object 30 Hình 28: Sơ đồ cấu trúc mối quan hệ Resource manager Scene manager 32 Hình 29: Lớp dẫn xuất lớp game state 34 Hình 30: Khối hộp bao quanh đối tƣợng 35 Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang ii Xây dựng game Highway OpenGL ES 2.0 DANH MỤC CÁC BẢNG Bảng 1: Một số kiểu liệu OpenGL Bảng 2: Một số kiểu liệu 10 Bảng 3: Bảng phân loại biến 11 Bảng 4: Đặc tả Actor 27 Bảng 5: Đặc tả Use case 27 Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang iii Xây dựng game Highway OpenGL ES 2.0 MỞ ĐẦU LÝ DO CHỌN ĐỀ TÀI Ngày ngành công nghệ phần mềm phát triển ngành công nghiệp phần mềm điện thoại di động khơng nằm ngồi xu Có thể nói ngành cơng nghiệp phần mềm cịn non trẻ Vì việc nghiên cứu phát triển ứng dụng di động cần thiết Trong loại hình giải trí game mang lại nhiều lợi nhuận tƣơng đối cao Game lĩnh vực ln có nhu cầu cao thu hút lƣợng lớn ngƣời dùng không phân biệt độ tuổi Để hiểu rõ đƣợc kỹ thuật phát triển game thiết bị di động, đặc biệt xây dựng đồ họa 3D phục vụ nhu cầu học tập giải trí cho thân tơi chọn đề tài: “Xây dựng game Highway OpenGL ES 2.0” MỤC ĐÍCH CỦA ĐỀ TÀI - Cũng cố lại kiến thức học lập trình hƣớng đối tƣợng với ngơn ngữ C++, phân tích thiết kế tốn, trí tuệ nhân tạo, phân tích thiết kế hƣớng đối tƣợng… - Nghiên cứu tìm hiểu số tảng thông dụng nhƣ Windows, Android - Nghiên cứu kỹ thuật lập trình đồ họa 3D thực thƣ viện lập trình đồ họa Opengl ES - Nghiên cứu cấu trúc game, từ xây dựng game hoàn chỉnh PHƢƠNG PHÁP NGHIÊN CỨU - Tìm kiếm thơng tin liên quan tới q trình nghiên cứu từ thực tiễn, sách báo, tham khảo Internet - Tìm hiểu thƣ viện đồ họa 3D OpenGL ES - Tìm hiểu kỹ thuật lập trình q trình thực tập cơng ty Gameloft Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang Xây dựng game Highway OpenGL ES 2.0 Ý NGHĨA KHOA HỌC THỰC TIỄN - Đề tài góp phần nghiên cứu tạo game nhỏ sở game engine xây dựng đƣợc - Làm nguồn tƣ liệu cho bạn sinh viên, lập trình viên muốn tham gia tìm hiểu trình xây dựng game đơn giản CẤU TRÚC LUẬN VĂN Ngoài phần mở đầu kết luận, luận văn đƣợc tổ chức thành ba chƣơng: Chƣơng 1: Cơ sở lý thuyết Ở chƣơng giới thiệu thƣ viện đồ họa OpenGL ES 2.0, khái niệm đồ họa bản, thành phần đối tƣợng, phép biến đổi Affine 3D Sau áp dụng lý thuyết để xây dựng game cách vẽ đối tƣợng hình cách phù hợp Chƣơng 2: Phân tích thiết kế game Highway Ở chƣơng trình bày kịch game, phân tích yêu cầu đặc tả chức từ xây dựng game engine, xây dựng cầu nối game Windows Android Chƣơng 3: Một số kết đạt đƣợc Trình bày đƣợc số hình ảnh tiêu biểu game Highway Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang Xây dựng game Highway OpenGL ES 2.0 } Hàm kiểm tra lỗi bool Game::TestEGLError(HWND hWnd, char* pszLocation) { EGLint iErr = eglGetError(); if (iErr != EGL_SUCCESS) { TCHAR pszStr[256]; sprintf_s(pszStr, ("%s failed (%d).\n"), pszLocation, iErr); MessageBox(hWnd, pszStr, ("Error"), MB_OK|MB_ICONEXCLAMATION); return false; } return true; } Vòng lặp game int main() { Game* game = Game::GetInstance(); game->Init(800, 480); game->SetState(new LoadingState()); while ( game->IsRuning() ) { game->Update(); } Game::FreeInstance(); ResourceManager::FreeInstance(); } 2.5.2 Trên Android Khởi tạo môi trƣờng xử lý kiện Android cung cấp lớp GLSurfaceView cho khởi tạo môi trƣờng hoạt động cho OpenGL ES private static class Renderer implements GLSurfaceView.Renderer { public void onDrawFrame(GL10 gl) { GL2JNILib.step(); } public void onSurfaceChanged(GL10 gl, int width, int height) { GL2JNILib.init(width, height); } public void onSurfaceCreated(GL10 gl, EGLConfig config) { } } Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 37 Xây dựng game Highway OpenGL ES 2.0 Lớp GLSurfaceView.Render cung cấp cho ta hàm onDrawFrame dùng để vẽ, onSurfaceChanged dùng để tiếp nhận xử lý có thay đổi mơi trƣờng vẽ, nhƣ kích thƣớc, trạng thái… hàm onSurfaceCreated đƣợc gọi đến lần môi trƣờng vẽ đƣợc thực Khai báo hàm native ứng dụng Android: public public public public static static static static native native native native void void void void BridgeJ2C(GL2JNILib obj); init(int width, int height); step(); pointer(int type, int x, int y, int x2, int y2); Ở chƣơng trình C++ ta thực hàm native tƣơng ứng: extern "C" { JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_init(JNIEnv * env, jobject obj, jint width, jint height); JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_step(JNIEnv * env, jobject obj); JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_pointer(JNIEnv * env, jobject obj, jint type, jint x, jint y, jint x2, jint y2); void Java_com_drybones_evate_GL2JNILib_BridgeJ2C( JNIEnv* env, jobject thiz, jobject obj ) { bridge = obj; jclass glViewClass; (jVM)->GetEnv((void**) &env, JNI_VERSION_1_6); bridge = (jobject)(env)->NewGlobalRef( obj); glViewClass = (env)->GetObjectClass( bridge); } }; JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_init(JNIEnv * env, jobject obj, jint width, jint height) { Game* game = Game::GetInstance(); game->Init(width, height); game->SetState(new LoadingState()); } JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_step(JNIEnv * env, jobject obj) { Game::GetInstance()->Update(); } JNIEXPORT void JNICALL Java_com_drybones_evate_GL2JNILib_pointer(JNIEnv * env, jobject obj, jint type, jint x, jint y, jint x2, jint y2) { if (type == 1) { InputManager::GetInstance()->OnTouch(POINTER_DOWN, x, y, x2, y2); } else if (type == 2) Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 38 Xây dựng game Highway OpenGL ES 2.0 { InputManager::GetInstance()->OnTouch(POINTER_UP, x, y, x2, y2); } else if (type == 3) { InputManager::GetInstance()->OnTouch(POINTER_DRAGGED, x, y, x2, y2); } } 2.5.3 Port từ C++ qua Android Cần tải tool sau cài đặt làm môi trƣờng để tiến hành port qua Android http://developer.android.com/tools/sdk/ndk/index.html http://developer.android.com/sdk/index.html http://mirrors.digipower.vn/apache//ant/binaries/apache-ant-1.9.3-bin.zip http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads1880260.html Trƣớc tiên cần Update project để để tạo file build.xml Vào cửa sổ chứa thƣ mục android cần port qua bật cửa sổ cmd gõ dòng lệnh sau: Xây dựng file so: Android đƣợc biết đến nhƣ tảng phát triển ngôn ngữ java Tuy nhiên hồn tồn phát triển ứng dụng ngôn ngữ C++ Nhiệm vụ xây dựng tất mã C++ vào file định dạng “.so” để java đọc nhƣ thƣ viện Ta thực lệnh sau: Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 39 Xây dựng game Highway OpenGL ES 2.0 Kết sau thực hiện: file “.so” đƣợc build Build để tạo file apk Sau tạo file apk ta dùng file để cài đặt lên thiết bị Android để chơi TÓM TẮT CHƢƠNG Chƣơng trình bày việc phân tích u cầu game đặc tả chức từ xây dựng game, thiết lập liên kết game tử Windows Android Trên sở đƣa đƣợc cách xây dựng game engine đơn giản để xây dựng game Highway biết đƣợc cách thức để port game từ ngôn ngữ C++ qua java Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 40 Xây dựng game Highway OpenGL ES 2.0 CHƢƠNG 3: MỘT SỐ KẾT QUẢ ĐẠT ĐƢỢC Màn hình loading game Màn hình menu game Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 41 Xây dựng game Highway OpenGL ES 2.0 Màn hình chức chọn xe Màn hình game play Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 42 Xây dựng game Highway OpenGL ES 2.0 Màn hình sub menu Màn hình sub menu Màn hình ngƣời chiến thắng Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 43 Xây dựng game Highway OpenGL ES 2.0 Màn hình gameover Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 44 Xây dựng game Highway OpenGL ES 2.0 KẾT LUẬN Kết đạt đƣợc - Cơ nắm đƣợc ngơn ngữ lập trình C++ - Nắm đƣợc số kỹ thuật phát triển game điện thoại di động - Tìm hiểu đƣợc cấu trúc game, cách xây dựng game đơn giản Xây dựng đƣợc cấu trúc game giúp ngƣời chơi dễ dàng tiếp cận sử dụng - Xây dựng đƣợc game thử nghiệm sử dụng game engine xây dựng kết hợp với hiệu ứng kỹ thuật tìm hiểu hệ điều hành Windows Android Hạn chế - Giao diện chƣa đẹp - Chƣơng trình chạy cịn chƣa nhanh - Windows chƣa có âm Android liệu chƣa đƣa đƣợc vào asset - Do thời gian có hạn nên chƣa thể áp dụng hết kỹ thuật đƣợc học vào thực game Hƣớng phát triển - Phát triển thêm nhiều mức độ chơi khó hơn, mang tính cạnh tranh - Phát triển game chạy nhiều hệ điều hành hơn, không dừng lại hệ điều hành Windows Android - Tìm hiểu tiếp cận thêm số tảng khác nhƣ iOS, Windows Phone… Kết luận - Thông qua đồ án tốt nghiệp này, em hiểu đƣợc kỹ thuật lập trình đồ họa 3D thực thƣ viện lập trình đồ họa Opengl ES 2.0 Đặc biệt hơn, quy trình làm ứng dụng game đơn giản Với tiền đề tạo cho em tảng kiến thức để tự tin tham gia vào dự án sau trƣờng - Đối với game Highway hi vọng góp phần làm đa dạng thêm loại hình game Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 45 Xây dựng game Highway OpenGL ES 2.0 TÀI LIỆU THAM KHẢO [1] Addison Wesley – OpenGL ES 2.0 Programming Guide [2] Tài liệu công ty Gameloft-3dBasic&OpenGLES 2.0 - 1.Concepts-BasicGLSL [3] GettingStartedCpp [4] Phạm Văn Ất - C++ lập trình hướng đối tượng [5] http://opengles-android.blogspot.com/2012/10/opengl-es20-for-android.html [6] http://vi.wikipedia.org/wiki/Android Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 46 Xây dựng game Highway OpenGL ES 2.0 PHỤ LỤC Phƣơng thức tạo hình ảnh: void Texture::LoadTexture2D(const char* path, int tiling) { vector texturePaths; // file texture file tga if (strstr(path, "tga")) { numberOfParts = 1; string tmpStr; tmpStr.assign(path); texturePaths.push_back(tmpStr); } // file texture file mtl else if (strstr(path, "mtl")) { vector materialNames; vector color; loadMTL(path, materialNames, texturePaths, color); numberOfParts = materialNames.size(); } this->textureId = new GLuint[numberOfParts]; for (register int i = 0; i < numberOfParts; i++) { glGenTextures(1, &this->textureId[i]); glBindTexture(GL_TEXTURE_2D, this->textureId[i]); int bpp = 0; this->TILING = tiling; char *imageData = LoadTGA(texturePaths[i].data(), &imgW, &imgH, &bpp); int colorType = 0; if (bpp == 24) { colorType = GL_RGB; } else { colorType = GL_RGBA; } glTexImage2D(GL_TEXTURE_2D, 0, colorType, imgW, imgH, 0, colorType, GL_UNSIGNED_BYTE, imageData); // giải phóng vùng nhớ SAFE_DEL_ARRAY(imageData); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Tạo chuổi Mipmap glGenerateMipmap(GL_TEXTURE_2D); if (tiling == REPEAT) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); } else if (tiling == CLAMP_TO_EDGE) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } glBindTexture(GL_TEXTURE_2D, 0); } } Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 47 Xây dựng game Highway OpenGL ES 2.0 Phƣơng thức tạo texture cube map: void Texture::LoadCubeTexture(char imagePath[6][100], int tiling) { numberOfParts = 1; this->textureId = new GLuint[numberOfParts]; GLint width[6], height[6], bpp[6]; char *imageData[6]; for (int i = 0; i < 6; i++) { imageData[i] = LoadTGA(imagePath[i], &width[i], &height[i], &bpp[i]); } //buffer glGenTextures(1, &textureId[0]); glBindTexture(GL_TEXTURE_CUBE_MAP, textureId[0]); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, tiling); glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, tiling); // Load mặt khối lập phương bên phải glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, width[0], width[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[0]); // Load mặt khối lập phương bên trái glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, width[1], height[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[1]); // Load mặt khối lập phương phía glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, width[2], height[2], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[2]); // Load mặt khối lập phương phía glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, width[3], height[3], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[3]); // Load mặt khối lập phương mặt trước glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, width[4], height[4], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[4]); // Load mặt khối lập phương mặt sau glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, width[5], height[5], 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData[5]); glBindTexture(GL_TEXTURE_CUBE_MAP, 0); for (int j = 0; j < 6; j++) { delete imageData[j]; } } Phƣơng thức vẽ đối tƣợng 3D void GameObject::Render() { glUseProgram(shader->program); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); for (int i = 0; i < model->GetNumberOfParts(); i++) { glBindBuffer(GL_ARRAY_BUFFER, this->model->GetVboId1()[i]); if(shader->a_positionLoc != -1) { glEnableVertexAttribArray(shader->a_positionLoc); glVertexAttribPointer(shader->a_positionLoc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, position)); } Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 48 Xây dựng game Highway OpenGL ES 2.0 if(shader->a_uvLoc != -1) { glEnableVertexAttribArray(shader->a_uvLoc); glVertexAttribPointer(shader->a_uvLoc, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, uv)); } if (shader->a_colorLoc != -1) { glEnableVertexAttribArray(shader->a_colorLoc); glVertexAttribPointer(shader->a_colorLoc, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, color)); } for(GLuint j = 0; j < textureID.size(); j++) { if(shader->u_texture[j] != -1) { glActiveTexture(GL_TEXTURE0 + j); glBindTexture(GL_TEXTURE_2D, textureID[j][i]); glUniform1i(shader->u_texture[j], j); } } if(shader->u_cubeLoc != -1) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_CUBE_MAP, this->cubeID); glUniform1i(shader->u_cubeLoc, 1); } if(shader->a_normLoc != -1){ glEnableVertexAttribArray(shader->a_normLoc); glVertexAttribPointer(shader->a_normLoc, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void *) offsetof(Vertex, normal)); } if(shader->u_cameraLoc != -1){ glUniform3f(shader->u_cameraLoc, camera->GetPosition().x, camera>GetPosition().y, camera->GetPosition().z); } if(shader->u_WLoc!= -1) { glUniformMatrix4fv(shader->u_WLoc,1,GL_FALSE,(float*) GetWorldMatrix()); } if ( shader->u_wvpLoc != -1 ) { glUniformMatrix4fv(shader->u_wvpLoc, 1, GL_FALSE,(float*) &mvpMatrix); } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->model->GetIboId1()[i]); glDrawElements(GL_TRIANGLES, this->model->GetIndexSize()[i], GL_UNSIGNED_INT, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); } glDisable(GL_DEPTH_TEST); glDisable(GL_BLEND); } Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 49 Xây dựng game Highway OpenGL ES 2.0 NHẬN XÉT CỦA CÁN BỘ HƢỚNG DẪN Đà Nẵn , n ày … , thán …… , năm 2014 Cán hƣớng dẫn Nguyễn Thị Ngọc Thúy – 10CNTT4 Xây dựng game Highway OpenGL ES 2.0 NHẬN XÉT CỦA HỘI ĐỒNG PHẢN BIỆN Đà Nẵng, n ày … , thán …… , năm 2014 Thay mặt hội đồng phản biện Nguyễn Thị Ngọc Thúy – 10CNTT4 ... tả chức game 26 2. 3.1 Biểu đồ Use case 26 2. 3 .2 Mô tả Actor 27 2. 4 Xây dựng game engine 27 2. 4.1 Trạng thái game vòng lặp game 27 2. 4 .2 Xây dựng cấu... sử dụng OpenGL ES 2. 0 để nghiên cứu phát triển Tất vấn đề đƣợc đề cập đến sau đƣợc mặc định OpenGL ES 2. 0 Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang Xây dựng game Highway OpenGL ES 2. 0 1 .2. 2 Hệ trục... xây dựng game cách vẽ đối tƣợng hình cách phù hợp Nguyễn Thị Ngọc Thúy – 10CNTT4 Trang 24 Xây dựng game Highway OpenGL ES 2. 0 CHƢƠNG 2: PHÂN TÍCH THIẾT KẾ GAME HIGHWAY 2. 1 KỊCH BẢN CỦA GAME Highway