OpenGL (Open Graphics Library) là một tiêu
chuẩn kỹ thuật đồ họa có mục đích định ra một giao
diện lập trình ứng dụng (API) đồ họa ba chiều.
OpenGL cũng có thể được dùng trong các ứng dụng đồ
họa 2 chiều. Giao diện lập trình này chứa khoảng 250
hàm để vẽ các cảnh phức tạp từ những hàm đơn giản. Nó
được dùng rộng rãi trong các trò chơi điện tử. Ngoài ra nó
còn được dùng ứng dụng CAD, thực tại ảo, mô phỏng
khoa học, mô phỏng thông tin, phát triển trò chơi.
                
              
                                            
                                
            
                       
            
                 49 trang
49 trang | 
Chia sẻ: lylyngoc | Lượt xem: 4895 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang tài liệu Giới thiệu và tổng quan thư viên OpenGL và GLUT, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
OPENGL 
Giới thiệu và tổng quan thư viên 
OpenGL và GLUT 
Giới thiệu OpenGL 
• OpenGL (Open Graphics Library) là một tiêu 
chuẩn kỹ thuật đồ họa có mục đích định ra một giao 
diện lập trình ứng dụng (API) đồ họa ba chiều. 
OpenGL cũng có thể được dùng trong các ứng dụng đồ 
họa 2 chiều. Giao diện lập trình này chứa khoảng 250 
hàm để vẽ các cảnh phức tạp từ những hàm đơn giản. Nó 
được dùng rộng rãi trong các trò chơi điện tử. Ngoài ra nó 
còn được dùng ứng dụng CAD, thực tại ảo, mô phỏng 
khoa học, mô phỏng thông tin, phát triển trò chơi. 
• OpenGL còn một đối thủ cạnh tranh là DirectX của 
Microsoft 
Không gian trong OpenGL 
• Không gian trong OpenGL được miêu tả qua 
hình học xạ ảnh. Một điểm trong không gian 
này có tất cả 4 tọa độ. Cách thể hiện các điểm 
trong không gian bằng 4 tọa độ cho phép xử lý 
các điểm vô tận một cách tổng quát. Vì vậy mã 
nguồn các ứng dụng đã được đơn giản hóa đi 
nhiều. 
Thiết kế 
• OpenGL được thiết kế nhằm thỏa mãn mục đích chính 
sau: 
– Che dấu sự tuơng tác phức tạp với các bộ máy xúc tiến 3 
chiều bằng cách đưa ra một giao diện lập trình thống nhất. 
– Che dấu các sự khác biệt giữa các phần cứng 3 chiều bằng 
cách bắt buộc các phần cứng tương thích OpenGL phải hỗ 
trợ tất cả các chức năng của giao diện OpenGL. Nếu cần, 
các chức năng chưa được hỗ trợ đầy đủ bởi phần cứng có 
thể được hỗ trợ bằng phần mềm. 
Các thao tác OpenGL cơ bản là nhận các nguyên hàm hình 
học như điểm, đường thẳng và đa giác rồi chuyển thành các 
điểm đồ họa (pixel) trên màn hình. 
Những thứ OpenGL không hỗ trợ 
• Bản thân OpenGL không có sẵn các hàm nhập 
xuất hay thao tác trên window 
• OpenGL không có sẵn các hàm cấp cao để xây 
dựng các mô hình đối tượng, thay vào đó, người 
dùng phải tự xây dựng từ các thành phần hình học 
cơ bản ( điểm, đoạn thẳng, đa giác). 
Rất may là một số thư viện cung cấp sẵn một số 
hàm cấp cao được xây dựng nên từ OpenGL. 
GLUT (OpenGL Utility Toolkit) là một trong số 
đó và được sử dụng rộng rãi. Trong tài liệu này, 
chúng ta sẽ sử dụng chủ yếu là OpenGL và 
GLUT. 
Các trò chơi được viết với OpenGL 
• Hẳn các bạn đều biết game này? 
– Half-Life 
– Warcraft 3 
– World of Warcraft 
– CounterStrike 1.6 
– America's Army 
– City of Villains 
– Serious Sam 
– ………….. 
Hình ảnh 
Khúc xạ dùng OpenGL 
Trò chơi dùng OpenGL 
Kết cấu di dộng dùng OpenGL 
Tài liệu tham khảo 
• GLSL - Ngôn ngữ chuyển màu OpenGL 
• Cg - Ngôn ngữ chuyển màu của hãng nVidia 
dùng cho OpenGL 
• Java OpenGL - OpenGL cho JavaOpenGL 
• ES - OpenGL for embedded systems 
• OpenAL - Thư viện âm thanh tự do thiết kế với 
mục địch dùng chung với OpenGL. 
• OpenSL ES - Một thư viện âm thanh khác 
• Graphics pipeline 
Thư viện hỗ trợ OpenGL 
• GLUT - Thư viện công cụ cho OpenGL 
• GLU - Thư viện hàm cho các ứng dụng 
OpenGL 
Các giao diện lập trình đồ họa khác 
• Mesa 3D - Một thư viện thực thi OpenGL mã 
nguồn mở 
• Direct3D - Thư viện đồ họa của Microsoft 
• Light Weight Java Game Library 
• VirtualGL 
OpenGL Utility Toolkit (GLUT) 
• Để khắc phục một số nhược điểm của OpenGL, 
GLUT được tạo ra với với nhiều hàm hỗ trợ 
– Quản lý window 
– Display callback 
– Nhập xuất (bàn phím, chuột,…) 
– Vẽ một số đối tượng 3D phức tạp (mặt cầu, 
khối hộp,…) 
Cài đặt OpenGL 
Cài đặt trên Windows 
Cài đặt trên Mac OS X 
Cài đặt trên Linux 
Cài đặt môi trường Linux 
• Chuẩn bị thư viện: 
– Copy file thư viện của OpenGL vào thư mục 
/usr/include/GL/ 
– Cài đặt thư viện glut cho hệ thống: Sudo apt-get install 
freeglut3-dev 
• Cài đặt trình biên dịch C/C++ GNU: tại terminal 
gõ 
Sudo apt-get install g++ 
• Tạo file code C++ (.CPP) 
• Compile và run 
Cài đặt trên Windows và Visual Studio 
2010/2008 
• runtime libraries: opengl32.ddl, glu32.ddl 
 C:\Windows\System32\ 
trên win 64 bít thì C:\Windows\SysWOW64 
• header files: GL.h, GLU.h 
C:\Program Files\Microsoft 
SDKs\Windows\v7.0A\Include\GL\ 
Trên win 64 bit thì là Program Files (x86) VS2008: v6.0A 
• linker library: OpenGL32.lib 
 C:\Program Files\Microsoft 
SDKs\Windows\v7.0A\Lib\OpenGL32.Lib 
Trên win 64 bit thì là Program Files (x86) VS2008: v6.0A 
Video hướng dẫn 
• Video (settup1.wmv) Windows 32bit – Visual 
C++ 2010 
• Video (settup2.wmv) Windows 64bit – Visual 
studio 2010 
Tạo Project 
 Cấu trúc chương trình openGL đơn giản 
• Xét hàm main sau: 
int main(int argc, char** argv) 
{ 
 glutInit(&argc, argv); 
 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
 glutInitWindowSize (250, 250); 
 glutInitWindowPosition (100, 100); 
 glutCreateWindow ("hello"); 
 init (); 
 glutDisplayFunc(display); 
 glutMainLoop(); 
 return 0; 
} 
Khởi tạo - glutInit 
• Điều đầu tiên chúng ta cần làm là gọi glutInit() 
làm thủ tục khởi tạo. Nó phải được gọi trước khi 
bất kỳ đối tượng GLUT nào bởi vì nó khởi tạo 
thư viện GLUT . 
• argc, argv là 2 đối số dòng lệnh của hàm main 
glutInitDisplayMode() 
• Điều tiếp theo chúng tôi cần làm là gọi 
glutInitDisplayMode() làm thủ tục để xác định chế độ 
hiển thị cho cửa sổ.Bạn phải quyết định xem bạn muốn 
sử dụng một RGBA GLUT_RGBA hoặc màu chỉ số 
GLUT_INDEX mô hình màu. 
• Khi thiết lập chế độ hiển thị là liệu bạn muốn sử dụng 
đệm đơn GLUT_SINGLE hoặc đệm đôi 
GLUT_DOUBLE. 
• Cuối cùng, bạn phải quyết định xem bạn muốn sử dụng 
một bộ đệm chiều sâu GLUT_DEPTH, đệm stencil 
GLUT_STENCIL và / hoặc đệm một sự tích lũy 
GLUT_ACCUM. 
glutInitWindowSize() 
• Hàm này sử dụng tạo kích thức của cửa sổ, 
trong cửa số màn hình với tham số truyền vào 
là chiều cao và chiều rộng tính bằng pixcel 
glutInitWindowPosition() 
• Hàm 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. 
Tạo của sổ - glutCreateWindow() 
• Để 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. 
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 . 
Chức năng định lại hình 
• glutReshapeFunc() hàm này được gọi bất cứ 
khi nào cửa sổ thay đổi hay di chuyển 
Vòng lặp chính 
• Cuối là gọi glutMainLoop(). Tất cả các cửa sổ 
đã được tạo ra có thể được hiển thị 
• Chương trình sẽ có thể xử lý các sự kiện như 
chúng xảy ra (click chuột, thay đổi kích thước 
cửa sổ, vv.). Ngoài ra, gọi lại hiển thị (từ 
glutDisplayFunc()) được kích hoạt. Sau khi 
vòng lặp này được nhập vào, nó không bao giờ 
đã thoát! 
Bảng dữ liệu, hậu tố trong OpenGL 
Hậu tố Kiểu dữ liệu Tương ứng kiểu dữ liệu C 
Tương ứng kiểu 
dữ liệu OpenGL 
B 8-bit integer signed char Glbyte 
S 16-bit integer Short Glshort 
I 32-bit integer int or long GLint, Glsizei 
F 32-bit floating-point Float GLfloat, Glclampf 
D 64-bit floating-point Double 
GLdouble, 
GLclampd 
Ub 8-bit unsigned integer unsigned char 
GLubyte, 
GLboolean 
Us 16-bit unsigned integer unsigned short GLushort 
Ui 32-bit unsigned integer 
unsigned int or unsigned 
long 
GLuint, GLenum, 
GLbitfield 
Cú pháp đặt tên 
• glColor3f(…) 
• Ví dụ lệnh glVertex2f() có hậu tố, cho biết đối số 
là 2 dấu chấm động. 
• Tương tự, OpenGL đặt tên các hằng số bắt đầu 
bằng GL_ và các từ tiếp sau đều được viết hoa và 
cách nhau bởi dấu ‘_’ ví dụ: 
GL_COLOR_BUFFER_BIT 
Thư viện Hàm cơ bản Số lượng đối sô Kiểu dữ liệu 
= gl Color 3 f(…) 
Các kiểu glVertex 
• glVertex có đến 24 dạng: 
• Chú ý rằng có 12 lệnh có 12 lệnh kết thúc bằng 
chữ v, cho biết các đối số được cho dưới dạng 
vecter 
glVertex2d() glVertex2f() glVertex3d() glVertex3f() glVertex4d() glVertex4f() 
glVertex2i() glVertex2s() glVertex3i() glVertex3s() glVertex4i() glVertex4s() 
glVertex2dv() glVertex2fv() glVertex3dv() glVertex3fv() glVertex4dv() glVertex4fv() 
glVertex2iv() glVertex2sv() glVertex3iv() glVertex3sv() glVertex4sv() glVertex4iv() 
Các tiền tố trong OpenGL 
Thư viện Bộ hạt nhân Utility Auxiliary WGL Win32 API 
Tiền tố gl glu Aux Wgl 
Không có tiền 
tố đặc biệt 
Xét một chương trình OpenGL tối thiểu 
• Xét đoạn mã sử dụng các hàm OpenGL để tạo 
một đoạn thẳng mầu trắng và nền đen: 
void ve_DoanThang_OpenGL(){ 
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
glClear(GL_COLOR_BUFFER_BIT); 
glColor(1.0f, 1.0f, 1.0f); 
glBegin(GL_LINE) 
glVertex2f(0.25f, 0.25f); 
glVertex2f(0.75f, 0.25f); 
glEnd(); 
glFlush(); 
} 
Đặt mầu xóa 
• glClearColor() để thiết lập màu nền ở chế độ 
RGBA. Bốn đối số của hàm này là các giá trị 
có kiểu dữ liệu GLclampf, biểu diễn các thành 
phần màu: đỏ, xanh lá, xanh dương và alpha. 
RGBA 
• RGBA(red, green, blue, alpha) là chế độ màu 
kết hợp hệ thống RGB với alpha (là thành 
phần dùng điều khiển việc trộn màu). 
• Giá trị alpha =1 tương ứng độ mờ đục hoàn 
toàn, giá trị alpha = 0 tương ứng tính trong 
suốt hoàn toàn 
RGB 
• RGB(red, green, blue) là chế độ pha trộn hay 
phương pháp thể hiện màu trên phương tiện dùng 
nguồn sáng như màn hình màu. RGB pha trộn 
theo tỷ lệ phần trăm các màu cơ bản là đỏ, xanh lá 
và xanh dương để tạo nên các màu khác. Hệ điều 
hành windows định nghĩa các tỷ lệ này bằng giá 
trị 8 bit, gọi là giá trị RGB. Giá trị RGB(0,0,0), 
tức không phần trăm (cường độ thấp nhất) của cả 
3 màu cơ bản, cho ra màu đen. Giá trị 
RGB(255,255,255), tức 100 phần trăm (cường độ 
cao nhất) của cả 3 màu cơ bản, cho ra màu trắng. 
Xóa bộ đệm màu 
• glClear() xóa bộ đệm màu với màu xóa hiện hành. 
• Đối số của nó như một chuỗi các cờ bit cho biết bộ 
đệm nào cần xóa (hàm không trả về giá trị). Bộ đệm 
màu (được biểu thị bởi cờ GL_COLOR_BUFFER_BIT ) 
là vùng bộ nhớ chứa ảnh thực được thể hiện trên màn 
hình. 
• OpenGL sử dụng các loại bộ nhớ khác, bao gồm bộ 
đệm chiều sâu và bộ đệm stencil, để giúp nó xử lý 
ảnh. 
Xóa bộ đệm màu 
• Buffer Name: 
– Color buffer GL_COLOR_BUFFER_BIT 
– Depth buffer GL_DEPTH_BUFFER_BIT 
– Accumulation buffer GL_ACCUM_BUFFER_BIT 
– Stencil buffer GL_STENCIL_BUFFER_BIT 
Đặt mầu hiện hành 
• glColor3f(…) thiết lập mầu vẽ hiện hành 
• Mọi đối tượng sẽ được vẽ mầu đã chọn cho 
đến khi một hàm glColor() khác được gọi 
• Có thể tác động một cách sâu sắc đến màu của 
các đối tượng trên màn hình nhờ vào các thao 
tác đồ họa như chiếu sáng, tạo bóng, làm mờ 
và pha trộn. 
Định nghĩa một hình 
• Để tạo một đối tượng hình học từ các vertex, ta bao 
khối khai báo vertex bằng hai hàm glBegin(param) và 
glEnd(). Tham số param đưa vào cho hàm glBegin() 
sẽ giúp OpenGL quyết định vẽ gì từ các vertex khai 
báo bên trong ví dụ: 
glBegin(GL_POLYGON); 
 glVertex2f(0.0, 0.0); 
 glVertex2f(0.0, 1.0); 
 glVertex2f(0.5, 1.0); 
 glVertex2f(1.0, 0.5); 
 glVertex2f(0.5, 0.0) 
glEnd(); 
Tham số cho hàm glBegin() 
Value Meaning 
GL_POINTS 
Treats each vertex as a single point. Vertex n defines point 
n. N points are drawn. 
GL_LINES 
Treats each pair of vertices as an independent line segment. 
Vertices 2n - 1 and 2n define line n. N/2 lines are drawn. 
GL_LINE_STRIP 
Draws a connected group of line segments from the first 
vertex to the last. Vertices n and n+1 define line n. N - 1 
lines are drawn. 
GL_LINE_LOOP 
Draws a connected group of line segments from the first 
vertex to the last, then back to the first. Vertices n and n + 1 
define line n. The last line, however, is defined by vertices 
N and 1. N lines are drawn. 
GL_TRIANGLES 
Treats each triplet of vertices as an independent triangle. 
Vertices 3n - 2, 3n - 1, and 3n define triangle n. N/3 
triangles are drawn. 
Tham số cho hàm glBegin() 
Value Meaning 
GL_TRIANGLE_STRIP 
Draws a connected group of triangles. One triangle is defined for each 
vertex presented after the first two vertices. For odd n, vertices n, n + 1, 
and n + 2 define triangle n. For even n, vertices n + 1, n, and n + 2 define 
triangle n. N - 2 triangles are drawn. 
GL_TRIANGLE_FAN 
Draws a connected group of triangles. one triangle is defined for each 
vertex presented after the first two vertices. Vertices 1, n + 1, n + 2 define 
triangle n. N - 2 triangles are drawn. 
GL_QUADS 
Treats each group of four vertices as an independent quadrilateral. Vertices 
4n - 3, 4n - 2, 4n - 1, and 4n define quadrilateral n. N/4 quadrilaterals are 
drawn. 
GL_QUAD_STRIP 
Draws a connected group of quadrilaterals. One quadrilateral is defined for 
each pair of vertices presented after the first pair. Vertices 2n - 1, 2n, 2n + 
2, and 2n + 1 define quadrilateral n. N/2 - 1 quadrilaterals are drawn. Note 
that the order in which vertices are used to construct a quadrilateral from 
strip data is different from that used with independent data. 
GL_POLYGON Draws a single, convex polygon. Vertices 1 through N define this polygon. 
Tham số cho hàm glBegin() 
• Giá trị của các vertex trên dựa trên các tọa độ 
Decarat mặc định thiết lập trong OpenGL. Các 
tọa độ mặc định này tạo nên một khối vuông 
2x2x2, với gốc tọa độ (0,0) tại tâm khối vuông. 
• Hàm glVertex() chỉ là 1 trong 12 hàm có thể 
dùng giữa cặp glBegin() và glEnd(). Các hàm 
đó là : glVertex(), glCallist(), glCallists(), 
glColor(), glEdgeFlag(), glEvalCoord(), 
glIndex(), glMaterial(), glNormal(), 
glTextCoord(), 
Bảo Đảm Các Thao Tác Vẽ Hoàn Tất 
• Chương trình đã thiết lập được mầu xóa, nền 
xóa, thiết lập được màu vẽ, định nghĩa được 
các đường thẳng 
Tài liệu tham khảo 
1.  
2. 
us/library/windows/desktop/dd374278%28v=vs.
85%29.aspx 
3.  
4. 
er-graphic/co-ban-ve-opengl/ 
5. 
tml 
Thành Viên Nhóm 
1.Đặng Tiến Ngọc 
2.Nguyễn Đình Bảo 
3.Nguyễn Đình Luật