Bối cảnh và vấn đề nghiên cứu

Đồ họa máy tính là một phân ngành nền tảng trong khoa học máy tính và công nghệ thông tin, đóng vai trò thiết yếu trong việc thay đổi phương thức tương tác giữa con người và hệ thống máy tính tính toán. Việc chuyển đổi dữ liệu số thành hình ảnh trực quan không chỉ thúc đẩy các ứng dụng trong khoa học công nghệ, y học, kiến trúc và giải trí phát triển, mà còn tạo tiền đề lý thuyết cho nhiều lĩnh vực chuyên sâu như xử lý ảnh kỹ thuật số và thiết kế có sự trợ giúp của máy tính (CAD). Trong chương trình đào tạo kỹ sư Công nghệ thông tin tại Trường Đại học Điện Lực, học phần Đồ họa máy tính trang bị cho người học nền tảng toán học của các thuật toán chuyển đổi quét (rasterization) 2D cùng kỹ thuật mô hình hóa không gian 3D.

Báo cáo chuyên đề học phần được thực hiện nhằm giải quyết hai nhóm nhiệm vụ trọng tâm:

  1. Nghiên cứu, phân tích cơ sở toán học và lập trình cài đặt các thuật toán đồ họa 2D cơ bản (vẽ đường thẳng, đường tròn, elip, tô màu miền kín).
  2. Thiết kế và phát triển ứng dụng đồ họa 3D mô phỏng quá trình chuyển động của tàu vũ trụ khi rời bệ phóng, ứng dụng thư viện OpenGL để mô phỏng chiếu sáng, vật liệu, chuyển động và môi trường không gian.

Đối tượng nghiên cứu của đề tài là các giải thuật rasterization kinh điển và kỹ thuật dựng hình 3D trong không gian ba chiều. Phạm vi thực hiện đề tài giới hạn trong khuôn khổ học phần Đồ họa máy tính do nhóm sinh viên thuộc lớp D13CNPM4 (khóa 2018–2023), chuyên ngành Công nghệ phần mềm, Khoa Công nghệ thông tin, Trường Đại học Điện Lực hoàn thành vào tháng 6 năm 2020 dưới sự hướng dẫn của giảng viên Ngô Trường Giang.


Cơ sở lý thuyết và phương pháp

Khung lý thuyết của công trình được xây dựng trên hai trụ cột: toán học đồ họa raster 2D và mô hình đồ họa điểm ảnh 3D với OpenGL.

Khung lý thuyết và mô hình toán học

  • Lý thuyết chuyển đổi quét (Rasterization): Nguyên lý xấp xỉ hóa các đường liên tục (đường thẳng, đường tròn, elip) trên lưới điểm ảnh rời rạc thông qua việc đưa ra các biến quyết định dựa trên số nguyên, loại bỏ các phép toán dấu phẩy động nhằm tối ưu hóa hiệu năng tính toán của CPU/GPU.
  • Thuật toán Bresenham: Tối ưu hóa việc chọn điểm pixel kế tiếp bằng cách so sánh sai số khoảng cách giữa tọa độ thực của phương trình đường và hai điểm ảnh lân cận, nhân lượng vi phân $dx$ để triệt tiêu mẫu số trong hệ số góc $m = \frac{\Delta y}{\Delta x}$.
  • Thuật toán Midpoint (Điểm giữa): Đánh giá vị trí tương đối của điểm thực so với trung điểm nằm giữa hai điểm ảnh ứng viên dựa trên giá trị của hàm ẩn $F(x, y)$, từ đó xác định bước nhảy cho tọa độ kế tiếp.
  • Lý thuyết tô màu vùng miền (Region Filling): Kỹ thuật tô màu loang (Flood Fill/Boundary Fill) dựa trên tính lân cận 4 hướng của điểm ảnh (triển khai qua đệ quy hoặc hàng đợi BFS) và thuật toán tô màu theo dòng quét (Scanline Fill) xử lý giao điểm đa giác.
  • Đồ họa 3D với OpenGL và GLUT: Khung hiển thị đồ họa tương tác sử dụng phép chiếu phối cảnh (gluPerspective), thiết lập camera (gluLookAt), tính toán vector pháp tuyến, mô hình vật liệu/ánh sáng (GL_SPECULAR, GL_SHININESS) và dựng hình bề mặt bậc hai (GLUquadricObj).

