Giáo trình: Hướng dẫn lập trình OpenGL căn bản

33 277 1
Giáo trình: Hướng dẫn lập trình OpenGL căn bản

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Giới thiệu, nội dung môn học Môn học cung cấp cho sinh viên những kiến thức lý thuyết và kỹ năng thực hành để sinh viên có thể xây dựng được những chương trình đồ họa ứng dụng. Sinh viên thông qua sử dụng thư viện lập trình đồ họa OpenGL để tiếp cận dễ hơn, hiểu sâu hơn về các khái niệm, giải thuật đồ họa. Nội dung tóm tắt môn học: Khái quát về kiến trúc phần cứng, phần mềm của đồ họa. Giới thiệu về cấu trúc chương trình sử dụng thư viện lập trình đồ họa OpenGL. Ôn tập các kiến thức toán được sử dụng trong đồ họa như vector, ma trận Tìm hiểu các khâu trong đường ống đồ họa như biến đổi hình, chuyển đổi sang hệ trục tọa độ camera, phép chiếu, tô màu, dán texture. Các giải thuật rasterization để chuyển hình ảnh ra thiết bị hiển thị như Bresenham, Michener, Floodfill, Run of pixels, Scanline. Sử dụng thư viện lập trình OpenGL để xây dựng chương trình đồ họa đơn giản L.O.1.1 – Trình bày định nghĩa đồ họa máy tính, liệt kê được một số ứng dụng của đồ họa máy tính L.O.1.1 – Liệt kê đồng thời mô tả được chức năng của các thành phần của phần cứng hệ thống đồ họa máy tính L.O.1.2 – Mô tả được hoạt động của thiết bị hiển thị dạng raster L.O.1.3 – Mô tả được chức năng của bộ đệm frame L.O.1.4 – Trình bày khái niệm đường ống đồ họa, liệt kê và nêu chức năng của các thành phần trong đường ống đồ họa L.O.1.5 – Trình bày về các đối tượng cơ bản trong đồ họa máy tính L.O.1.5 – Hiểu và ứng dụng cửa sổ (window) và khung nhìn (viewport) trong đồ họa máy tính Các kiến thức toán trong đồ họa L.O.2.1 – Trình bày khái niệm về vector L.O.2.2 – Trình bày được định nghĩa và ứng dụng của phép toán tính vô hướng và tích có hướng trong đồ họa L.O.2.3 – Biết cách biểu diễn và vẽ đường cong dưới dạng tham số L.O.2.4 – Biết cách biểu diễn đồng nhất điểm và vector L.O.2.5 – Làm được các phép toán trên ma trận như nhân ma trận, chuyển vị ma trận, tính ma trận nghịch đảo, v.v. L.O.2.6 – Biết cách chuyển đổi biểu diễn điểm và vector trong các hệ tọa độ khác nhau Phép biến đổi hình L.O.3.1 – Trình bày được định nghĩa của phép biến đổi affine L.O.3.2 – Liệt kê được các phép biến đổi cơ bản cùng với ma trận tương ứng L.O.3.3 – Biết cách phân rã một phép biến đổi bất kỳ thành hợp của các phép biến đổi cơ bản, để từ đó tính ma trận của phép biến đổi L.O.3.4 – Biết cách đưa ma trận của phép biến đổi hình vào đường ống đồ họa bằng những cách khác nhau. L.O.3.5 – Trình bày khái niệm ngăn xếp ma trận, đồng thời biết cách sử dụng ngăn xếp ma trận Phép nhìn và phép chiếu L.O.4.1 – Trình bày định nghĩa các phép chiếu phẳng hay được sử dụng trong kỹ thuật L.O.4.2 – Tính được các vector đơn vị u, v, n của hệ trục tọa độ camera L.O.4.3 – Tính được ma trận V dùng để biến đổi tọa độ đối tượng từ hệ tọa độ thế giới thực sang hệ trục tọa độ camera L.O.4.4 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu trực giao thành thể tích nhìn chuẩn CCV L.O.4.5 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu phối cảnh thành thể tích nhìn chuẩn CCV L.O.4.6 – Tính được ma trận P dùng để biến đổi thể tích nhìn của phép chiếu xiên thành thể tích nhìn chuẩn CCV L.O.4.7 – Biết cách đưa ma trận P vào đường ống đồ họa bằng những cách khác nhau. Chiếu sáng và tô màu L.O.5.1 – Trình bày được các phương pháp vẽ hình với độ chân thật khác nhau như vẽ khung dây, tô màu phẳng, tô màu trơn, thêm bóng đổ, dán texture L.O.5.2 – Trình bày mô hình lý thuyết của việc chiếu sáng và tô màu L.O.5.3 – Tính được các thành phần màu sắc khác nhau như màu sắc khuếch tán, màu sắc phản chiếu, màu sắc môi trường L.O.5.4 – Biết cách nội suy màu sắc bằng phương pháp Gouraud L.O.5.5 – Biết cách nội suy pháp tuyến và màu sắc bằng phương pháp Phong L.O.5.6 – Biết cách tính được pháp tuyến tại điểm bất kỳ trên bề mặt đối tượng Cắt xén đối tượng với thể tích nhìn L.O.6.1 – Mã hóa được tọa độ đầu mút đoạn thẳng trong giải thuật Cohen Sutherland L.O.6.2 – Chạy từng bước giải thuật Cohen – Sutherland để cắt xén đoạn thẳng với thể tích nhìn L.O.6.3 – Trình bày được phương pháp cắt xén đa giác bất kỳ với thể tích nhìn Kết xuất các đối tượng đồ họa cơ bản ra thiết bị raster L.O.7.1 – Trình bày và chạy từng bước giải thuật Bresenham để vẽ đoạn thẳng ra thiết bị raster L.O.7.2 – Trình bày và chạy từng bước giải thuật Michener để vẽ đường tròn ra thiết bị raster L.O.7.3 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Floodfill L.O.7.4 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Run of Pixels L.O.7.5 – Trình bày và chạy từng bước giải thuật tô màu cho vùng tô bằng phương pháp Scanline Dán texture lên bề mặt đối tượng L.O.8.1 – Liệt kê được các loại bộ đệm được sử dụng trong đồ họa máy tính L.O.8.2 – Liệt kê được thao tác Bitwise được áp dụng để thao tác trực tiếp lên bộ đệm màu sắc L.O.8.3 – Trình bày được khái niệm và ứng dụng của bit map và pixel map L.O.8.4 – Trình bày được các phương pháp ánh xạ texture lên bề mặt đối tượng L.O.8.5 – Tính được tọa độ texture L.O.8.6 – Trình bày được trình tự các bước để dán texture lên bề mặt đối tượng Sử dụng thư viện lập trình đồ họa OpenGL L.O.9.1 – Hiểu được cấu trúc của chương trình sử dụng thư viện lập trình đồ họa OpenGL L.O.9.2 – Biết sử dụng hàm và tham số thích hợp để vẽ các đối tượng đồ họa cơ bản, đồng thời biết các phân rã đối tượng phức tạp thành các đối tượng đồ họa cơ bản L.O.9.6 – Biết sử dụng hàm và tham số thích hợp để lập trình đồ họa tương tác L.O.9.3 – Biết sử dụng hàm và tham số thích hợp để thực hiện phép biến đổi hình L.O.9.4 – Biết sử dụng hàm và tham số thích hợp để thiết lập camera L.O.9.5 – Biết sử dụng hàm và tham số thích hợp để chiếu sáng và tô màu cho đối tượng L.O.9.6 – Biết sử dụng hàm và tham số thích hợp để dán texture lên bề mặt đối tượng Kết quả cần đạt được Kiến thức: L.O.1 – Giải thích được các khái niệm cơ bản về hệ thống đồ họa máy tính. L.O.2 – Các kiến thức toán trong đồ họa. L.O.3– Phép biến đổi hình. L.O.4 – Phép nhìn và phép chiếu. L.O.5 – Chiếu sáng và tô màu. L.O.6 – Cắt xén đối tượng với thể tích nhìn. L.O.7 – Kết xuất các đối tượng đồ họa cơ bản ra thiết bị raster. L.O.8 – Dán texture lên bề mặt đối tượng. Kỹ năng: L.O.9 – Sử dụng thư viện lập trình đồ họa OpenGL.

