co ban lap trinh opengl

21
Cơ bn lp trình OpenGL Đình Phong – Lê Ngc  Thành

Upload: hoasua1325

Post on 30-May-2018

238 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 1/21

Cơ bản lập trình OpenGLVõ Đình Phong – Lê Ngọc

 Thành

Page 2: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 2/21

Nội dung

• Kiểu dữ liệu trong OpengGL• Quy tắc đặt tên hàm•

Hiểu thêm về GLUT• Viewport• Kỹ thuật hoạt hình• Bộ đệm kép

Page 3: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 3/21

Kiểu dữ liệu trong OpenGL• Để chương trình có tính khả chuyển trên

nhiều HĐH, OpenGL định nghĩa các kiểu dữ liệu cho riêng nó, với tiếp đầu ngữ GL.

Page 4: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 4/21

Quy tắc đặt tên hàm• Quy tắc đặt tên sẽ cung cấp thông tin:

 – Hàm thuộc về thư viện nào – Hàm có bao nhiêu tham số – Kiểu dữ liệu của tham số

• Cú pháp: <Library prefix><Rootcommand><Optional argumentcount><Optional argument type>

• Ví dụ glColor3f() – Lệnh gốc: Color – Thư viện: gl – Số lượng tham số: 3 – Kiểu tham số: float

Page 5: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 5/21

Hiểu thêm về GLUT

• Như ta đã biết… – Là một công cụ hữu ích cho học tập và

ví dụ minh họa. – Là môi trường thử nghiệm gọn nhẹ trước

khi đóng gói ứng dụng.•  Thử tìm hiểu một chương trình GLUT

đơn giản…

Page 6: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 6/21

Chương trình GLUT đơn giản• #include <GL/glut.h> // OpenGL toolkit

•  void RenderScene(void)• {

glClear(GL_COLOR_BUFFER_BIT);glFlush();

• }•  void SetupRC(void)• {

glClearColor(0.0f, 0.0f, 1.0f, 1.0f);• }• int main(int argc, char* argv[])• {

glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);glutCreateWindow(“Simple”);glutDisplayFunc(RenderScene);SetupRC();glutMainLoop();

return 0;• }

Page 7: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 7/21

Phân tích chương trình…• #include <GL/glut.h> 

 – Đã có glu.h và gl.h•  Trong thân hàm main:

 – Lệnh đầu tiên: glutInit (&argc,argv); – Chuyển tiếp các tham số cho GLUT

• Chế độ hiển thị• glutInitDisplayMode(GLUT_SINGLE |GLUT_RGBA);

• Các kiểu chế độ: – GLUT_SINGLE: bộ đệm đơn – GLUT_DOUBLE: bộ đệm kép – GLUT_RGBA: không gian màu RedGreenBlueAlpha – …

Page 8: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 8/21

Phân tích chương trình…

•  Tạo cửa sổ cho OpenGL• glutCreateWindow(“Simple”);•

Gán các callbacks• glutDisplayFunc(RenderScene);• Được gọi khi hiển thị lần đầu/co dãn

cửa sổ/cửa sổ được focus• Là nơi đặt các đoạn mã dựng cảnh

Page 9: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 9/21

Phân tích chương trình…

• Vòng lặp chương trình• glutMainLoop();•

Xử lý các thông điệp từ HĐH (chuột,bàn phím, button,…) cho đến khichương trình kết thúc.

 Tương tự hàm WinMain() của Win32Application

Page 10: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 10/21

Phân tích chương trình…• int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE

hPrevInstance, LPSTR lpCmdLine, int iCmdShow)• {

 – MSG msg; – bool done = false; – window.Initialize(800, 600, 32, false); –   – while(!done){

• if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ – if(msg.message==WM_QUIT){

» done = true; – } – else{

» TranslateMessage(&msg);» DispatchMessage(&msg);

 – }• }• else{

 – Render(); – window.Swap();

• } – } –   – window.Terminate(); – return msg.wParam;

• }

Page 11: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 11/21

Phân tích chương trình…• Một số lời gọi hàm gl…• glClearColor(0.0f, 0.0f, 1.0f, 1.0f);

 – Thiết lập màu xóa cửa sổ – Chú ý kiểu dữ liệu của màu là float !?

• Xóa bộ đệm pixels – glClear(GL_COLOR_BUFFER_BIT); – Xóa một hoặc nhiều buffer – Có nhiều loại buffer: color, depth, stencil,…

• “Thúc giục” hàng đợi lệnh: – glFlush(); – Thi hành các lệnh ngay lập tức

Page 12: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 12/21

Khái niệm Viewport

• Lý do: chúng ta muốn “kéo căng”một cảnh trên toàn cửa sổ, tức làmột con vịt vẽ trên cửa sổ kích thướcnhỏ sẽ nhỏ, nhưng vẽ trên cửa sổ lớnthì con vịt sẽ lớn hơn. Tất nhiên làcùng một con vịt đó!

• Khái niệm Viewport?...

Page 13: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 13/21

Khái niệm Viewport…• Nguyên nhân

 – Hiếm khi WxH của vùng xén ảnh lại khớphoàn toàn với WxH của vùng cửa sổ (Vùngxén ảnh là gì? Nhớ lại…)

• Hệ quả – Hệ tọa độ buộc phải ánh xạ từ HQC

Cartesian vùng xén ảnh sang HQCpixel vật lý trên màn hình hiển thị.

• Định nghĩa – là miền trên màn hình hiển thị dùng để vẽ

vùng không gian được đã được xén, hay làsự ánh xạ vùng xén ảnh lên một miền trênmàn hình

Page 14: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 14/21

Vài trường hợp củaViewport…

Page 15: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 15/21

Vài trường hợp củaViewport…

Page 16: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 16/21

Viewport trong OpenGL

• void glOrtho(GLdouble left, GLdoubleright, GLdouble bottom, GLdoubletop, GLdouble near, GLdouble far );

Page 17: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 17/21

Giữ nguyên ratio vật thể• Ratio = Horizontal / Vertical• Khi co/dãn cửa sổ => ảnh sẽ bị bóp méo• Làm sao? => Giữ nguyên kích thước xén

của chiều nhỏ hơn, tăng kích thước xén

của chiều lớn hơn, theo thỉ lệ ratio…• aspectRatio = (GLfloat)w / (GLfloat)h;• if (w <= h)

 – glOrtho (-100.0, 100.0, -100 / aspectRatio,100.0 / aspectRatio, 1.0, -1.0);

• else – glOrtho (-100.0 * aspectRatio, 100.0 *aspectRatio, -100.0, 100.0, 1.0, -1.0);

Page 18: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 18/21

Giữ nguyên ratio vật thể…

Page 19: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 19/21

Kỹ thuật hoạt hình

• Có rất nhiều cách làm hoạt hình trongOpenGL!

• Dùng cặp hàm định thời – void glutTimerFunc(…) và – void TimerFunction(…)

• Dùng hàm rỗi glutIdleFunc(…)• Không cần dùng hàm nào khác ngoàiglutDisplayFunc(…): – tính toán ngay bên trong, mỗi lần vẽ lại ta

có những giá trị mới

Page 20: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 20/21

Bộ đệm kép• Mục đích:• 1st: các hình phức tạp mất nhiều thời

gian để vẽ => Xảy ra hiện tượng giậtkhi hệ thống vẽ lại cửa sổ => Bộ đệmkép: Vẽ xong hết mới cập nhật mànhình

• 2nd: Khung hình được vẽ offscreen vàswap lên màn hình khi đã hoàn thành=> Hiệu ứng 24h/s!

• Code? – glutInitDisplayMode (GLUT_DOUBLE |GLUT_RGBA);

 – glutSwapBuffers ();

Page 21: Co Ban Lap Trinh OpenGL

8/14/2019 Co Ban Lap Trinh OpenGL

http://slidepdf.com/reader/full/co-ban-lap-trinh-opengl 21/21

HẾT!