Phương pháp nghiên cứu

  • Phương pháp giải tích và tối ưu hóa toán học: Thiết lập phương trình vi phân sai phân cho các biến quyết định ($p_i$, $f_i$, $d_i$, $e_j$) nhằm suy ra công thức truy hồi cộng dồn giữa các bước lặp $i$ và $i+1$.
  • Phương pháp thực nghiệm phần mềm: Lập trình cụ thể hóa các thuật giải bằng ngôn ngữ C/C++ kết hợp bộ công cụ đồ họa chuẩn OpenGL/GLUT, kiểm thử trực quan trên môi trường thực thi máy tính.

Thiết kế và triển khai

Ứng dụng mô phỏng 3D được thiết kế theo mô hình điều khiển hướng sự kiện (event-driven) thông qua thư viện GLUT, quản lý chu trình vẽ lại (rendering loop) và tính toán biến đổi hình học theo trục thời gian thực.

Thành phần hệ thống Hàm OpenGL / Cấu trúc dữ liệu Chức năng kỹ thuật
Môi trường hiển thị glutInitWindowSize(1200, 700), glutInitWindowPosition(50, 50) Khởi tạo cửa sổ đồ họa kích thước $1200 \times 700$ px ở chế độ đơn đệm và RGB.
Phép chiếu & Quan sát ReShape(), glViewport(), gluPerspective(45.0, ratio, ...) Thiết lập góc nhìn phối cảnh $45^\circ$, tỷ lệ co giãn khung nhìn theo kích thước cửa sổ.
Hệ tọa độ camera gluLookAt(15, -35, ...) Định vị điểm đặt mắt quan sát hướng về bệ phóng và quỹ đạo của tàu vũ trụ.
Vật liệu và Chiếu sáng Init(), glMaterialfv(), glMateriali(GL_FRONT, GL_SHININESS, 15.0f) Thiết lập độ phản xạ gương (GL_SPECULAR) và độ bóng bề mặt cho vật thể 3D.
Bệ phóng (Launchers) thanhcheo(), gluCylinder(obj, 0.5, ...) Kết hợp các phép quay (glRotatef), tịnh tiến (glTranslatef) và ống trụ GLU để dựng khung giàn phóng.
Thân tàu vũ trụ gluCylinder(), glVertex3f() Ghép nối các hình trụ bậc hai tạo khoang thân, chóp nón và các cánh ổn định hướng.
Môi trường mây và sao gluSphere(), glScalef(), std::vector<Point> points, glDrawArrays() Dựng các khối mây đa tầng bằng hình cầu biến dạng và tạo bầu trời 150 điểm sao chuyển động.
Bộ điều khiển hoạt cảnh timer(int), updatescreen(), updatelauncher(), updatemay() Cập nhật các biến trạng thái (moveship, movemay, movestar, p) theo chu kỳ thời gian.

Hệ thống quản lý chuyển động thông qua biến tỷ lệ $p$ (khởi tạo $p = 1$, giảm dần trong quá trình phóng) và các biến gia số vị trí: biến moveship tăng tuyến tính ($+0.05$) điều khiển tàu bay lên cao, movemay thay đổi vị trí tầng mây trôi dạt (giới hạn chặn dưới $-145$), và movestar tạo hiệu ứng bầu trời dịch chuyển lùi dần (chu kỳ lặp lại khi đạt mốc $-32$).


Nội dung chính theo từng chương

Chương 1: Các Thuật Toán Cơ Bản

Chương này trình bày toàn diện nền tảng toán học, lưu đồ giải thuật và mã nguồn C++/OpenGL của các thuật toán rasterization đường nét và thuật toán tô màu vùng trong không gian đồ họa 2D.

