Lập trình kỹ thuật đồ hoạ với OpenGL căn bản qua ví dụ

Lập trình kỹ thuật đồ hoạ với OpenGL căn bản qua ví dụ

January 5, 2021 0 By Nam Vu

OpenGL là giao diện phần mềm hướng thủ tục theo chuẩn công nghiệp hỗ trợ đồ hoạ 3 chiều. Được phát triển đầu tiên bởi Silicon Graphic Inc,bao gồm khoảng 250 câu lệnh được hỗ trợ bởi nhiều ngôn ngữ như C, C++,Java. Cho phép người lập trình sử dụng tạo ra các đối tượng đồ họa. OpenGL được thiết kế không phụ thuộc vào nền tảng phần cứng cũng như hệ điều hành máy tính (independence of hardware platform and operating system). Với OpenGL ta sẽ tạo ra các mô hình từ các đối tượng hình học cơ bản đó là điểm (point), đường (line) và đa giác (polygon).

Cú pháp lệnh của OpenGL: Các câu lệnh của OpenGL đều sử dụng tiền tố gl và các từ tiếp theo được bắt đầu bằng kí tự hoa, ví dụ glClearColor(). Các hằng được định nghĩa bằng tiền tố GL_ tiếptheo là các từ viết hoa được ngăn cách bằng kí tự gạch dưới, ví dụ GL_COLOR_BUFFER_BIT. Mặc dù OpenGL là một công cụ mạnh nhưng các đối tượng vẽ đều là các đối tượng hình học cơ bản. Để đơn giản hóa một số công việc,chúng ta được trang bị thêm một số thư viện cho phép sử dụng các thủ tục vẽ ở mức cao hơn: – OpenGL Utility Library (GLU). Bao gồm một số thủ tục thiết lập ma trận xác định hướng nhìn (viewing orientation), ma trận các phép chiếu (projection),và biểu diễn các mặt trong không gian 3 chiều (redering surfaces) – OpenGL Utility Toolkit (GLUT): Là một bộ công cụ được viết bởi Mark Kilgard bao gồm các thủ tục giúp cho đơn giản hóa việc xây dựng các đối tượng hình học. Các thủ tục của GLUT được bắt đầu bằng tiền tố glut.

CÁC LỆNH VẼ TRONG OPENGL

Ta có một số ví dụ đơn giản:

#include <gl\glut.h>
/* hàm thực hiện các thao tác vẽ theo yêu cầu của chương trình */ 
void display(void) 
{ 
/* xóa mọi pixel */ 
glClear (GL_COLOR_BUFFER_BIT); 
/* vẽ hình chữ nhật có điểm trái-trên và phải-dưới */
/* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ 
glColor3f (1.0, 1.0, 1.0); /* thiết lập màu vẽ: màu trắng */ 
glBegin(GL_POLYGON); /* bắt đầu vẽ đa giác */ 
glVertex3f (0.25, 0.25, 0.0); /* xác định các đỉnh của đa giác */ 
glVertex3f (0.75, 0.25, 0.0); 
glVertex3f (0.75, 0.75, 0.0); 
glVertex3f (0.25, 0.75, 0.0); 
glEnd(); /* kết thúc vẽ đa giác */ 
/* thực hiện quá trình đẩy ra buffer */ 
glFlush (); 
}

Tất cả các hình khối trong openGL đều được nằm giữa hai dòng lệnh glBegin() và glEnd().
Có thể có nhiều cặp dòng lệnh như vậy, tức là ta có thể viết các hàm vẽ khác nhau và dùng cặp lệnh trên trong các hàm đó. Tham số của glBegin() là GL_LINE_LOOP có nghĩa là nó bảo window vẽ một đường khép kín, tức là điểm đầu trùng với điểm cuối.

Một số hàm vẽ như sau:

Hàm glVertex2d xác định điểm hai chiều, chúng ta nên biết một số tiền tố các hàm của openGL, các hàm dùng thư viện nào sẽ bắt đầu bằng tên của thư viện đó.

Ví dụ dùng các hàm cơ bản của openGL thì thường bắt đầu với gl, các hàm dùng thư viện glut thì bắt đầu với glu, các hàm dùng thư viện aux thì bắt đầu với aux… Các hàm cũng có hậu tố, ví dụ glVertex2d() là vẽ điểm 2 chiều, glVertex3d() là vẽ điểm 3 chiều.

ntechdevelopers

TÔ MÀU TRONG OPENGL

Hàm thiết lập màu cho hình vẽ:
glColor3f(x,x,x);

Một số màu cơ bản:

