Giới thiệu thư viện OpenGL

Một phần của tài liệu Bài giảng kỹ thuật Đồ họa và thực tại Ảo it32 Đại học mở hà nội (Trang 99 - 103)

Bài 6 KỸ THUẬT LẬP TRÌNH XỬ LÝ ĐỒ HỌA VỚI THƯ VIỆN OPENGL

6.2. Giới thiệu thư viện OpenGL

6.2.1 Sự ra đời và phát triển của OpenGL

Thư viện OpenGL (gọi đầy đủ là Open Graphic Library) là một hệ thống thư viện cung cấp các chức năng về việc xử lý đồ họa trên máy tính. Thư viện này cung cấp dưới dạng mở và có thể tương tác với nhiều hệ thống ngôn ngữ lập trình như C/C++, Java hay Python.

Hệ thống OpenGL cung cấp giao diện lập trình ứng dụng (API) độc lập với hệ nền trong hỗ trợ xử lý đồ họa. Để làm được điều này, OpenGL không thực hiện các tác vụ thuộc về hệ điều hành cũng như không nhận dữ liệu nhập của người dùng. Nó là lớp trung gian giữa người dùng và phần cứng. Nghĩa là nó giao tiếp trực tiếp với trình điều khiển của thiết bị đồ họa và khai thác tốt khả năng phần cứng xử lý đồ họa (GPU).

Có thể sử dụng thư viện OpenGL để tạo các hình ảnh của các đối tượng từ mô hình 2D và 3D, mà chủ yếu là mô hình wire-frame và mô hình đường hoặc mặt dựa trên các phương trình toán học.

OpenGL không hỗ trợ mô tả trực tiếp các đối tượng 3D, mà chỉ sử dụng các đối tượng hình học cơ sở như điểm, đường, đa giác để tạo nên các hình vẽ khác.

Thư viện OpenGL được phát triển bởi hãng Silicon Graphic từ năm 1992 với phiên bản 1.0, đến năm 2012 là phiên bản 4.3. Giao diện của thư viện là theo chuẩn công nghiệp, hỗ trợ đồ họa 3 chiều.

OpenGL cung cấp cho khoảng 150 hàm để vẽ và xử lý đồ họa. Với OpenGL, có thể tạo ra các hình khối, các ảnh trong không gian 2 chiều (2D) cũng như không gian 3 chiều (3D) với chất lượng cao.

Ngoài việc cài đặt và sử dụng trong các phần mềm lập trình ứng dụng trên máy tính, thư viện OpenGL cũng được thiết kế để nhúng vào các hệ thống con, hoặc các thiết bị chuyên dụng như điện thoại, máy tính bảng, thiết bị trò chơi,…

Các biến thể của thư viện OpenGL nhằm hỗ trợ cho lập trình theo từng ngôn ngữ. Trong đó, dạng C/C++ là mặc định, ngôn ngữ Java gồm GL4Java, LWJGL, JOGL, ngôn ngữ C# và Python có OpenTK, PyOpenGL.

Trong bài này, chúng ta tập trung sử dụng biến thể JOGL để khai thác và làm ví dụ.

6.2.2 Kiến trúc của OpenGL và các đặc điểm

Kiến trúc của OpenGL gồm các khối sau:

Kỹ thuật đồ họa và Thực tại ảo - Bài 6 Trang 3 Khối dữ liệu gồm các đỉnh (vertices) xác định tọa độ của đối tượng hình vẽ.

Khối tính toán các phép xử lý trên tọa độ, tính toán màu và các thuộc tính khác.

Khối tạo lưới các điểm ảnh (rasterization), khối này có thể phải sử dụng thêm các hình ảnh, các kiểu tô bề mặt (texture);

Khối xác định màu, tọa độ các vùng ảnh cuối cùng (fragment shading) và đưa kết quả vào vùng đệm để hiển thị trên màn hình;

Đặc điểm, thành phần trong OpenGL.

Thư viện OpenGL sử dụng hệ thống nhiều biến tĩnh (static variables) để khai thác sử dụng như màu sắc, ma trận biến đổi,... và sử dụng hệ thống kiểu dữ liệu riêng như GLfloat, GLint,…

Hệ thống các giá trị hằng trong thư viện được viết bằng chữ in hoa và có tiền tố GL ở đầu như GL_POINTS, GL_POLYGON,…

Các câu lệnh được viết có tiền tố là hai ký tự “gl”, tiếp đến là tên lệnh, sau đó số chiều