1. Thuật toán Bresenham

  • Vẽ đường thẳng: Đặt vấn đề nối hai điểm $A(x_1, y_1)$ và $B(x_2, y_2)$ với hệ số góc $0 < m < 1$. Bằng cách so sánh hai khoảng cách $d_1 = y_{i+1} - y$ và $d_2 = y - y_i$, thuật toán triệt tiêu phép chia thực bằng cách nhân $dx$, đưa ra biến quyết định: $$p_i = dx(d_1 - d_2) = 2dy \cdot x_i - 2dx \cdot y_i + c$$ Giá trị khởi tạo tại điểm đầu tiên là $p_1 = 2dy - dx$. Công thức truy hồi cập nhật biến quyết định được xác lập:
    • Nếu $p_i < 0$: Chọn $y_{i+1} = y_i$ và $p_{i+1} = p_i + 2dy$.
    • Nếu $p_i \ge 0$: Chọn $y_{i+1} = y_i + 1$ và $p_{i+1} = p_i + 2(dy - dx)$.
  • Vẽ đường tròn: Khai thác tính chất đối xứng 8 phần (1/8 cung tròn) của phương trình $(x-x_c)^2 + (y-y_c)^2 = R^2$. Khi vẽ từ điểm $(0, R)$, biến quyết định ban đầu là $p_1 = 3 - 2R$.
    • Nếu $p_i < 0$: $y_{i+1} = y_i$ và $p_{i+1} = p_i + 4x_i + 6$.
    • Nếu $p_i \ge 0$: $y_{i+1} = y_i - 1$ và $p_{i+1} = p_i + 4(x_i - y_i) + 10$. Mỗi điểm $(x, y)$ xác định được đồng thời phản chiếu ra 8 điểm đối xứng: $(\pm x + x_c, \pm y + y_c)$ và $(\pm y + x_c, \pm x + y_c)$.
  • Vẽ hình elip: Phương trình $\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$ được chia thành 2 nhánh phân tách tại điểm có hệ số góc tiếp tuyến bằng $-1$ nhằm đảm bảo nét vẽ liên tục, không bị đứt đoạn hay răng cưa do tốc độ biến thiên tọa độ thay đổi giữa hai trục.

2. Thuật toán Midpoint

  • Vẽ đường thẳng: Dựa trên phương trình tổng quát $F(x, y) = Ax + By + C = 0$ ($A = y_2 - y_1, B = -(x_2 - x_1), C = x_2y_1 - x_1y_2$). Vị trí điểm thực được so sánh với điểm giữa (Midpoint) của hai điểm kế tiếp. Biến quyết định ban đầu $p_1 = 2A + B = 2Dy - Dx$. Nếu $p_i < 0$, chọn $y_{i+1} = y_i$ và $p_{i+1} = p_i + 2Dy$; nếu $p_i \ge 0$, chọn $y_{i+1} = y_i + 1$ và $p_{i+1} = p_i + 2(Dy - Dx)$.
  • Vẽ đường tròn: Đặt $f(x, y) = x^2 + y^2 - R^2$. Giá trị khởi tạo $f_1 = 1 - R$ (xuất phát từ $f(1, R - 1/2) = \frac{5}{4} - R \approx 1 - R$ trên số nguyên). Khi $f_i < 0$, $f_{i+1} = f_i + 2x_i + 3$; khi $f_i \ge 0$, $f_{i+1} = f_i + 2(x_i - y_i) + 5$ kết hợp giảm $y$.
  • Vẽ hình elip: Phương trình $f(x, y) = b^2x^2 + a^2y^2 - a^2b^2 = 0$. Chia elip làm 2 phần tại điểm $Q$ có vector gradient thỏa mãn đạo hàm riêng bằng nhau ($\frac{dx}{dy} = \frac{2b^2x}{2a^2y} = 1$).
    • Phần 1 ($x$ biến thiên nhanh hơn $y$): Giá trị ban đầu $d_1 = b^2 - a^2b + \frac{a^2}{4}$. Nếu $d_i < 0$, $d_{i+1} = d_i + b^2(2x_i + 3)$; nếu $d_i \ge 0$, $d_{i+1} = d_i + b^2(2x_i + 3) + a^2(-2y_i + 2)$.
    • Phần 2 ($y$ biến thiên nhanh hơn $x$): Xét biến $e_j = f(x_j + 1/2, y_j - 1)$, cập nhật dựa trên $a^2$ và $b^2$ tương ứng cho đến khi $y = 0$.