Hướng dẫn lập trình OpenGL Hướng dẫn lập trình OpenGL Tác giả: Lê Phong Tài liệu viết với mục đích hướng dẫn lập trình OpenGL mức Người đọc phải nắm số kiến thức thiết yếu đồ họa 3D Tài liệu viết dựa vào chương 1, 2, 3, 13 OpenGL redbook http://glprogramming.com/red có lược bỏ kiến thức chưa cần thiết tổ lại, diễn giải lại ý cho rõ ràng Người đọc đề nghị tham khảo trực tiếp sách Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Chương 1: Giới thiệu OpenGL OpenGL OpenGL thư viện đồ họa có khoảng 150 hàm giúp xây dựng đối tượng giao tác cần thiết ứng dụng tương tác 3D Những thứ OpenGL không hỗ trợ   thân OpenGL khơng có sẵn hàm nhập xuất hay thao tác window, OpenGL khơng có sẵn hàm cấp cao để xây dựng mô hình đối tượng, thay vào đó, người dùng phải tự xây dựng từ thành phần hình học ( điểm, đoạn thẳng, đa giác) Rất may số thư viện cung cấp sẵn số hàm cấp cao xây dựng nên từ OpenGL GLUT (OpenGL Utility Toolkit) số sử dụng rộng rãi Trong tài liệu này, sử dụng chủ yếu OpenGL GLUT Những thứ OpenGL hỗ trợ hàm đồ họa     xây dựng đối tượng phức tạp từ thành phần hình học (điểm, đoạn, đa giác, ảnh, bitmap), xếp đối tượng 3D chọn điểm thuận lợi để quan sát, tính tốn màu sắc đối tượng (màu sắc đối tượng quy định điều kiện chiếu sáng, texture đối tượng, mơ hình xây dựng kết hợp yếu tố đó), biến đổi mơ tả tốn học đối tượng thơng tin màu sắc thành pixel hình (quá trình gọi resterization) Cấu trúc lệnh OpenGL OpenGL sử dụng tiền tố gl từ viết hoa chữ đầu để tạo nên tên lệnh, ví dụ glClearColor() Tương tự, OpenGL đặt tên số bắt đầu GL_ từ tiếp sau viết hoa cách dấu ‘_’, ví dụ: GL_COLOR_BUFFER_BIT Bên cạnh đó, với số lệnh, để ám số lượng kiểu tham số truyền, số hậu tố sử dụng bảng sau Hậu tố Kiểu liệu Tương ứng với kiểu C Tương ứng với kiểu OpenGL Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình 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 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 điểm (x,y) với x, y nguyên (integer) Lưu ý: OpenGL có định nghĩa số kiểu biến, việc sử dụng định nghĩa thay định nghĩa có sẵn C tránh gây lỗi biên dịch code hệ thống khác Một vài lệnh OpenGL kết thúc v ám tham số truyền vào vector Ví dụ: glColor3fv(color_array) color_array mảng chiều có phần tử float OpenGL Utility Toolkit (GLUT) Để khắc phục số nhược điểm OpenGL, GLUT tạo 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ẽ số đối tượng 3D phức tạp (mặt cầu, khối hộp,…) Tên hàm GLUT có tiền tố glut Để hiểu rõ GLUT, người đọc tham khảo http://glprogramming.com/red/appendixd.html Một số ví dụ đơn giản Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Để khai báo sử dụng OpenGL GLUT, download http://www.opengl.org/resources/libraries/glut/glut_downloads.php#windows chép file sau vào thư mục project    glut.h glut32.dll glut32.lib 4.1 Ví dụ Chúng ta vẽ hình chữ nhật màu trắng đen #include "glut.h" /* hàm thực thao tác vẽ theo yêu cầu chương trình void display(void) { /* xóa pixel */ glClear (GL_COLOR_BUFFER_BIT); */ /* vẽ hình chữ nhật có điểm trái-trên phải-dưới * (0.25, 0.25, 0.0) and (0.75, 0.75, 0.0) */ glColor3f (1.0, 1.0, 1.0); /* thiết lập màu vẽ: màu trắng */ glBegin(GL_POLYGON); /* bắt đầu vẽ đa giác */ glVertex3f (0.25, 0.25, 0.0); /* xác định đỉnh đ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 */ */ /* * thực trình đẩy buffer */ glFlush (); } /* hàm thực khởi tạo */ void init (void) { /* chọn màu để xóa (tức phủ màu này) glClearColor (0.0, 0.0, 0.0, 0.0); /* màu đen */ /* */ thiết lập 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 chương trình */ Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* khởi tạo chế độ vẽ single buffer hệ màu RGB */ glutInitWindowSize (250, 250); /* khởi tạo window kích thước 250 x 250 */ glutInitWindowPosition (100, 100); /* khởi tạo window ví trí (100,100) screen */ glutCreateWindow ("rectangle"); /* tên window ‘rectangle’ */ init (); /* khởi tạo số chế độ đồ họa */ glutDisplayFunc(display); /* thiết lập hàm vẽ hàm display() */ glutMainLoop(); /* bắt đầu chu trình lặp thể vẽ */ return 0; } Kết chạy chương trình 4.2 Ví dụ Chúng ta vẽ hình chữ nhật tương tự ví dụ 1, nữa, hình chữ nhật quay quanh tâm Để tránh trường hợp hình bị ‘giựt’ chuyển động, không dùng single buffer ví dụ1 mà dùng double buffer Ý tưởng double buffer   buffer dùng để trình diễn frame t screen chương trình dùng buffer để chuẩn bị cho frame t+1, đến lượt trình diễn frame t+1 chương trình cần thể buffer đưa buffer đằng sau để chuẩn bị cho frame t+2 Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Do mà thời gian chuyển tiếp frame liên tiếp nhỏ mắt người không phát được, dẫn đến việc trình diễn frame liên tiếp mượt #include "glut.h" static GLfloat spin = 0.0; /* góc quay hình chữ nhật */ void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); /* xoay góc spin quanh trục z */ glColor3f(1.0, 1.0, 1.0); /* thiết lập màu vẽ cho hcn (màu trắng) */ glRectf(-25.0, -25.0, 25.0, 25.0); /* vẽ hcn */ glPopMatrix(); glutSwapBuffers(); /* thực việc hoán đổi buffer */ } void spinDisplay(void) { spin = spin + 2.0; /* xoay thêm deg cho lần lặp */ if (spin > 360.0) spin = spin - 360.0; glutPostRedisplay(); /* thông báo cho chương trình rằng: cần phải thực việc vẽ lại */ } /* thao tác cần làm cửa sổ bị thay đổi kích thước */ void reshape(int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); /* thay đổi viewport */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /* thao tác xử lý chuột */ void mouse(int button, int state, int x, int y) { switch (button) { case GLUT_LEFT_BUTTON: /* nhấn chuột trái */ if (state == GLUT_DOWN) glutIdleFunc(spinDisplay); /* chương trình trạng thái idle (khơng phải xử lý cả) thực hàm spinDisplay */ break; case GLUT_MIDDLE_BUTTON: /* nhấn nút */ if (state == GLUT_DOWN) glutIdleFunc(NULL); Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL break; default: break; } } /* hàm main chương trình */ int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /* khai báo việc sử dụng chế độ double buffer */ glutInitWindowSize (250, 250); glutInitWindowPosition (100, 100); glutCreateWindow ("spinning rectangle"); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); /* đăng ký hàm reshape cho kiện cửa sổ bị thay đổi kích thước */ glutMouseFunc(mouse); /* đăng ký hàm mouse cho kiện chuột */ glutMainLoop(); return 0; } Chương trình chạy sau click chuột trái vào hình chữ nhật Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Chương 2: Vẽ đối tượng hình học Một số thao tác 1.1 Xóa hình Trong OpenGL có loại buffer phổ biến   color buffer: buffer chứa màu pixel cần thể depth buffer (hay gọi z-buffer): buffer chứa chiều sâu pixel, đo khoảng cách đến mắt Mục đích buffer loại bỏ phần đối tượng nằm sau đối tượng khác Mỗi lần vẽ, nên xóa buffer glClearColor(0.0, 0.0, 0.0, 0.0); /* xác định màu để xóa color buffer (màu đen) */ glClearDepth(1.0); /* xác định giá trị để xóa depth buffer */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* xóa color buffer depth buffer */ 1.2 Xác định màu Khi vẽ đối tượng, OpenGL tự động sử dụng màu xác định trước Do đó, để vẽ đối tượng với màu sắc theo ý mình, cần phải thiết lập lại màu vẽ Thiết lập màu vẽ dùng hàm glColor3f(), ví dụ glColor3f(0.0, glColor3f(1.0, glColor3f(0.0, glColor3f(1.0, glColor3f(0.0, glColor3f(1.0, glColor3f(0.0, glColor3f(1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0); 0.0); 0.0); 0.0); 1.0); 1.0); 1.0); 1.0); // // // // // // // // black red green yellow blue magenta cyan white Vẽ đối tượng hình học OpenGL khơng có sẵn hàm để xây dựng đối tượng hình học phức tạp, người dùng phải tự xây dựng chúng từ đối tượng hình học mà OpenGL hỗ trợ: điểm, đoạn thẳng, đa giác Khai báo điểm, dùng hàm glVertexXY với X số chiều (2, 3, 4), Y kiểu liệu (như nói chương 1) Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Việc xây dựng đối tượng hình học khác thực sau glBegin(mode); /* xác định tọa độ màu sắc điểm hình */ glEnd(); mode giá trị sau Giá trị Ý nghĩa GL_POINTS individual points GL_LINES pairs of vertices interpreted as individual line segments GL_LINE_STRIP series of connected line segments GL_LINE_LOOP same as above, with a segment added between last and first vertices GL_TRIANGLES triples of vertices interpreted as triangles GL_TRIANGLE_STRIP linked strip of triangles GL_TRIANGLE_FAN linked fan of triangles GL_QUADS quadruples of vertices interpreted as four-sided polygons GL_QUAD_STRIP linked strip of quadrilaterals GL_POLYGON boundary of a simple, convex polygon Hình sau minh họa cho loại mode Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Ví dụ: vẽ hình chữ nhật màu trắng glColor3f (1.0, 1.0, 1.0); /* thiết lập màu vẽ: màu trắng */ glBegin(GL_POLYGON); /* bắt đầu vẽ đa giác */ glVertex3f (0.25, 0.25, 0.0); /* xác định đỉnh đ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 */ */ Màu sắc chưa đủ, số tính chất điểm đoạn cần quan tâm thiết lập qua hàm    kích thước điểm: void glPointSize(GLfloat size) độ rộng đoạn thẳng: void glLineWidth(GLfloat width) kiểu vẽ glEnable(GL_LINE_STIPPLE); // enable kiểu vẽ glLineStipple(factor, pattern); // pattern cho bảng sau, factor thường /* thực thao tác vẽ */ glDisable (GL_LINE_STIPPLE); // disable kiểu vẽ Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 10 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Chúng ta xét ví dụ xây dựng mơ hình Trái Đất quay xung quanh Mặt Trời #include "glut.h" static int year = 0, day = 0; // thông số thời gian năm thời gian ngày để xác định vị trí trái đất quỹ đạo xác định góc quay quanh tâm /* Khởi tạo */ void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glEnable(GL_DEPTH_TEST); // bật chức cho phép loại bỏ phần đối tượng bị che đối tượng khác glShadeModel (GL_FLAT); } /* hàm vẽ */ void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // xóa color buffer depth buffer glPushMatrix(); // lưu lại ma trận hành glColor3f (1.0, 0, 0); // thiết lập màu vẽ màu đỏ glutWireSphere(1.0, 20, 16); // vẽ mặt trời lưới cầu có tâm gốc tọa độ /* di chuyển đến vị trí để vẽ trái đất */ glRotatef ((GLfloat) year, 0.0, 1.0, 0.0); // quay góc tương ứng với thời gian năm glTranslatef (2.0, 0.0, 0.0); // tịnh tiến đến vị trí trái đất quỹ đạo quanh mặt trời glRotatef ((GLfloat) day, 0.0, 1.0, 0.0); // quay trái đất tương ứng với thời gian ngày glColor3f (0, 0, 1.0); // thiết lập màu vẽ màu blue glutWireSphere(0.2, 10, 8); // vẽ trái đất glPopMatrix(); // phục hồi lại ma trận hành cũ: tương ứng với quay lại vị trí ban đầu glutSwapBuffers(); } /* xử lý cửa sổ bị thay đổi */ void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); // thay đổi kích thước viewport /* xét thao tác chiếu */ glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); // thực phép chiếu phối cảnh /* xét thao tác ModelView */ glMatrixMode(GL_MODELVIEW); Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 19 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); // thiết lập view } /* xử lý kiện keyboard */ void keyboard (unsigned char key, int x, int y) { switch (key) { case 'd': day = (day + 10) % 360; glutPostRedisplay(); break; case 'D': day = (day - 10) % 360; glutPostRedisplay(); break; case 'y': year = (year + 5) % 360; glutPostRedisplay(); break; case 'Y': year = (year - 5) % 360; glutPostRedisplay(); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; } Kết chạy chương trình Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 20 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 21 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Chương 4: Tô màu Chế độ màu RGBA OpenGL hỗ trợ chế độ màu: RGBA Color-Index Ở tài liệu này, quan tâm đến RGBA Trong chế độ màu RGBA, RGB thể màu Red, Green, Blue Cịn thành phần A (tức alpha) khơng thực ảnh hưởng trực tiếp lên màu pixel, người ta dùng thành phần A để xác định độ suốt hay thơng số cần quan tâm Ở đây, không bàn đến thành phần A Để thiết lập màu vẽ hành chế độ RGBA, sử dụng hàm sau void void void void glColor3{b glColor4{b glColor3{b glColor4{b s s s s i i i i f f f f d d d d ub ub ub ub us us us us ui} (TYPEr, ui} (TYPEr, ui}v (const ui}v (const TYPEg, TYPEb); TYPEg, TYPEb, TYPEa); TYPE*v); TYPE*v); đó, tham số số thực thành phần màu tương ứng nằm đoạn [0,1], ngược lại chuyển đổi bảng sau Suffix Data Type Minimum Value Min Value Maps to Maximum Value Max Value Maps to b 1-byte integer -128 -1.0 127 1.0 s 2-byte integer -32,768 -1.0 32,767 1.0 i 4-byte integer -2,147,483,648 -1.0 2,147,483,647 1.0 ub unsigned 1-byte integer 0.0 255 1.0 Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 22 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL us unsigned 2-byte integer 0.0 65,535 1.0 ui unsigned 4-byte integer 0.0 4,294,967,295 1.0 Thiết lập mơ hình shading Một đoạn thẳng tơ màu đồng (chế độ flat) hay nhiều màu sắc khác (chế độ smooth) Để thiết lập chế độ shading phù hợp, sử dụng hàm void glShadeModel (GLenum mode); mode chế độ mong muốn, nhận giá trị GL_SMOOTH GL_FLAT 2.1 Chế độ smooth Thơng qua ví dụ sau hiểu chế độ smooth có tác động #include "glut.h" void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_SMOOTH); // thiết lập chế độ shading smooth } void triangle(void) { glBegin (GL_TRIANGLES); // vẽ tam giác glColor3f (1.0, 0.0, 0.0); // đỉnh thứ màu red glVertex2f (5.0, 5.0); glColor3f (0.0, 1.0, 0.0); // đỉnh thứ màu green glVertex2f (25.0, 5.0); glColor3f (0.0, 0.0, 1.0); // đỉnh thứ màu blue glVertex2f (5.0, 25.0); glEnd(); } void display(void) { glClear (GL_COLOR_BUFFER_BIT); triangle (); glFlush (); } void reshape (int w, int h) Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 23 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w z_min ) // chọn đối tượng gần mắt { min_z_min = z_min; ichosen = name; } } ptr = (GLuint*) buffer; } #define BUFSIZE 512 // hàm xử lý thông điệp mouse void pick(int button, int state, int x, int y) { GLuint selectBuf[BUFSIZE]; GLint hits; GLint viewport[4]; /* xử lý người dùng click chuột trái */ if (button != GLUT_LEFT_BUTTON || state != GLUT_DOWN) return; glGetIntegerv (GL_VIEWPORT, viewport); glSelectBuffer (BUFSIZE, selectBuf); // khởi tạo hit records (void) glRenderMode (GL_SELECT); // chọn chế độ selection glInitNames(); // khởi tạo stack tên glPushName(0); // đặt tên cho đối tượng rỗng /* thiết lập vùng chọn */ glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); gluPickMatrix ((GLdouble) x, (GLdouble) (viewport[3]- y), 5.0, 5.0, viewport); // vùng quan tâm vùng quanh mouse 5x5 pixel gluPerspective(60.0, viewport[2]/viewport[3], 1.0, 20.0); draw(GL_SELECT); // vẽ chế độ selection glMatrixMode (GL_PROJECTION); glPopMatrix (); glFlush (); hits = glRenderMode (GL_RENDER); // hits số hit vùng chọn processHits (hits, selectBuf); // xử lý hit records glutPostRedisplay(); // bắt vẽ lại } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 31 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); } void keyboard (unsigned char key, int x, int y) { switch (key) { case 'd': day = (day + 10) % 360; glutPostRedisplay(); break; case 'D': day = (day - 10) % 360; glutPostRedisplay(); break; case 'y': year = (year + 5) % 360; glutPostRedisplay(); break; case 'Y': year = (year - 5) % 360; glutPostRedisplay(); break; default: break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMouseFunc(pick); // thiết lập hàm pick xử lý thông điệp mouse glutMainLoop(); return 0; } Kết click vào mặt trời Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 32 https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL Đặng Nguyễn Đức Tiến – Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page 33 https://fb.com/tailieudientucntt ... Value Max Value Maps to b 1-byte integer -1 28 -1 .0 127 1.0 s 2-byte integer -3 2,768 -1 .0 32,767 1.0 i 4-byte integer -2 ,147,483,648 -1 .0 2,147,483,647 1.0 ub unsigned 1-byte integer 0.0 255 1.0... 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... Vũ Quốc Hoàng - Lê Phong CuuDuongThanCong.com Page https://fb.com/tailieudientucntt Hướng dẫn lập trình OpenGL B 8-bit integer signed char Glbyte S 16-bit integer Short Glshort I 32-bit integer

Ngày đăng: 26/08/2020, 09:42

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan