ng dn lập trình OpenGL căn bản
Đặng Nguyễn Đức Tiến Quc Hoàng - Lê Phong Page 1
ng dn lp trình OpenGL
căn bản
Tác gi: Phong
Tài liệu này được viết vi mục đích hướng dn lp trình OpenGL mức căn bản. Người
đọc đã phải nắm được mt s kiến thc thiết yếu v đồ ha 3D.
Tài liệu được viết da vào các chương 1, 2, 3, 4 và 13 trong OpenGL redbook
http://glprogramming.com/red
có lược b đi những kiến thức chưa cần thiết và t ch li, din gii lại ý cho rõ ràng hơn.
Người đọc được đề ngh tham kho trc tiếp trong sách đó.
ng dn lập trình OpenGL căn bản
Đặng Nguyễn Đức Tiến Quc Hoàng - Lê Phong Page 2
Chương 1: Gii thiu v OpenGL
1. OpenGL là gì
OpenGL b thư viện đồ ha khong 150 hàm giúp xây dựng các đối tượng giao tác cn
thiết trong các ng dụng tương tác 3D.
Nhng th OpenGL không h tr
bn thân OpenGL không có sn các hàm nhp xut hay thao tác trên window,
OpenGL không có sn các hàm cấp cao đ xây dng các mô hình đối tượng, thay o đó,
người dùng phi t xây dng t các thành phn hình hc bản ( điểm, đoạn thẳng, đa
giác).
Rt may mt s thư vin cung cp sn mt s hàm cấp cao được xây dng nên t OpenGL.
GLUT (OpenGL Utility Toolkit) là mt trong s đó và được s dng rng rãi. Trong tài liu này,
chúng ta s s dng ch yếu là OpenGL và GLUT.
Nhng th OpenGL h tr là các hàm đồ ha
xây dng các đối tượng phc tp t các tnh phn hình hc cơ bản (điểm, đoạn, đa giác,
nh, bitmap),
sp xếp đối tượng trong 3D và chn đim thun lợi để quan sát,
tính toán màu sc ca các đối tượng (màu sc ca đối tượng được quy đnh bi điều kin
chiếu sáng, texture của đối tượng, mô hình đưc xây dng hoc là kết hp ca c 3 yếu t
đó),
biến đổi nhng mô t toán hc của đối tượng thông tin màu sc thành các pixel trên
màn hình (quá trình này được gi là resterization).
2. Cu trúc lnh trong OpenGL
OpenGL s dng tin t gl và tiếp theo đó là những t được viết hoa ch cái đầu để to nên
tên ca mt lnh, d glClearColor(). Tương t, OpenGL đặt tên các hng s bắt đầu bng
GL_ các t tiếp sau đều được viết hoa cách nhau bi dấu ‘_’, dụ:
GL_COLOR_BUFFER_BIT.
Bên cnh đó, vi mt s lnh, đ ám ch s ng cũng như kiểu tham s được truyn, mt s
hu t được s dng như trong bảng sau
Hậu tố
Kiểu dữ liệu
Tương ứng với kiểu trong C
Tương ứng với kiểu trong OpenGL
ng dn lập trình OpenGL căn bản
Đặng Nguyễn Đức Tiến Quc Hoàng - Lê Phong Page 3
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
Ví dụ: glVertex2i(1,3) tương ứng với xác định một điểm (x,y) với x, y nguyên (integer).
Lưu ý: OpenGL có định nghĩa mt số kiểu biến, việc sử dụng c định nghĩa này thay định
nghĩa sẵn của C sẽ tránhy li khi biên dch code trên một hệ thống khác.
Một vài lệnh của OpenGL kết thúc bởi v ám chỉ rằng tham số truyền vào một vector.
Ví dụ: glColor3fv(color_array) t color_array là mảng 1 chiều có 3 phần tử là float.
3. OpenGL Utility Toolkit (GLUT)
Để khc phc mt s nhược điểm ca OpenGL, GLUT được to ra vi vi nhiu hàm h tr
qun window
display callback
nhp xut (bàn phím, chuột,…)
v mt s đối tượng 3D phc tp (mt cu, khi hộp,…)
Tên các hàm của GLUT đều có tin t là glut. Để hiểu rõ hơn về GLUT, người đọc tham kho
http://glprogramming.com/red/appendixd.html
4. Mt s ví d đơn giản
ng dn lập trình OpenGL căn bản
Đặng Nguyễn Đức Tiến Quc Hoàng - Lê Phong Page 4
Để khai báo s dng OpenGL và GLUT, chúng ta download đây
http://www.opengl.org/resources/libraries/glut/glut_downloads.php#windows
chép các file sau vào trong cùng thư mục ca project.
glut.h
glut32.dll
glut32.lib
4.1. Ví d 1
Chúng ta s v mt nh ch nht màu trng trên nền đen.
#include "glut.h"
/* hàm thc hin các thao tác v theo yêu cu ca chương trình */
void display(void)
{
/* xóa mi pixel */
glClear (GL_COLOR_BUFFER_BIT);
/* v hình ch nht có đim trái-trên và phi-i
* (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0)
*/
glColor3f (1.0, 1.0, 1.0); /* thiết lp màu v: màu trng */
glBegin(GL_POLYGON); /* bt đu v đa giác */
glVertex3f (0.25, 0.25, 0.0); /* xác đnh các đnh ca đ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 */
/*
* thc hin quá trình đy ra buffer
*/
glFlush ();
}
/* hàm thc hin các khi to */
void init (void)
{
/* chn màu đ xóa nn (tc là s ph nn bng màu này) */
glClearColor (0.0, 0.0, 0.0, 0.0); /* màu đen */
/* thiết lp các thông s cho view */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
/* hàm main ca chương trình */
ng dn lập trình OpenGL căn bản
Đặng Nguyễn Đức Tiến Quc Hoàng - Lê Phong Page 5
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* khi to chế độ v
single buffer và h màu RGB */
glutInitWindowSize (250, 250); /* khi to window kích thưc 250 x 250 */
glutInitWindowPosition (100, 100); /* khi to window ti ví trí
(100,100) trên screen */
glutCreateWindow ("rectangle"); /* tên ca window là ‘rectangle’ */
init (); /* khi to mt s chế độ đồ ha */
glutDisplayFunc(display); /* thiết lp hàm v là hàm display() */
glutMainLoop(); /* bt đu chu trình lp th hin v */
return 0;
}
Kết qu khi chạy chương trình
4.2. Ví d 2
Chúng ta s v hình ch nhật tương t như trong dụ 1, hơn nữa, hình ch nht này s quay
quanh tâm ca nó.
Để tránh trường hp hình b ‘giựt’ khi chuyển động, chúng ta s không dùng single buffer như
d1 mà s dùng double buffer. Ý tưng ca double buffer là
trong khi buffer 1 đang được ng để trình din frame t trên screen t chương trình s
dùng buffer 2 để chun b cho frame t+1,
khi đến lượt trình din frame t+1 t chương trình ch cn th hiện buffer 2 đưa buffer
1 v đằng sau để chun b cho frame t+2.