opengl_7336

49
OPENGL Gii thiu và tng quan thư viên OpenGL và GLUT

Transcript of opengl_7336

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 1/49

OPENGL

Giới thiệu và tổng quan thư viên

OpenGL và GLUT

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 2/49

Giới thiệu OpenGL 

• OpenGL (Open Graphics Library) là một tiêuchuẩ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ủaMicrosoft

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 3/49

Không gian trong OpenGL

• Không gian trong OpenGL được miêu tả quahình học xạ ảnh. Một điểm trong không giannà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. 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 4/49

Thiết kế 

• OpenGL được thiết kế nhằm thỏa mãn mục đích chínhsau:

 – Che dấu sự tuơng tác phức tạp với các bộ máy xúc tiến 3chiề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ằngcá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ìnhhọ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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 5/49

 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âydự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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 6/49

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

 – ………….. 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 7/49

Hình ảnh 

Khúc xạ dùng OpenGL 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 8/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 9/49

Kết cấu di dộng dùng OpenGL 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 10/49

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

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 11/49

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ụngOpenGL

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 13/49

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,…)

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 14/49

Cài đặt OpenGL 

Cài đặt trên Windows 

Cài đặt trên Mac OS X 

Cài đặt trên Linux 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 15/49

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

Sudo apt-get install g++

• Tạo file code C++ (.CPP)

• Compile và run

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 16/49

Cài đặt trên Windows và Visual Studio

2010/2008

•  runtime libraries: opengl32.ddl, glu32.ddlC:\Windows\System32\ 

trên win 64 bít thì C:\Windows\SysWOW64

•  header files: GL.h, GLU.h

C:\Program Files\MicrosoftSDKs\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\MicrosoftSDKs\Windows\v7.0A\Lib\OpenGL32.Lib

Trên win 64 bit thì là Program Files (x86) VS2008: v6.0A

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 17/49

Video hướng dẫn 

• Video (settup1.wmv) Windows 32bit – VisualC++ 2010

• Video (settup2.wmv) Windows 64bit – Visual

studio 2010

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 18/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 19/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 20/49

Tạo Project 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 21/49

  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; 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 22/49

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

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 23/49

glutInitDisplayMode()

• Điều tiếp theo chúng tôi cần làm là gọiglutInitDisplayMode() 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ốnsử 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 đôiGLUT_DOUBLE.

• Cuối cùng, bạn phải quyết định xem bạn muốn sử dụngmột bộ đệm chiều sâu GLUT_DEPTH, đệm stencilGLUT_STENCIL và / hoặc đệm một sự tích lũyGLUT_ACCUM.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 24/49

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

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 25/49

glutInitWindowPosition()

• Hàm glutInitWindowPosition() được  sử  dụng 

để xác định vị trí màn hình cho góc trên bêntrái của cửa sổ ban đầu.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 26/49

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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 27/49

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 trongnhữ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 .

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 28/49

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 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 29/49

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!

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 30/49

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ểudữ 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 DoubleGLdouble,

GLclampd

Ub 8-bit unsigned integer unsigned char GLubyte,GLboolean

Us 16-bit unsigned integer unsigned short GLushort

Ui 32-bit unsigned integerunsigned int or unsigned

long

GLuint, GLenum,

GLbitfield

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 31/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 32/49

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()

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 33/49

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 WglKhông có tiềntố đặc biệt 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 34/49

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ạomộ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();

 }

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 35/49

Đặ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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 36/49

RGBA

• RGBA(red, green, blue, alpha) là chế độ màukế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 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 37/49

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ùngnguồ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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 38/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 39/49

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 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 40/49

Đặ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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 41/49

Định nghĩa một hình 

• Để  tạo một đối  tượng hình học  từ các vertex, ta baokhố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();

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 42/49

Tham số cho hàm glBegin() 

Value MeaningGL_POINTS

Treats each vertex as a single point. Vertex n defines point

n. N points are drawn.

GL_LINESTreats each pair of vertices as an independent line segment.

Vertices 2n - 1 and 2n define line n. N/2 lines are drawn.

GL_LINE_STRIPDraws a connected group of line segments from the firstvertex 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 verticesN 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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 43/49

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 definetriangle 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 foreach 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.

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 44/49

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 45/49

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ềnxóa, thiết lập được màu vẽ, định nghĩa đượccác đường thẳng 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 46/49

 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 47/49

 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 48/49

Tài liệu tham khảo 

1. http://www.videotutorialsrock.com/index.php 2. http://msdn.microsoft.com/en-

us/library/windows/desktop/dd374278%28v=vs.

85%29.aspx 3. http://cs.uccs.edu/~ssemwal/man.html 

4. http://kevinjame.wordpress.com/learning/comput

er-graphic/co-ban-ve-opengl/  

5. http://www.lighthouse3d.com/opengl/tutorials.sh

tml 

7/30/2019 opengl_7336

http://slidepdf.com/reader/full/opengl7336 49/49

Thành Viên Nhóm

1.Đặng Tiến Ngọc 

2.Nguyễn Đình Bảo 

3.Nguyễn Đình Luật