Co Ban Lap Trinh Opengl

  • Uploaded by: hoasua1325
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Co Ban Lap Trinh Opengl as PDF for free.

More details

  • Words: 927
  • Pages: 21
Cơ bản lập trình OpenGL Võ Đình Phong – Lê Ngọc Thành

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

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.

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: • Ví dụ glColor3f() – – – –

Lệnh gốc: Color Thư viện: gl Số lượng tham số: 3 Kiểu tham số: float

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…

Chương trình GLUT đơn giản • • •

• • • • • •



#include // 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; }

Phân tích chương trình… • #include – Đã 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 …

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

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 khi chương trình kết thúc. • Tương tự hàm WinMain() của Win32 Application

• •

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)){ – – –



• •

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

} else{ – –



if(msg.message==WM_QUIT){ » done = true; } else{

Render(); window.Swap();

}

– } – – –



}

  window.Terminate(); return msg.wParam;

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

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ước nhỏ sẽ nhỏ, nhưng vẽ trên cửa sổ lớn thì 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?...

Khái niệm Viewport… • Nguyên nhân – Hiếm khi WxH của vùng xén ảnh lại khớp hoàn toàn với WxH của vùng cửa sổ (Vùng xé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 HQC pixel 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ên màn hình

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

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

Viewport trong OpenGL • void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far );

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

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

Kỹ thuật hoạt hình • Có rất nhiều cách làm hoạt hình trong OpenGL! • 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ài glutDisplayFunc(…): – tính toán ngay bên trong, mỗi lần vẽ lại ta có những giá trị mới

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ật khi hệ thống vẽ lại cửa sổ => Bộ đệm kép: Vẽ xong hết mới cập nhật màn hì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 ();

HẾT!

Related Documents


More Documents from ""