sử dụng và cuối cùng là kiểu dữ liệu áp dụng. Chẳng hạn có lệnh “glVertex3f” để xác định một đỉnh trong không gian có 3 tọa độ và kiểu dữ liệu float.

Một số chức năng xử lý được bổ sung thêm các tiện ích (utility library) và các lệnh sẽ

có tiền tố là “glu” và các hằng có tiền tố là “GLU_”, hoặc tiện ích GLUT sẽ tiền tố “glut”.

Trong quy trình thực hiện của viện OpenGL, dữ liệu các đỉnh của hình vẽ được biến đổi dựa trên mô hình quan sát, tiếp sau là biến đổi bởi phép chiếu và chia để chuẩn hóa trong phép chiếu, cuối cùng là biến đổi về khung nhìn. Trong đó có hai ma trận quan trọng được định nghĩa sẵn đó là ma trận mô hình hiển thị và ma trận thực hiện phép chiếu.

6.2.3 Cài đặt sử dụng thư viện

Cài đặt thư viện OpenGL vào hệ thống lập trình.

Trước hết, đối với lập trình C/C++ sử dụng môi trường DevC++, thực hiện như sau: Bước 1) Tải về các tệp tin thư viện từ địa chỉ http://chortle.ccsu.edu/Bloodshed/glutming.zip. Giải nén và sao chép các tệp vào máy gồm:

Tệp khai báo “glut.h” sao chép đến thư mục “C:\Dev-Cpp\include\GL”

Tệp thư viện “libglut32.a” sao chép đến thư mục “C:\Dev-Cpp\lib” và tệp

“glut32.dll” sao chép vào thư mục “C:\Windows\System32”

Kỹ thuật đồ họa và Thực tại ảo - Bài 6 Trang 4 Bước 2) Thiết lập chế độ sử dụng thư viện của dự án chương trình (Project) trong DevC++

Chọn trên thực đơn chức năng “Project”, chọn tiếp “Project Option” (hoặc nhấn tổ hợp phím Alt+P), chọn thẻ “Parameters”, chọn mục “Linker” và chọn nút “Add Library…” để thêm các tệp sau “libopengl32.a”, “libglu32.a” và “libglut32.a”.

Để lập trình với thư viện OpenGL bằng ngôn ngữ C/C++ trong môi trường DevC++ cần lập trình cho các hàm sau:

Hàm “callback” để chạy cho cửa sổ & vẽ đồ họa, hàm này sẽ được gọi khi cần vẽ đồ họa trên cửa sổ và do đó, thực hiện thiết lập các tham số và thực hiện lệnh vẽ đồ họa ở hàm này. Hàm có khai báo đơn giản với kiểu trả về là void, không có tham số.

Trong hàm chính “main”, thực hiện các lệnh sau:

Khởi tạo đồ họa: glutInit( argc, argv ) với tham số argc và argv là của hàm main. Tạo cửa sổ đồ họa: glutCreateWindow( title ) với title là tiêu đề cửa sổ.

Đặt kích thước cửa sổ: glutInitWindowSize( cx, cy ) với cx và cy là kích thước chiều ngang, chiều dọc của cửa sổ.

Đặt vị trí cửa sổ: glutInitWindowPosition( x, y) với x,y là tọa độ cho cửa sổ trên màn hình.

Đăng ký hàm vẽ đồ họa trên cửa sổ: glutDisplayFunc(callback) với callback là tên hàm đã lập trình ở trên để vẽ đồ họa.

Lặp để nhận và xử lý sự kiện trên cửa sổ: glutMainLoop().

Phần này cài đặt thư viện OpenGL bằng Java trong môi trường Eclipse, biến thể của thư viện được sử dụng là JOGL.

Trước hết phải tải về thư viện từ địa chỉ “http://jogamp.org/deployment/jogamp- current/archive/jogamp-all-platforms.7z”.

Giải nén tệp tải về và tìm kiếm thư mục giải nén để xác định 4 tệp cơ bản trong đó gồm:

jogl-all-natives-windows-amd64.jar,

gluegen-rt-natives-windows-amd64.jar,

jogl-all.jar,

gluegen-rt.jar.

Kỹ thuật đồ họa và Thực tại ảo - Bài 6 Trang 5 Trong môi trường lập trình Eclipse, tạo gói thư viện mới như sau:

