co ban lap trinh opengl

Post on 30-May-2018

241 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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.

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

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…

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;• }

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 – …

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

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

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;

• }

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

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?...

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

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…

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…

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

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

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ể…

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

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

8/14/2019 Co Ban Lap Trinh OpenGL

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

HẾT!

top related