Lý do chọn đề tài:Ngày nay đồ họa máy tính đóng một vai trò quan trọng, quyết định không nhỏ đến sự thành công hay thất bại của một sản phẩm phần mềm, đặc biệt là một sản phẩm game. Sản phẩm làm ra ngoài tính năng đáp ứng được nhu cầu sử dụng thì mẫu giao diện phải đẹp, bắt mắt, thân thiện với người sử dụng, có như thế sản phẩm mới có thể thành côngNhận thấy tiềm năng phát triển mạnh mẽ của công nghiệp đồ họa, nên em lựa chọn đề tài: NGHIÊN CỨU TÌM HIỂU THƯ VIỆN ĐỒ HỌA OPENGL VÀ ỨNG DỤNG.Tuy nhiên do thời gian còn hạn chế, em chưa tìm hiểu sâu được nên báo cáo còn nhiều thiếu sót, mong thầy cô chỉ bảo.Và em xin cảm ơn thầy Ngô Đức Vĩnh đã hướng dẫn và định hướng cho em trong suốt quá trình thực hiện đề tài này.
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO THỰC TẬP TÊN ĐỀ TÀI: NGHIÊN CỨU TÌM HIỂU THƯ VIỆN OPENGL VÀ ỨNG DỤNG Giảng viên hướng dẫn: Th.S NGÔ ĐỨC VĨNH Sinh viên thực hiện: Họ tên: Nguyễn Văn Phú MSV: 0741260044 Lớp: Hệ thống thông tin – K7 Hà Nội ngày 05 tháng 01 năm 2016 MỤC LỤC CHƯƠNG 1.TÌM HIỂU THƯ VIỆN ĐỒ HỌA OPENGL .6 Lịch sử phát triển Khái niệm Thành phần Chương 2: CẤU TRÚC VÀ CÁCH SỬ DỤNG CÂU LỆNH 1.Cúpháp câu lệnh OpenGL 2.Các trạng thái OpenGL 10 3.Xét chương trình OpenGL đơn giản 11 3.1.Đặt màunền 12 3.2.Xóa đệm màu 13 3.3.Đặt màu vẽ hành 13 4.Cách sử dụng số câu lệnh 15 4.1.GL_POINTS(vẽ điểm) .15 4.2.GL_LINES(vẽ đường) .18 20 4.3.GL_LINE_STIPPLE (Vẽ đường chấm) 20 22 4.4.GL_LINE_STRIP (Vẽ dải đường) 22 23 4.5.GL_LINE_LOOP (Vẽ đường khép kín) 23 4.6.GL_POLYGON (vẽ đa giác) 25 27 28 4.7.Kết hợp GL_POLYGON Vẽ đa giác lồi 28 29 29 4.8.GL_TRIANGLES (vẽ tam giác) .30 4.9.GL_TRIANGLE_STRIP (vẽ dải tam giác) 31 4.10.GL_QUADS (vẽ tứ giác) 32 4.11.GL_QUAD_STRIP (vẽ dải tứ giác) 34 5.Phép chiếu 35 6.Các phép biến hình đối tượng 38 6.1.Phép tịnh tiến 38 Đoạn mã sau thực việc tịnh tiến khối vuông theo trục Z, để đặt vào không gian quan sát 38 Dòng thứ báo cho OpenGL biết kiểu stack ma trận cần thao tác modelview Dòng thứ hai khởi tạo ma trận modelview với ma trận đơn vị Dòng thứ tịnh tiến khối vuông 3.5 đơn vị theo chiều âm trục Z Hàm glTranslatef() tạo ma trận tịnh tiến, nhân ma trận với ma trận chọn hành Ba đối số giá trị Glfloat cho biết lượng tịnh tiến trục X,Y Z Một phiên khác hàm glTranslated(), có đối số kiểu Gldouble 39 Đoạn mã sau thể hình 2.19 .39 glTranslatef(0.75f,0.75f,-5.0f); 41 41 Hình 2.20: Tịnh tiến khối vuông theo trục 41 6.2.Phép co giãn .41 Hàm Scalef() tạo ma trận co giãn, nhân với ma trận chọn hành Ba đối số hàm giá trị Glfloat xác định hệ số co giãn theo trục X,Y Z Một phiên khác hàm glScaled() có đối số kiểu Gldouble 42 Đoạn mã sau thể hình 2.21, glutWireCube(1) hàm định nghĩa vertex hình khối: 42 Hình 2.21: khối vuông giãn hai lần theo trục X 43 6.3.Phép quay 43 Chương 3: Mô Hình Chiếu Sáng Trong OpenGL 45 1.Các loại nguồn sáng 45 2.Định nghĩa nguồn sáng 46 2.1.Thiết lập mảng giá trị ánh sáng 46 2.2.Chuyển mảng cho OpenGL 47 2.3.Kích hoạt nguồn sáng .48 3.Tính chất vật liệu .48 3.1.Màu ánh sáng .48 3.2.Thiết lập mảng giá trị vật liệu 49 3.3.Chuyển mảng vật liệu cho OpenGL 49 4.Xác định kiểu bóng kích hoạt kiểm tra chiều sâu 51 5.Đèn chiếu 53 6.Đối tượng 3D chiếu sáng 54 6.1.Nguồn sáng môi trường 54 6.2.Nguồn sáng khuếch tán .56 6.3.Nguồn sáng phản chiếu 57 6.4.Ánh sáng tổng hợp .58 7.Kiểm soát vị trí hướng nguồn sáng 59 Chương 4:CHƯƠNG TRÌNH MÔ PHỎNG KHÔNG GIAN 3D 64 64 Tài liệu tham khảo: 67 Lý chọn đề tài: Ngày đồ họa máy tính đóng vai trò quan trọng, định không nhỏ đến thành công hay thất bại sản phẩm phần mềm, đặc biệt sản phẩm game Sản phẩm làm tính đáp ứng nhu cầu sử dụng mẫu giao diện phải đẹp, bắt mắt, thân thiện với người sử dụng, có sản phẩm thành công Nhận thấy tiềm phát triển mạnh mẽ công nghiệp đồ họa, nên em lựa chọn đề tài: NGHIÊN CỨU TÌM HIỂU THƯ VIỆN ĐỒ HỌA OPENGL VÀ ỨNG DỤNG Tuy nhiên thời gian hạn chế, em chưa tìm hiểu sâu nên báo cáo nhiều thiếu sót, mong thầy cô bảo Và em xin cảm ơn thầy Ngô Đức Vĩnh hướng dẫn định hướng cho em suốt trình thực đề tài CHƯƠNG 1.TÌM HIỂU THƯ VIỆN ĐỒ HỌA OPENGL Lịch sử phát triển Nguyên thủy, GL Silicon Graphics Incorporated (SGI) thiết kế để dùng cho trạm làm việc (workstation) đồ họa IRIS họ IRIS GL với cấu hình phần cứng khác có vấn đề phát sinh OpenGL kết nỗ lực SGI nhằm cải thiện tính tương thích IRIS GL Ngôn ngữ có khả GL, đồng thời “mở” nghĩa dễ dàng tương thích với loại cấu hình phần cứng, hệ điều hành khác Version 1.0 OpenGL giới thiệu vào ngày 01/07/1992 Để đảm bảo tính “mở”, nâng cấp OpenGL phải thông qua Ủy Ban Xem Xét Kiến Trúc OpenGL(OpenGL Architecture Review Board AEB) gồm thành viên sáng lập SGI, Digittal Equipment Corporation, IBM, Intel Microsoft ARB họp năm hai lần.( Các công ty khác tham gia thảo luận quyền bỏ phiếu) OpenGL version 1.1 ARB thông qua vào tháng 12/1995 Khái niệm OpenGl định nghĩa “giao diện phần mềm cho phần cứng đồ họa” Thực chất, OpenGl thư viện hàm đồ họa, xem tiêu chuẩn thiết kế công nghiệp cho đồ họa ba chiều Với giao diện lập trình mạnh mẽ, OpenGL cho phép tạo ứng dụng 3D phức tạp với độ tinh vi, xác cao, mà người thiết kế đánh vật với nút công thức toán học mã nguồn phức tạp Và OpenGl tiêu chuẩn công nghiệp, ứng dụng tạo từ dung phần cứng hệ điều hành khác Cách làm việc OpenGL: OpenGL ngôn ngữ đồ họa theo thủ tục ngôn ngữ mô tả Thay tả cảnh cách chúng xuất hiện, OpenGL đưa bước cần thiết để có thể hay hiệu định.Các “bước” lời gọi đến giao diện lập trình ứng dụng gồm xấp xỉ 120 lệnh hàm.Chúng dùng để vẽ phần tử đồ họa điểm, đường, đa giác không gian ba chiều Ngoài ra, OpenGL hỗ trợ chiếu sáng, tô bóng, gán cấu trúc, tạo ảo giác chuyển động hiệu đặc biệt khác OpenGL chức quản lý cửa sổ, tương tác với người dùng hay xuất nhập file Môi trường chủ ( tức hệ điều hành) có chức chịu trách nhiệm thực biện pháp quản lý cho OpenGL Mô hình hoạt động: Hình 1.1: Cơ chết hoạt động OpenGL OpenGL có chết hoạt động kiểu ống dẫn tức đầu giai đoạn trước đầu vào giai đoạn sau Từ sơ đồ thành phần chế giải thích sau: − Display List: Là nơi lưu lại số lệnh để xử lý sau − Evaluator: Xấp xỉ đường cong mặt phẳng hình học cách đánh giá đa thức liệu đưa vào − Per-vertex operations and primitive assembly: Xử lý primitive (điểm, đoạn, đa giác) mô tả vertex Các vertex xử lý primitive cắt xén vào viewport để chuẩn bị cho khâu − Rasterization: sinh loạt địa framebuffer giá trị liên quan cách sử dụng mô tả chiều điểm, đoạn, đa giác Mỗi phần tử (fragment) sinh đưa vào giai đoạn − Per-fragment operations: Các tác vụ sau (cập nhật có điều kiện cho framebuffer dựa vào liệu vào liệu lưu trữ trước giá trị z (đối với z buffering), thực trộn màu cho pixel làm số thao tác khác) thực liệu trước chuyển thành pixel đưa vào framebuffer − Trong trường hợp liệu vào dạng pixel vertex, đưa thẳng vào giai đoạn xử lý pixel Sau giai đoạn này, liệu dạng pixel lưu vào texture memory để đưa vào giai đoạn Per-fragment operation đưa vào Rasterization liệu dạng Vertex (tức điểm) Thành phần Bộ hạt nhân có 115 hàm Tên hàm bắt đầu GL Windows NT hỗ trợ chủng loại hàm khác, bao gồm thư viện OpenGL utility (tên hàm bắt đầu GLU), thư viện OpenGL (tên hàm bắt đầu AUX), hàm “WGL” (tên hàm bắt đầu WGL), hàm WIN32 API (tên hàm tiền tố đặc biệt) Bộ hàm hạt nhân cho phép thiết kế hình dạng khác nhau, tạo hiệu chiếu sáng, kết hợp antialiasing gán cấu trúc, thực biến đổi ma trận Do hàm thể nhiều dạng khác tùy thuộc vào loại liệu chúng tiếp nhận, nên thực tế có 300 nguyên mẫu (prototype) hàm Thư viện OpenGL utility gồm hàm cao cấp Các hàm đơn giản hóa việc sử dụng hình ảnh cấu trúc, thực việc biến đổi tọa độ mức cao, hỗ trợ tesselation đa giác, biểu diễn đối tượng có sở đa giác hình cầu, hình trụ, hình đĩa Thư viện OpenGL auxiliary gồm hàm đặc biệt dùng đơn giản hóa ví dụ lập trình sách dẫn lập trình OpenGL Các hàm phụ thuộc platform thực nhiệm vụ quản lý cửa sổ, điều khiển xuất/nhập, vẽ đối tượng 3D định Do hàm có mục đích thiết minh nên không dùng mã sản xuất Các hàm “WGL” kết nối OpenGL với Windows NT, Cho phép người lập trình xây dựng chọn lựa ngữ cảnh biểu diễn, tạo bitmap font, hàm dùng Windows NT Cuối cùng, hàm Win32 API dùng giải định dạng điểm ảnh tạo đệm đôi Chương 2: CẤU TRÚC VÀ CÁCH SỬ DỤNG CÂU LỆNH 1.Cúpháp câu lệnh OpenGL Quy ước đặt tên hàm OpenGL: Các bảng 2.1, 2.2 tổng kết tiền tố, hậu tố ý nghĩa chúng Do thể nhiều dạng khác nhau, với hậu tố khác nhau, tùy thuộc vào số lượng loại thông số mà chúng tiếp nhận, nên thực tế số lệnh mẫu (prototype số lệnh bản) Như bao gồm hạt nhân OpenGL có 300 nguyên mẫu, gồm 115 hàm Ví dụ: lệnh glVertex2f() có hậu tố 2f, cho biết lệnh có đối số dấu chấm động glVertex có đến 24 dạng: glVertex2d() glVertex4f() glVertex2f() glVertex3d() glVertex3f() glVertex4d() glVertex2i() glVertex4s() glVertex2s() glVertex3i() glVertex3s() glVertex4i() glVertex2dv() glVertex2fv() glVertex3dv() glVertex3fv() glVertex4dv() glVertex4fv() glVertex2iv() glVertex2sv() glVertex3iv() glVertex3sv() glVertex4iv()glVertex4sv() Có 12 lệnh sau kết thúc chữ v, cho biết đối số cho dạng vertor Thư viện Bộ hạt nhân Utility Auxiliary WGL Win32 API Tiền tố Glu Aux Wgl Không có tiền tố đặc biệt Gl Bảng 2.1: Các tiền tố lệnh OpenGL 2.Các trạng thái OpenGL Môi trường OpenGL thiết lập chương trình trì trạng thái riêng biệt Ví dụ, thiết lập màu vẽ với lời gọi glColor(), màu có tác dụng glColor() gọi lần để thay đổi Tư tưởng quen thuộc lập trình Windows ngữ cảnh dụng cụ làm việc tương tự.Khi lựa chọn bút vẽ, đường thẳng có bề rộng màu bút vẽ chọn.Tác dụng bút vẽ trì thay Hậu tố Kiểu liệu đối số B Glbyte B GLdouble hay Glclampd F GLfloat hay Glclampf I GLint hay Glsizei S Glshort Ub GLubyte hay Glboonlean Ui GLubyte hay Glboonlean Us Glushort Bv GLbyte dạng vector Dv GLdouble hay GLclampd dạng vector Fv Glfloat hay GLclampf dạng vector Iv Glint hay GLsizei dạng vector Sv GLshort dạng vector Ubv GLubyte hay GLboolean dạng vector Uiv GLuint, GLenum hay GLbitfield dạng vector Usv GLushort dạng vector Các thuộc tính khác trạng thái OpenGL chứa biến trạng thái.Để dễ dàng có tác dụng cách nhanh chóng, biến trạng thái có giá trị mặc định.Các giá trị tồn hàm tương ứng gọi để 10 5.Đèn chiếu Đèn chiếu cho chùm tia tập trung hẹp Cũng nguồn sáng OpenGL khác, với việc định nghĩa đèn chiếu, ta đồng thời phải tạo cho nguồn sáng theo vị trí (W lời gọi positionLight(), xác định góc cắt cho chùm tia, định nghĩa vị trí hướng nguồn Đoạn mã sau định nghĩa đèn chiếu GLfloatambienLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatdiffuseLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatspecularLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatpositionLight0[]={0.0f,0.0f,1.0f,1.0f}; GLfloatdirectionLight0[]={0.0f,0.0f,-1.0f}; glLightfv(GL_LIGHT0,GL_AMBIENT,ambienLight0); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight0); glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight0); glLightfv(GL_LIGHT0,GL_POSITION,positionLight0); glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,10.0f); glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,directionLight0); Trong đoạn mã trên, lời gọi glLight(GL_LIGHT0,GL_SPOT_CUTOFF,10.0f) giới hạn chùm tia đèn chiếu theo cung 20 độ Đối với 10.0 đường góc đường tâm đường sinh chùm tia Với góc cắt lớn hơn, chùm tia đèn chiếu rộng 53 Hình 3.4: Chùm tia hẹp hình cầu Hình 3.5: Chùm tia rộng hình cầu Sự khác đèn chiếu so với nguồn sáng khác lời gọi glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION, directionLight0), thiết lập hướng chiếu đèn Các tọa độ hướng chiếu chứa mảng directionLight0[] tọa độ điểm mà ánh sáng đèn hướng vào 6.Đối tượng 3D chiếu sáng Việc thể cảnh OpenGL chiếu sáng không đơn giản Để nguồn sáng tác động đến đối tượng cảnh đòi hỏi phải hiểu rõ cách làm việc kiểu chiếu sáng OpenGL 6.1.Nguồn sáng môi trường Một cảnh có ba loại nguồn sáng: môi trường, khuếch tán, phản chiếu Ngoài ra, tính chất vật liệu đối tượng định kiểu ánh sáng phản xạ từ đối tượng, màu sắc hiệu bóng đối tượng Ta xem xét đoạn mã sau: glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH_TEST); glClearColor(0.0f,0.0f,0.0f,1.0f); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); 54 glLoadIdentity(); GLfloatmaterialAmbient[]={0.0f,1.0f,0.1f,1.0f}; GLfloatmaterialSpecular[]={0.7f,0.7f,0.7f,1.0f}; glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,materialAm bient); glMaterialfv(GL_FRONT,GL_SPECULAR,materialSpecular); glMaterialf(GL_FRONT,GL_SHININESS,100.0f); GLfloatambienLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatdiffuseLight0[]={0.0,0.0f,0.0f,1.0f}; GLfloatspecularLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatpositionLight0[]={0.0f,0.0f,1.0f,0.0f}; glLightfv(GL_LIGHT0,GL_AMBIENT,ambienLight0); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight0); glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight0); glLightfv(GL_LIGHT0,GL_POSITION,positionLight0); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glTranslatef(0.0f,0.0f,-3.5f); glutSolidSphere(1,20,8); glFlush(); Đoạn mã xác định vật liệu phản xạ ánh sáng môi trường, khuếch tán xanh lục ánh sáng phản chiếu trắng Nguồn sáng cảnh không thiết lập, ngoại trừ ánh sáng môi trường trắng Cuối cùng, đối tượng hình cầu đặc, vẽ gốc tọa độ hàm glutSolidSphere() Hình 3.6 thể đoạn mã Hình cầu giống hình tròn đặc, phản xạ ánh sáng môi trường, loại ánh sáng đến từ hướng Trong đa giác tạo nên hình cầu phản xạ lượng ánh sáng Hay nói cách khác, riêng ánh sáng môi trường không cung cấp bóng để tạo cảm giác ba chiều 55 Hình 3.6: Hình cầu với ánh sáng môi trường 6.2.Nguồn sáng khuếch tán Thay đổi đoạn mã để cảnh có ánh sáng khuếch tán GLfloatambienLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatdiffuseLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatspecularLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatpositionLight0[]={0.0f,0.0f,1.0f,0.0f}; Do ánh sáng khuếch tán đến từ hướng xác định, tia sáng chiếu vào đối tượng theo góc khác nhau, nên đường tia sáng đến đa giác (tạo nên hình cầu) khác nhau, tạo hiệu ứng bóng hình 3.7: 56 Hình 3.7: Hình cầu với anh sáng khuếch tán 6.3.Nguồn sáng phản chiếu Thay đổi đoạn mã sau để cảnh có nguồn sáng phản chiếu GLfloatambienLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatdiffuseLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatspecularLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatpositionLight0[]={0.0f,0.0f,1.0f,0.0f}; Do cảnh ánh sáng môi trường hay khuếch tán, hình cầu tối màu hầu hết diện tích Điểm sáng hình ánh sáng phản chiếu tạo nên ”điểm nóng” bề mặt hình cầu 57 Hình 3.8: Hình cầu với ánh sáng phản chiếu 6.4.Ánh sáng tổng hợp Để tạo cảnh sinh động, loại ánh sáng nguồn sáng, loại ánh sáng phản xạ từ bề mặt đối tượng, vị trí nguồn sáng cần cân nhắc kỹ Đoạn mã sau thể hình 3.9 GLfloatmaterialAmbient[]={0.0f,1.0f,0.0f,1.0f}; GLfloatmaterialSpecular[]={1.0f,1.0f,1.0f,1.0f}; GLfloatambienLight0[]={0.2f,0.2f,0.2f,1.0f}; GLfloatdiffuseLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatspecularLight0[]={1.0f,1.0f,1.0f,1.0f}; GLfloatpositionLight0[]={1.0f,0.5f,1.0f,0.0f}; 58 Hình 3.9: Hình cầu với ánh sáng môi trường, khuếch tán phản chiếu 7.Kiểm soát vị trí hướng nguồn sáng Khi hàm glLight*() gọi để xác định vị trí đạo nguồn sáng, vị trí hướng biến đổi ma trận modelview lưu trữ tọa độ Điều có nghĩa ta thay đổi vị trí hướng nguồn sáng cách thay đổi nội dung ma trận modelview Bây ta muốn xoay dịch chuyển vị trí ánh sáng để ánh sáng di chuyển tương đối tượng vật thể Sau chương trình quay nguồn sáng xung quanh đối tượng Khi chuột trái nhấn, vị trí ánh sáng xay thêm 30 độ #include"glut.h" #include #include staticintspin=0; voidinit(void) { glClearColor(1.0,1.0,1.0,1.0); glShadeModel(GL_SMOOTH); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); } 59 voiddisplay(void) { GLfloatposition[]={0.0,0.0,1.5,1.0}; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(0.0,0.0,-5.0); glPushMatrix(); glRotated((GLdouble)spin,1.0,0.0,0.0); glLightfv(GL_LIGHT0,GL_POSITION,position); glTranslated(0.0,0.0,1.5); GLfloatmaterialAmbient[]={0.0f,1.0f,0.0f,1.0f}; GLfloatmaterialSpecular[]={0.0f,0.0f,0.0f,1.0f}; glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,materialAmbient ); glMaterialfv(GL_FRONT,GL_SPECULAR,materialSpecular); glMaterialf(GL_FRONT,GL_SHININESS,100.0f); GLfloatambienLight0[]={0.0f,0.0f,0.0f,1.0f}; GLfloatdiffuseLight0[]={0.7f,0.7f,0.7f,1.0f}; GLfloatspecularLight0[]={1.0f,1.0f,1.0f,1.0f}; GLfloatpositionLight0[]={0.2f,0.2f,0.2f,0.0f}; glLightfv(GL_LIGHT0,GL_AMBIENT,ambienLight0); glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight0); glLightfv(GL_LIGHT0,GL_SPECULAR,specularLight0); glLightfv(GL_LIGHT0,GL_POSITION,positionLight0); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glutWireCube(0.1); glEnable(GL_LIGHTING); glPopMatrix(); glutSolidTorus(0.275,0.85,8,15); glPopMatrix(); glFlush(); } 60 voidreshape(intw,inth) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0,(GLfloat)w/(GLfloat)h,1.0,20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } voidmouse(intbutton,intstate,intx,inty) { switch(button){ caseGLUT_LEFT_BUTTON: if(state==GLUT_DOWN){ spin=(spin+30)%360; glutPostRedisplay(); } break; default: break; } } intmain(intargc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(500,500); glutInitWindowPosition(100,100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return0; } 61 Hình 3.10: Vị trí nguồn sáng phía trước Hình 3.11: vị trí nguồn sáng phía 62 Hình 3.12: Vị trí nguồn sáng phía sau 63 Chương 4:CHƯƠNG TRÌNH MÔ PHỎNG KHÔNG GIAN 3D 64 65 66 Tài liệu tham khảo: − Cuốn OpenGL Programming Guide OpenGL Developnent Cookbook − Các website: http://www.glprogramming.com/, http://ogldev.atspace.co.uk/, http://learnopengl.com/, http://nehe.gamedev.net/ − Diễn đàn: Studio Developers (http://www.stdio.vn/), study and share Viet Nam (https://studyandshare.wordpress.com/) 67 [...]... Các cờ khác có thể sử dụng với glBegin là GL_POINTS, GL_LINE_STRIP, GL_QUADS, GL_QUADS_STRIP và GL_POLYGONS Do một đường thẳng có 2 vertex, sau khi gọi glBegin(),VeHinhTrongOpenGL() gọi hàm glVertex2f() hai lần Hàm glVertex2f(), định nghĩa một vertex, dung các giá trị đối số kiểu GLfloat để môt tả tọa độ X và Y của vertex (Hàm glVertex() có 24 phiên bản) Tại sao 1 thư viện 3D như OpenGL lại định nghĩa... trạng thái trong OpenGL 3.Xét một chương trình OpenGL đơn giản Xét đoạn mã sử dụng các hàm OpenGL để thể hiện 1 đoạn thẳng trắng trên nền đen void VeHinhTrongOpenGL() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_LINES); glVertex2f(0.25f, 0.25f); glVertex2f(0.75f, 0.25f); glEnd(); glFlush(); } 11 Hình 2.1: Vẽ đoạn thẳng bằng OpenGL Bây giờ... khép kín với OpenGL 24 4.6.GL_POLYGON (vẽ đa giác) Đa giác là hình được tạo bởi các đường nối (cạnh) giữa một tập hợp các vertex Một đa giác có ít nhất 3 cạnh Như vậy, đa giác đơn giản nhất là tam giác OpenGL có thể vẽ đa giác như các điểm, các đường ngoài, hay đối tượng đặc biệt OpenGL còn có thể điền đầy các đa giác với mẫu đã được định nghĩa Thêm vào đó một đa giác OpenGL có hai mặt trước và sau có... màn hình Ví dụ vẽ 1 điểm với kích thư c 4 pixel glPointSize(4f); Đối số đơn của hàm là giá trị GLfloat cho biết đường kính yêu cầu của điểm Để xác định một dãy kích thư c điểm (được hỗ trợ bởi OpenGL) , glGetFloatv() được dung như sau 16 glFloat ps[2]; glGetFloatv(GL_POINT_SIZE_RANGE,ps); Với ps là 2 mảng thành phần có giá trị GLFloat chứa kích thư c điểm nhỏ nhất và điểm lớn nhất Lời gọi glGetFloatv()... glEnd(); glFlush(); Hình 2.4: Vẽ các đường với OpenGL 4.3.GL_LINE_STIPPLE (Vẽ đường chấm) OpenGL có thể vẽ đường chấm, là đường tạo lên bởi các điểm hay nét gạch Bước đầu tiên vẽ đường chấm là gọi glLineStipple() để xác định kiểu vẽ bằng chấm Và để làm điều đó, cần định nghĩa màu chấm, bằng cách tạo một giá trị nhị phân, với 1 tương ứng với chấm, 0 tương ứng với không chấm 20 Ví dụ mẫu chấm 00000000111111111... sáng (lighting) sẽ cải thiện việc kiểm soát màu của OpenGL trên máy 256 màu, bằng cách tạo bảng màu logic 3.4.Định nghĩa một hình Trước khi ra lệnh cho OpenGL vẽ một hình, ta phải cho OpenGL biết hình đó ra sao Điều này được thực hiện bằng cách định nghĩa các vertex đại diện cho đối tượng Ta sử dụng glBegin(), glVertex(), glEnd() 13 Trong VeHinhTrongOpenGL(), glBegin(GL_LINES) bắt đầu việc định nghĩa... Ở đây, mỗi năm glVertex() định nghĩa một điểm đơn Chú ý rằng đoạn mã trên định nghĩa các điểm trên mặt phẳng Decact 2D, chỉ với hai tọa độ X, Y Nhưng như đã biết, OpenGL tự động thiết lập giá trị mặc định 0 và 1 cho các biến tương ứng z và w Nếu định nghĩa các điểm trong tọa độ 3D, đoạn mã như sau: glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(0.75f, 0.75f, 1.0f); glVertex3f(-0.75f,... hình OpenGL sử dụng các loại bộ nhớ khác, bao gồm bộ đệm chiều sâu và bộ đệm stencil, để giúp nó xử lý ảnh 3.3.Đặt màu vẽ hiện hành Lời gọi glColor3f() thiết lập màu vẽ hiện hành Ba đối số của nó (được cho biết bởi hậu tố 3f) là các giá trị Glfloat xác định các thành phần màu: đỏ, xanh lá, xanh dương Có 32 phiên bản của hàm glColor() Sau khi đặt màu vẽ, mọi đối tượng được tạo bởi các lời gọi hàm OpenGL. .. này sẽ duy trì tác dụng cho đến khi nào bị thay đổi bởi lời gọi glColor() khác 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 Tên hệ thống 256 màu, màu được chọn có thể không thể hiện trên màn hình như mong muốn Đó là vì bảng màu tiêu chuẩn của Windows chỉ gồm 20 màu, gây khó khăn cho OpenGL trong việc... 20 Ví dụ mẫu chấm 00000000111111111 cho kết quả là một đường tạo lên bởi khoảng trống và nét gạch xem kẽ Hay mẫu chấm 0000111100001111 tạo một đường của các nét gạch ngắn Để sử dụng mẫu chấm là đối số trong lời gọi glLineStipple(), phải chuyển nó sang giá trị thập phân Ở ví dụ trên, các giá trị tương ứng là 0x00FF, và 0x0F0F Lời gọi glLineStipple() như sau: glLineStipple(1,0x0F0F) Hai đối số của hàm