.Tải shader và biên dịch

Một phần của tài liệu Xây dựng game 3D chém trái cây trên Windows và ĐTDĐ sử dụng HĐH Android. (Trang 63 - 67)

OpenGLES 2.0 cung cấp một đường ống để chúng ta có thể lập trình cách thức hoạt động của bộ xử lí đồ họa.

Shader là bộ điều khiển hoạt động của OpenGLES 2.0 và được chạy ngay trên bộ xử lí đồ họa. Shader được viết bằng ngôn ngữ shader (glsl) và bao gồm hai phần: shader đỉnh (vertex shader) và shader điểm ảnh (fragment shader). Ứng dụng OpenGLES 2.0 chỉ có thể hoạt động khi đã được xác định một cặp shader trong hệ thống. Do đó chúng ta phải cài đặt shader cho lớp xử lí đồ họa của mình.

- Tải shader từ tập tin. - Biên dịch shader.

- Liên kết shader thành chương trình. - Sử dụng chương trình đó để vẽ.

4.4.2. Vẽ một đối tượng 3D

Để vẽ một đối tượng 3D, chúng ta sử dụng phép chiếu phối cảnh. Một đối tượng 3D được xác định bởi các thuộc tính:

- Vị trí, dữ liệu, màu sắc, UV của từng đỉnh thuộc đối tượng. - Quan hệ giữa các đỉnh thuộc đối tượng.

- Texture: hình ảnh được áp lên đối tượng đó.

Trong chương trình, vị trí, dữ liệu, màu sắc, uv của đối tượng được lưu dưới dạng file .OBJ có định dạng như sau:

v $x $y $z ; đỉnh có tọa độ x y z vt $u $v ; tọa độ uv của đối tượng. vn $x $y $z ; vec-tơ chính phương.

f $i/$j/$k $i’/$j’/$k’ $i’’/$j’’/$k’’; Xác định một mặt tam giác của đối tượng, trong đó: $i: vị trí của tọa độ, $j: vị trí của uv, $k: vị trí của vector chính phương tại đỉnh đó,

Các thông tin này được nén lại vào một file nhị phân chứa nhiều đối tượng cùng lúc  mục đích: dễ dàng tải và thực hiện trong chương trình.

SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 64

Lúc vẽ, chúng ta truyền các tham số này vào một shader trong OPENGL ES và bộ xử lí đồ họa sẽ vẽ đối tượng này lên màn hình.

driver->SetArray(ATTRIB_VERTEX, 3, meshes[i].vertices); driver->SetArray(ATTRIB_TEX_COORD, 2, meshes[i].texCoords); //driver->SetArray(ATTRIB_NORMAL, 3, meshes[i].normals); driver->SetTexture2D(0, manager- >GetTexture(meshes[i].textureId)); driver->DrawArray(TRIANGLES, meshes[i].nVertices); 4.4.3. Vẽ một đối tượng 2D

Để vẽ một đối tượng 2D, chúng ta sử dụng phép chiếu vuông góc. Tương tự như đối tượng 3D, chúng ta sẽ lưu thông tin của các đối tượng 2D vào một file nhị phân, sau đó tải vào bộ nhớ và vẽ ra.

4.5. Nhập

Ta sử dụng hàm PointerEvent trong đối tượng Application để nhận và xử lí các sự kiện nhập từ cảm ứng / chuột. Ở trên windows, ta xử lí như sau:

case WM_LBUTTONDOWN: mouseDown = true; bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_START, x, y); break; case WM_MOUSEMOVE: if (mouseDown) { bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_MOVED, x, y); }; break; case WM_LBUTTONUP: mouseDown = false; bt::core::Application::GetApplication() ->PointerEvent(bt::core::POINTER_ENDED, x, y); break;

Ở trong trò chơi của mình, chúng ta chỉ cần cài đặt và xử lí hàm PointerEvent mà không cần phải biết thật sự cảm ứng/chuột được nhận như thế nào.

SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 65

if (pointerState == POINTER_START &&

PointerInRect(m_iLastPointerX, m_iLastPointerY, SCREEN_W - 100, SCREEN_H - 100, 100, 100)) { SwitchState(MAIN_MENU); } 4.6. Âm thanh

Ta đưa ra hai phương thức để chơi âm thanh: // Play Sound

void PlaySound(int id, int loop = 1);

// Stop all sound

void StopSound();

Tuy nhiên, trong windows, chúng ta không xử lí âm thanh – do không cần thiết và không có đủ thời gian để thực hiện.

4.7. Giao diện ứng dụng

Ứng dụng của chúng ta xây dựng là ứng dụng console: để có giao diện giúp chúng ta debug dễ dàng. Đầu vào của ứng dụng là hàm main() -> chúng ta thực hiện các việc sau:

- Khởi tạo ứng dụng.

- Tạo cửa sổ và khởi tạo đối tượng OpenGL ES 2.0. - Bắt đầu trò chơi.

- Gọi vòng lặp trò chơi.

app->StartApp();

while (!exit)

{

// Update and Paint

app->Update(); app->Render();

eglSwapBuffers(context->display, context->surface); };

SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 66 4.8. Giao diện xuất nhập tập tin

Việc xuất nhập tập tin trong windows tương đối đơn giản. Chúng ta chỉ cần sử dụng các phương thức cơ bản của thư viện <stdio.h> để thực hiện.

// Open a file in Windows 32bits so easily

FILE* Win32FileSystem::OpenFile(const char *filename, const char *mode)

{

FILE *file;

fopen_s(&file, filename, mode);

return file;

SVTH: Nhữ Thị Trà My- 08CNTT02 Trang 67

Một phần của tài liệu Xây dựng game 3D chém trái cây trên Windows và ĐTDĐ sử dụng HĐH Android. (Trang 63 - 67)

Tải bản đầy đủ (PDF)

(83 trang)