TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN MẠNG VÀ TRUYỀN THÔNG
BÀI TẬP LỚN CHUYÊN ĐỀ II
ĐỀ TÀI:
LẬP TRÌNH ĐỒ HỌA
ỨNG DỤNG THƯ VIỆN OPENGL TRÊN LINUX
Sinh viên : Lê Phương Tiến 07T2
Hà Phước Việt 07T1
Cán bộ hướng dẫn : Nguyễn Tấn Khôi
Đà Nẵng 2010
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 2
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
............................................................................................................................................................
3.1.1. Points, Lines and Polygons............................................................17
3.1.2. Vẽ các đối tượng không gian ( Drawing 3-D Objects )..................19
3.1.3. Các phép biến đổi ( Transformations )...........................................19
3.1.4. Danh sách hiển thị ( Display Lists )...............................................20
3.2. KHUNG HIỂN THỊ ( VIEWING )...............................................................22
3.2.1. Màu sắc ( Color )...........................................................................22
3.2.2. Độ bóng ( Shading ) ......................................................................23
3.2.3. Khung hình biến đổi ( Viewing Transformation )..........................23
3.2.4. Phép chiếu ( Projection )................................................................24
3.2.5. Thao tác ngăn xếp ma trận ( Manipulating the Matrix Stacks )......25
3.2.6. Ánh sáng ( Light )..........................................................................26
3.2.7. Khung quan sát biến đổi ( Viewport Transformation )...................27
CHƯƠNG 4. CHƯƠNG TRÌNH DEMO............................................................27
4.1. CÁC KỸ THUẬT SỬ DỤNG CHO CHƯƠNG TRÌNH.......................................27
4.2. MÃ NGUỒN...........................................................................................28
4.3. KẾT QUẢ CHẠY.....................................................................................35
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 4
TỔNG QUAN VỀ ĐỀ TÀI
1. Bối cảnh và lý do thực hiện đề tài
Ngày nay đồ họa máy tính đóng một vai trò quan trong, quyết định không nhỏ
đến sự thành công hay thất bại của một sản phẩm phần mềm. Sản phẩm làm ra ngoài
tính năng đáp ứng được nhu cầu sử dụng thì mẫu giao diện đồ họa phải bắt mắt, than
thiện với người sử dụng, có như thế thì sản phẩm mới có thể thành công. Ngoài các sản
phẩm phần mềm thì một xu hướng mới nữa đó là các bộ phim hoạt hình 3D cũng đang
rất được quan tâm.
Nhận thấy tìm năng vả khả năng phát khiển mạnh của công nghiệp đồ họa, chúng
em lựa chọn đề tài: Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux. Đây là
một thư viên hỗ trợ các công cụ mạnh mẽ để vẽ và xử lý các đối tượng đồ họa.
2. Mục tiêu đề tài
thừa thói quen cũng có thông số tương đối ít.
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 6
1.2. Cách cài đặt
1.2.1. Môi trường cài đặt
Quá trình tìm hiểu và viết chương trình được thực hiện trên môi trường Linux phiên
bản Ubuntu 10.10. OpenGL là một bộ thư viện mở có thể sử dụng ở môi cả môi trường
Windows nhưng Ubuntu là một hệ điều hành mở, kho tài liệu phong phú, luôn có một
cộng động sẵn sang giúp đỡ khi có vẫn đề khó khăn.
Các gói thư viện của openGL : GLUT,AUX, XLIB…..
1.2.2. Cài đặt
• Cài đặt trình biên dịch C/C++ GNU: tại terminal gõ
Sudo apt-get install gcc
Sudo apt-get install g++
Sau khi cài đặt kiểm tra lại thử đã có hay chưa
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 7
• Cài đặt bộ thư viện Opengl
Administrator->synaptic->search với từ khóa opengl: Lựa chọn và make các file
cần thiết và apply
1.2.3. Sử dụng thư viện openGL
• Cách biên dịch 1 bài C đơn giản
• Cách biên dịch C có sử dụng thư viện OpenGL
Tại terminal gõ: gcc [filenam].c –o [filenam] –lglut –lGLU –lGL
Dùng makefile : vào terminal đưa về thư mục chứa code và makefile
gõ make là xong
Chương 2. CƠ BẢN VỀ OPENGL
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 8
2.1. Cấu trúc chương trình openGL đơn giản
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 9
có giá trị độ sâu lớn hơn. Các bộ đệm thứ hai, bộ đệm stencil được sử dụng để hạn chế
vẽ để phần nào đó của màn hình, chỉ như là một stencil tông có thể được sử dụng với
một hộp sơn xịt để làm cho một hình ảnh in. Cuối cùng, bộ đệm tích lũy được sử dụng
để tích lũy một loạt các hình ảnh vào một hình ảnh sáng tác cuối cùng. Không ai trong
số này là các bộ đệm mặc định.
Cần phải tạo ra các đặc tính của cửa sổ. Một tham số đến glutInitWindowSize () sẽ
được sử dụng để xác định kích thước, trong ảnh, trong cửa sổ inital của bạn. Chiều cao
và chiều rộng (bằng pixel) của cửa sổ yêu cầu. Tương tự như vậy,
glutInitWindowPosition () được sử dụng để xác định vị trí màn hình cho góc trên bên
trái của cửa sổ ban đầu. Những giá trị, x và y, cho biết vị trí của các cửa sổ liên quan
đến toàn bộ màn hình hiển thị.
2.1.2. Tạo của sổ
Để thực sự tạo ra một cửa sổ, với các thiết lập đặc điểm trước đó (hiển thị chế độ,
kích thước, vị trí, vv), sử dụng glutCreateWindow () để khởi tạo. Lệnh này có một
chuỗi như một tham số mà có thể xuất hiện trong thanh tiêu đề nếu hệ thống cửa sổ bạn
đang sử dụng hỗ trợ nó cửa sổ là không thực sự hiển thị cho đến khi glutMainLoop ()
được nhập vào.
2.1.3. Chức năng hiển thị
Hàm glutDisplayFunc () làm thủ tục là sự kiện quan trọng đầu tiên của hầu hết các
chức năng gọi lại và hiển thị . Một chức năng gọi lại là một trong những nơi hàm đã
được định nghĩa ,ứng với mỗi hàm sẽ có một sự kiện phù hợp . Ví dụ, các đối số của
glutDisplayFunc () là chức năng được GLUT xác định rằng nội dung của cửa sổ cần
phải được hiển thị lại. Vì vậy, bạn nên đặt tất cả các hàm mà bạn cần hiển thị ra một
cảnh trong chức năng gọi lại hiển thị.
2.1.4. Chức năng định lại hình
Hàm glutReshapeFunc () là một chức năng gọi lại rằng quy định cụ thể chức năng
đó được gọi là bất cứ khi nào cửa sổ được thu nhỏ hoặc di chuyển. Thông thường, các
chức năng đó được gọi khi cần thiết cho thay đổi hình dáng chức năng hiển thị cửa sổ
void drawScene() {
}
int main(int argc, char** argv) {
//Khoi tao GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400); /
// Tao cua so
glutCreateWindow("Demo");
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 11
initRendering(); //Khoi tao cac thuoc tinh lien qua
// cac ham ve, lay ban phim va resize
glutDisplayFunc(drawScene);
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutMainLoop(); //vong lap chinh de duy tri su ve
return 0;
}
• Ví dụ chương trình đơn giản “Hello.c”
#include <GL/glut.h>
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glBegin(GL_POLYGON);
glClearColor (). Tương tự như vậy, OpenGL xác định hằng số bắt đầu bằng GL_, sử
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 12
dụng tất cả các chữ in hoa, và sử dụng gạch dưới những từ riêng biệt (như
GL_COLOR_BUFFER_BIT).
Bạn cũng có thể đã nhận thấy một số không liên quan thư dường như nối thêm vào
một số tên lệnh (các 3f trong glColor3f ()). Sự thật là phần màu của tên lệnh là đủ để
xác định các lệnh là một trong những bộ màu sắc hiện hành. Tuy nhiên, nhiều hơn một
lệnh như vậy đã được xác định để bạn có thể sử dụng các loại khác nhau của các đối
số;. Trong đó, 3 phần của hậu tố chỉ ra rằng ba đối số được đưa ra một phiên bản của
lệnh màu có bốn tham số của. F Phần hậu tố cho thấy rằng các đối số là số điểm float.
Một số các lệnh OpenGL chấp nhận có đến tám loại dữ liệu khác nhau cho các đối số
của họ. Các chữ được sử dụng như là hậu tố để xác định các kiểu dữ liệu cho ANSI C
triển khai thực hiện của OpenGL được thể hiện trong Bảng 1-1, cùng với các định
nghĩa OpenGL loại tương ứng. Việc thực hiện cụ thể của OpenGL mà bạn đang sử
dụng có thể không tuân theo sơ đồ chính xác, một thực hiện trong C + + hay Ada, ví
dụ, không cần.
Như vậy, hai lệnh
glVertex2i(1, 3);
glVertex2f(1.0, 3.0);
là tương đương, trừ trường hợp đầu tiên xác định tọa độ của đỉnh là số nguyên 32-bit và
lần thứ hai quy định chúng như là một điểm chính xác con số thực.
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt
Lập trình đồ họa ứng dụng thư viện OpenGL trên Linux 13
2.2.2. Máy trạng thái
OpenGL là một máy trạng thái. Bạn đặt nó vào trạng thái khác nhau (hay chế độ)
mà sau đó vẫn có hiệu lực cho đến khi thay đổi chúng. Như đã thấy, màu sắc hiện nay
là một biến trạng thái. Có thể đặt màu hiện tại để trắng, đỏ, hoặc bất kỳ màu nào khác,
và sau đó mỗi đối tượng được vẽ với màu sắc cho đến khi bạn thiết lập màu hiện tại để
cái gì khác. Màu sắc hiện tại chỉ là một trong nhiều biến trạng thái OpenGL lưu trữ .
Reference Manual. Glu sử dụng tiền tố Glu.
The OpenGL Extension to the X Window System (GLX), cung cấp một
phương tiện của việc tạo ra một bối cảnh OpenGL và liên kết nó với một cửa
sổ drawable trên một máy có sử dụng X Window System. GLX được cung
cấp như là một hỗ trợ cho OpenGL. Đó là mô tả chi tiết hơn trong cả hai D
Phụ lục và OpenGL Reference Manual. Một trong những sử dụng GLX (cho
framebuffer trao đổi) được mô tả trong "hoạt hình”. GLX sử dụng tiền tố
glx.
The OpenGL Programming Guide Auxiliary Library ( AUX ), Thư viện đã
được viết riêng cho cuốn sách này để làm ví dụ lập trình đơn giản và chưa
hoàn chỉnh hơn. Đó là chủ đề của phần tiếp theo, và đó là mô tả chi tiết tại
Phụ lục E, sử dụng thư viện aux tiền tố. "Làm thế nào để Lấy mẫu mã" mô
tả làm thế nào để có được những mã nguồn cho các thư viện phụ trợ.
Open Inventor là một bộ công cụ định hướng đối tượng dựa trên OpenGL
cung cấp các đối tượng và phương pháp để tạo chiều tương tác đồ họa ba
ứng dụng. Có sẵn từ Silicon Graphics và viết bằng C + +, Open Inventor
cung cấp xây dựng các đối tượng trước và tích hợp sẵn trong trường hợp mô
hình cho tương tác người dùng, cao cấp thành phần ứng dụng cho việc tạo
và ba chiều cảnh chỉnh sửa, và khả năng in ấn các đối tượng và trao đổi dữ
liệu trong đồ họa khác định dạng.
2.4. Hoạt cảnh (Animation )
Một trong những điều thú vị nhất mà bạn có thể làm trên một máy tính đồ họa được
vẽ hình ảnh chuyển động. Cho dù bạn là một kỹ sư đang cố gắng để xem tất cả các mặt
của một phần cơ khí bạn đang thiết kế, một phi công học tập để bay một máy bay sử
dụng một mô phỏng, hay chỉ đơn thuần là trò chơi máy tính một người đam mê, thì rõ
ràng rằng hoạt hình là một phần quan trọng trong đồ họa máy tính .
Để tạo ra một sử chuyển động của hình ảnh thì chỉ việc thay đổi các frame và kỹ
thuật này được dùng để làm hoạt hình, các đồ họa khác. Nhưng với sự vẽ xóa liên tục
GVHD: Nguyễn Tấn Khôi SVTH: Lê Phương Tiến – Hà Phước Việt