Chọn chức năng trên thực đơn là Windows, tiếp là Preferences, chọn mục Java ở danh sách bên trái cửa sổ, trong đó chọn “Build Path”, rồi đến mục “User Libraries” sẽ xuất hiện phần giao diện bên phải, chọn tiếp nút lệnh “New” và nhập tên để tạo mới thư viện, sau đó chọn “Add External JARs” để thêm 4 tệp đã giải nén ở trên vào trong thư viện vừa tạo này.

Trong dự án chương trình, phải thiết lập sử dụng gói thư viện vừa tạo ở trước bằng cách sau:

Chọn và bấm chuột phải vào dự án (project) muốn thiết lập, chọn chức năng Properties sẽ mở hộp thoại tương ứng. Trong đó, chọn “Java Built Path” ở danh sách bên trái và chọn thẻ “Libraries” ở phía bên phải, sau đó chọn “Add Library…” sẽ xuất hiện danh sách các kiểu gói thư viện có trong Eclipse, chọn mục “User Library” và chọn “tên thư viện” đã tạo ở trước để thêm vào dự án chương trình.

Kết quả sẽ có tên của gói thư viện JOGL trong danh mục các thư viện của dự án chương trình.

6.2.4 Một số lệnh / lớp đơn giản trong thư viện

Đối với C/C++:

Xem xét một số lệnh đơn giản trong OpenGL, trước hết là nhóm lệnh quy định màu nền của vùng đệm vẽ glClearColor với tham số là ba giá trị màu red, green, blue và mức

độ trong suốt alpha, lệnh xóa vùng đệm glClear với tham số mặt nạ bít thường dùng là GL_COLOR_BUFFER_BIT.

Lệnh glColor3f để quy định màu vẽ với tham số là 3 thành phần màu red, green, blue. Lệnh glLineWidth để quy định độ rộng nét, lệnh glBegin để bắt đầu vẽ với tham số mode quy định chế độ vẽ như GL_LINES vẽ các đoạn thẳng, GL_TRIANGLES vẽ các hình tam giác, GL_QUADS vẽ các hình tứ giác,…

Lệnh glVertex2f hoặc glVertex3f để đặt tọa độ điểm vẽ ở dạng 2D hoặc 3D. Lệnh glEnd để kết thúc vẽ và glFlush để đẩy toàn bộ kết quả vẽ từ vùng đệm ra màn hình.

Đối với JOGL:

Trong gói thư viện JOGL này, vì lập trình bằng Java nên chủ yếu là các lớp đối tượng và phương thức xử lý trong đó. Các lớp cơ bản bao gồm:

Kỹ thuật đồ họa và Thực tại ảo - Bài 6 Trang 6 GLEventListener là giao diện để lập trình xử lý các sự kiện đồ họa,

GLJPanel là lớp con của JPanel dùng để tạo tấm nền cửa sổ cho việc vẽ đồ họa, GLAutoDrawable là lớp đối tượng đồ họa,

Các lớp đối tượng GL2, GL3, GLES3, GL4ES3,… được xác định từ đối tượng GLAutoDrawable để sử dụng các lệnh để xử lý vẽ đồ họa, các giá trị hằng sử dụng trong thư viện. Trong bài học này, chủ yếu sử dụng lớp đối tượng GL2, với các lệnh vẽ và xử lý

đồ họa giống như trong C/C++.

Để lập trình sử dụng thư viện JOGL và vẽ đồ họa, thực hiện 3 bước chính sau đây: Bước 1) Lập trình đối tượng xử lý sự kiện bằng cách thực thi giao diện GLEventListener gồm các hàm:

Hàm init với tham số là GLAutoDrawable để khởi tạo màn hình vẽ, thiết lập các tham số vẽ đồ họa ở đây để dùng chung trong quá trình vẽ sau này.

Hàm dispose để giải phóng màn hình vẽ.

Hàm reshape với các tham số GLAutoDrawable, vị trí và kích thước để xử lý khi cửa

sổ có sự thay đổi về kích thước.

Hàm display với tham số GLAutoDrawable để thực hiện vẽ và hiển thị kết quả đồ họa.

Bước 2) Tạo đối tượng GLJPanel và đăng ký xử lý sự kiện đồ họa cho đối tượng ở Bước 1, trong đó lệnh đăng ký là “addGLEventListener”.

Bước 3) Tạo mới một cửa sổ từ lớp JFrame và gắn đối tượng GLJPanel ở Bước 2 vào cửa sổ bằng lệnh “setContentPane”.

Một phần của tài liệu Bài giảng kỹ thuật Đồ họa và thực tại Ảo it32 Đại học mở hà nội (Trang 99 - 103)

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

(146 trang)