Thuật toán Đối tượng vẽ Điểm bắt đầu Biến quyết định ban đầu ($p_1$ hoặc $f_1$) Quy tắc bước nhảy tọa độ
Bresenham Đường thẳng $(x_1, y_1)$ $p_1 = 2dy - dx$ $p_i < 0 \to y$; $p_i \ge 0 \to y+1$
Bresenham Đường tròn $(0, R)$ $p_1 = 3 - 2R$ $p_i < 0 \to y$; $p_i \ge 0 \to y-1$
Midpoint Đường thẳng $(x_1, y_1)$ $p_1 = 2Dy - Dx$ $p_i < 0 \to y$; $p_i \ge 0 \to y+1$
Midpoint Đường tròn $(0, R)$ $f_1 = 1 - R$ $f_i < 0 \to y$; $f_i \ge 0 \to y-1$
Midpoint Elip (Phần 1) $(0, b)$ $d_1 = b^2 - a^2b + a^2/4$ $d_i < 0 \to y$; $d_i \ge 0 \to y-1$

3. Thuật toán tô màu miền kín

  • Tô màu loang (Flood Fill): Định nghĩa vùng biên bằng giá trị màu đồng nhất. Thuật toán bắt đầu từ một điểm hạt giống $(x, y)$ bên trong miền kín, kiểm tra trạng thái màu của 4 điểm lân cận và đệ quy đổi màu. Nhược điểm của giải pháp đệ quy thuần túy là nguy cơ tràn ngăn xếp (stack overflow) với miền diện tích lớn và lặp lại việc kiểm tra điểm ảnh. Tài liệu đưa ra phương án cải tiến bằng việc sử dụng hàng đợi (Queue/BFS) để lưu vết các điểm hạt giống theo từng dòng quét.
  • Tô màu theo dòng quét (Scanline): Áp dụng cho các đa giác lồi, lõm hoặc tự cắt. Với mỗi đường thẳng ngang $y = k$ quét từ $y_{\min}$ đến $y_{\max}$ của tập đỉnh đa giác:
    1. Xác định tất cả hoành độ giao điểm của dòng quét với các cạnh đa giác.
    2. Sắp xếp các hoành độ giao điểm theo thứ tự tăng dần ($x_0, x_1, x_2, x_3, \dots$).
    3. Tiến hành tô màu các đoạn thẳng nằm giữa từng cặp giao điểm chẵn - lẻ: $[x_0, x_1]$, $[x_2, x_3], \dots$.

Chương 2: Phát triển ứng dụng

Chương này tập trung vào việc áp dụng các thư viện đồ họa của OpenGL để xây dựng hoàn chỉnh ứng dụng mô phỏng 3D mang tên "Mô phỏng chuyển động tàu vũ trụ".

1. Phân tích bài toán và quy trình thực hiện

  • Yêu cầu hệ thống: Xây dựng khung cảnh 3D trực quan; tích hợp các kỹ thuật tô màu, mô hình chiếu sáng, vật liệu phản xạ (specular), ánh xạ vân bề mặt, phối cảnh và mô phỏng chuỗi chuyển động liên tục của tàu vũ trụ.
  • Quy trình triển khai:
    1. Thiết lập cấu hình môi trường 3D qua GLUT (cửa sổ, chế độ đệm, camera, ma trận phép chiếu).
    2. Lập trình tạo hình các mô hình tĩnh và động (giàn phóng, thân tên lửa đẩy, khoang tàu, các tầng mây, trường sao nền).
    3. Xây dựng hàm định thời timer() cập nhật tọa độ hình học theo thời gian để tạo chuỗi chuyển động nhịp nhàng.

2. Hiện thực hóa các thành phần đồ họa

  • Hệ thống giàn phóng và bệ đỡ (launchers, thanhcheo): Sử dụng các ống trụ gluCylinder đường kính $0.5$ kết hợp các góc xoay trục $45^\circ, -45^\circ, 90^\circ, -90^\circ, -180^\circ$ và tịnh tiến dọc trục $Y$ để dựng khung giàn kim loại vững chắc.
  • Mô hình tàu vũ trụ (ship): Thân tàu được định hình bằng các ống trụ GLU với bán kính đáy $1.5$, đầu chóp thuôn nhọn cùng hệ thống đỉnh tọa độ 3D (glVertex3f) mô phỏng vây lái và cánh đuôi định hướng. Vật liệu bề mặt tàu được gán màu phản xạ khuếch tán chuyên biệt (shipcolor).
  • Môi trường tầng mây (may): Được tạo nên từ việc phối hợp nhiều hình cầu gluSphere có bán kính $8, 6, 5$ với độ chia lưới $100 \times 100$, áp dụng phép co giãn tỉ lệ không đồng trục glScalef(1, 2, 1) để tạo khối mây bồng bềnh trôi ngang màn hình.
  • Trường sao không gian (star): Sử dụng cấu trúc dữ liệu struct Point { float x, y, z; unsigned char r, g, b, a; } và mảng động std::vector<Point> points chứa 150 điểm ngẫu nhiên, kết xuất bằng cơ chế mảng đỉnh glDrawArrays(GL_POINTS, 0, points.size()) với kích thước điểm ảnh glPointSize(2).

3. Kết quả thực nghiệm mô phỏng

Hệ thống vận hành chính xác chu trình phóng tàu vũ trụ: Khởi đầu tại bệ phóng trên mặt đất, hệ thống kích hoạt hiệu ứng nâng dần độ cao thông qua biến moveship, các tầng mây di chuyển lùi dần qua ống kính quan sát (movemay), và trường sao nền chuyển động tịnh tiến tạo cảm giác tàu tăng tốc bay vào không gian vũ trụ sâu.


Kết quả và đóng góp

Kết quả đạt được

  • Về lý thuyết và thuật toán 2D: Đã phân tích chi tiết, chứng minh toán học đầy đủ và cài đặt hoàn chỉnh trên C++/OpenGL cho 4 thuật toán chính: Bresenham (đường thẳng, đường tròn, elip), Midpoint (đường thẳng, đường tròn, elip), Flood Fill (đệ quy và hàng đợi) và Scanline đa giác.
  • Về ứng dụng mô phỏng 3D: Xây dựng thành công phần mềm mô phỏng không gian 3D với cửa sổ $1200 \times 700$ pixel, quản lý 150 điểm sao cùng hệ thống vật thể phức hợp (bệ phóng, tàu vũ trụ, mây tầng) chuyển động mượt mà qua hàm định thời GLUT timer().

Đóng góp của đề tài

  • Hệ thống hóa trực quan các phương pháp chuyển đổi quét từ lý thuyết giải tích sang mã nguồn lập trình thực tế, làm rõ cơ chế tối ưu hóa số nguyên để thay thế tính toán số thực.
  • Cung cấp giải pháp kết hợp hiệu quả giữa các khối hình học bậc hai của thư viện GLU (gluCylinder, gluSphere) với các mảng đỉnh điểm thô (GL_POINTS) nhằm tối ưu hiệu năng dựng hình trong các ứng dụng mô phỏng thời gian thực cơ bản.

Hạn chế và hướng nghiên cứu tiếp

  • Hạn chế:
    • Mô hình đồ họa được phát triển dựa trên chuẩn OpenGL cổ điển (Fixed Function Pipeline) và bộ công cụ GLUT, chưa khai thác kiến trúc Shader hiện đại (GLSL) và Vertex Buffer Object (VBO).
    • Quỹ đạo chuyển động của tàu vũ trụ và các đám mây chủ yếu là các chuyển động tịnh tiến đều và tịnh tiến tuyến tính theo trục tọa độ, chưa tích hợp các phương trình động lực học vật lý thực tế (gia tốc trọng trường, sức cản không khí, chuyển động quay phức hợp).
    • Hiệu ứng luồng lửa động cơ đẩy mới dừng lại ở mức mô phỏng điểm ảnh rời rạc, chưa sử dụng hệ thống hạt (Particle System) chuyên sâu.
  • Hướng mở rộng:
    • Nâng cấp chương trình sang OpenGL hiện đại (Modern OpenGL 3.3+) sử dụng Vertex Shader và Fragment Shader để nâng cao chất lượng đổ bóng và hiệu ứng ánh sáng cục bộ (Phong/Blinn-Phong Lighting).
    • Bổ sung mô hình vật lý va chạm và động học vật thể rắn vào quá trình bay của tàu.
    • Tích hợp thêm các kỹ thuật Texturing đa lớp và hệ thống hạt đa luồng cho khói lửa động cơ.

Giá trị tham khảo

Báo cáo chuyên đề là tài liệu tham khảo thiết thực dành cho:

  • Sinh viên ngành Công nghệ thông tin và Công nghệ phần mềm: Làm tài liệu học tập, tra cứu trực tiếp khi thực hiện các bài tập lớn, chuyên đề học phần môn Đồ họa máy tính hoặc môn Xử lý ảnh.
  • Người học lập trình C++ và OpenGL: Tham khảo cấu trúc mã nguồn chuẩn trong việc thiết lập cửa sổ GLUT, cài đặt ma trận góc nhìn, quản lý ánh sáng/vật liệu và điều khiển hoạt cảnh chuyển động 3D.
  • Nội dung giá trị nhất: Phần chứng minh công thức truy hồi sai phân số nguyên trong Chương 1 và cấu trúc phối hợp các hàm dựng hình GLU bậc hai trong Chương 2.

Câu hỏi thường gặp

1. Tại sao thuật toán Bresenham lại có tốc độ thực thi nhanh hơn thuật toán DDA khi vẽ đường thẳng?
Thuật toán DDA (Digital Differential Analyzer) bắt buộc phải thực hiện các phép cộng số thực và phép làm tròn tại mỗi bước nhảy tọa độ. Ngược lại, Bresenham khử hoàn toàn mẫu số của hệ số góc bằng cách nhân hai vế với vi phân $dx$, chuyển toàn bộ quá trình tính toán và kiểm tra điều kiện rẽ nhánh sang các phép toán cộng, trừ và nhân trên tập số nguyên.

2. Điểm phân chia hai nhánh khi vẽ đường elip trong thuật toán Bresenham và Midpoint được xác định như thế nào?
Điểm phân chia được xác định tại vị trí tiếp tuyến của đường elip có hệ số góc bằng $-1$ (tương ứng vector gradient có $\frac{dx}{dy} = 1$). Tại vùng 1 (từ trên xuống), biến thiên hoành độ lớn hơn tung độ ($x$ tăng nhanh hơn $y$); tại vùng 2 (từ dưới lên), biến thiên tung độ lớn hơn hoành độ ($y$ thay đổi nhanh hơn $x$). Việc chia nhánh giúp nét vẽ elip mịn màng, không bị đứt gãy điểm ảnh.

3. Nhược điểm cốt lõi của thuật toán tô màu loang (Flood Fill) bằng đệ quy là gì và tài liệu giải quyết bằng cách nào?
Nhược điểm của đệ quy 4 hướng là dễ gây tràn bộ nhớ ngăn xếp (stack overflow) khi tô các miền diện tích rộng, đồng thời một điểm ảnh có thể bị xét duyệt lặp đi lặp lại nhiều lần gây suy giảm hiệu năng. Tài liệu đề xuất phương án thay thế đệ quy bằng cấu trúc dữ liệu hàng đợi (Queue) theo thuật toán tìm kiếm theo chiều rộng (BFS) để quản lý danh sách điểm hạt giống theo từng dòng quét.

4. Ứng dụng mô phỏng 3D của đề tài sử dụng các hàm nào của thư viện GLU để tạo hình vật thể?
Chương trình sử dụng con trỏ đối tượng bậc hai GLUquadricObj* obj = gluNewQuadric() kết hợp với hai hàm dựng hình chính: gluCylinder (để tạo bệ phóng dạng ống trụ và thân tàu vũ trụ) và gluSphere (để tạo các khối mây và chi tiết hình cầu).

5. Bầu trời sao trong khung cảnh 3D được biểu diễn và vẽ bằng cấu trúc dữ liệu nào?
Trường sao được biểu diễn qua cấu trúc struct Point { float x, y, z; unsigned char r, g, b, a; }, lưu trữ tập trung trong mảng động std::vector<Point> points gồm 150 điểm, và được kết xuất trực tiếp lên màn hình thông qua hàm mảng đỉnh glDrawArrays(GL_POINTS, 0, points.size()).


Kết luận

Báo cáo chuyên đề học phần "Mô phỏng chuyển động tàu vũ trụ trong đồ họa máy tính" của nhóm sinh viên Trường Đại học Điện Lực đã hoàn thành toàn diện các mục tiêu nghiên cứu lý thuyết và thực nghiệm phần mềm. Công trình làm rõ bản chất toán học của các giải thuật rasterization kinh điển trong không gian 2D, đồng thời hiện thực hóa thành công ứng dụng đồ họa 3D mô phỏng quá trình phóng tàu vũ trụ bằng thư viện OpenGL/GLUT. Báo cáo là nguồn tài liệu học thuật có cấu trúc rõ ràng, tính ứng dụng cao cho sinh viên công nghệ thông tin trong quá trình tiếp cận nền tảng đồ họa máy tính.