glColor3f(0.0,0.0,0.0); //màu đen
glColor3f(1.0,1.0,1.0); //màu trắng
glColor3f(1.0,0.0,0.0); //màu đỏ
glColor3f(1.0,0.0,1.0); //màu tím
glColor3f(1.0,1.0,0.0); //màu vàng
glColor3f(0.0,1.0,0.0); //màu lục
glColor3f(0.0,1.0,1.0); //màu tím xanh
glColor3f(0.0,0.0,1.0); //màu xanh lơ
ntechdevelopers

CÁC CÂU LỆNH ĐIỀU KHIỂN

Câu lệnh điều khiển chuột:

void mouse(int button, int state, int x, int y) 
{
switch (button) 
{
case GLUT_LEFT_BUTTON:  /* khi nhấn chuột trái */
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay); 
/* khi chương trình đang trong trạng thái idle (không phải xử lý gì cả) thì sẽ thực hiện hàm spinDisplay */
break;
case GLUT_MIDDLE_BUTTON:  /* khi nhấn nút giữa */
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
default:
break;
}
}
ntechdevelopers

Hàm xử lý từ bàn phím với các kí tự nhận biết được dưới mã ASCII:

void glutKeyboardFunc(void (*func) (unsigned char key, int x, int y))

Tham số (*func)(unsigned char key, int x, int y) – con trỏ tới hàm xử lý
x – tọa độ x của chuột (hoành độ)
y – tọa độ y của chuột (tung độ)

Hàm xử lý các kí tự trên bàn phím nhận biết được dưới mã ASCII :

void glutSpecialFunc (void (*func) (int key, int x, int y))

Tham số tương tự glutKeyboardFunc(). 
Những key được định nghĩa sẵn là một trong số mã sau:

GLUT_KEY_F1 F1
GLUT_KEY_F2 F2
…
GLUT_KEY_F12 F12
GLUT_KEY_LEFT //phím chức năng trái
GLUT_KEY_RIGHT //phím chức năng phải
GLUT_KEY_UP //phím chức năng trên
GLUT_KEY_DOWN //phím chức năng dưới
GLUT_KEY_PAGE_UP //phím chức năng Page Up
GLUT_KEY_PAGE_DOWN //phím chức năng Page Down
GLUT_KEY_HOME //phím chức năng Home
GLUT_KEY_END //phím chức năng End
GLUT_KEY_INSERT //phím chức năng Insert
ntechdevelopers

Đó là những ví dụ cho từng những thao tác nhỏ lẻ. Bây giờ hãy lắp ghép những phần bên trên thành một ví dụ tổng quan nhé. Hãy nhìn vào sơ đồ dưới đây

ntechdevelopers

Bước 1: Khởi tạo

  • Tạo khung nhìn Form gồm : Chế độ nhập, Chế độ nhìn, Chế độ màu, Form size, Vị trí Form , Tiêu đề Form.
  • Khởi tạo Chế độ nhập Init().

Bước 2: Chức năng xử lý

  • Dùng hàm Display() để xử lý vẽ hình, tô màu, quay hình.
    1. Khởi tạo màu nền và chế độ buffers.
    2. Xử lý xoay hình theo bàn phím key = { “L”, “R”, “U”, “D” }
    3. Xử lý góc nhìn và độ sau góc nhìn.
    4. Xử lý vẽ Đa giác theo từng cạnh: Tô màu và vẽ theo trục không gian 3D.
    5. Thực hiện hoán đổi Bufers.
  • Dùng hàm Reshape() để xử lý thay đổi kích thước khung Form.
  • Dùng hàm Keyboard() để xử lý bàn phím máy tính.
    1. Trong trường hợp nhấn phím “L” thực hiện hàm quay trái.
    2. Trong trường hợp nhấn phím “R” thực hiện hàm quay phải.
    3. Trong trường hợp nhấn phím “U” thực hiện hàm quay lên.
    4. Trong trường hợp nhấn phím “D” thực hiện hàm quay xuống.
  • Dùng hàm Mouse() để xử lý chuột máy tính.
    1. Trong trường hợp nhấn chuột trái thực hiện hàm quay trái.
    2. Trong trường hợp nhấn chuột phải thực hiện hàm quay phải.
    3. Trong trường hợp nhấn giữa không thực hiện.
  • Dùng hàm MainLoop() để dừng màn hình hiển thị.

Gọi hàm SpinDisplay() thực hiện quay. Tăng góc quay sau mỗi lần thực hiện cho đến khi góc quay Spin lớn hơn 360 độ thì trả lại giá trị ban đầu cho Spin.

Được rồi đến đây bạn có thể hình dung được các công việc bạn cần phải làm để xây dựng một chương trình đồ hoạ với OpenGL rồi.

Còn đây là toàn bộ source code và tài liệu hướng dẫn chi tiết giúp bạn tham khảo.
# http://megaurl.in/EgAnh

Chúc các bạn thành công!