Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 47 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
47
Dung lượng
721,04 KB
Nội dung
006.6 TRƢỜNG ĐẠI HỌC VINH KHOA CÔNG NGHỆ THÔNG TIN TRẦN DUY ANH ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC TÌM HIỂU THƢ VIỆN ĐỒ HỌA OPENGL Nghệ An, tháng 12 năm 2013 TRƢỜNG ĐẠI HỌC VINH KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC TÌM HIỂU THƢ VIỆN ĐỒ HỌA OPENGL/C++ Sinh viên thực hiện: Trần Duy Anh – 0851070300 Lớp: 50K1 – CNTT Giáo viên hướng dẫn: ThS Nguyễn Thị Minh Tâm Nghệ An, tháng 12 năm 2013 LỜI CẢM ƠN Lời đầu tiên, cho phép em bày tỏ lịng biết ơn sâu sắc tới giáo – Thạc sỹ Nguyễn Thị Minh Tâm, cô hƣớng dẫn em tận tình suốt năm học vừa qua nhƣ q trình hồn thành đồ án tốt nghiệp Em xin bày tỏ lòng biết ơn thầy giáo, giáo Khoa Cơng Nghệ Thơng Tin nói riêng, nhƣ thầy giáo, cô giáo Trƣờng Đại Học Vinh nói chung Các thầy dạy bảo, dẫn tạo điều kiện học tập tốt cho em suốt năm học tập trƣờng Tôi xin chân thành cảm ơn anh, chị khóa bạn khóa 50 khoa Cơng Nghệ Thông Tin, dẫn nhƣ cho ý kiến đóng góp giá trị Xin cảm ơn bạn diễn đàn glprograming.com giúp đỡ tơi hồn thành đồ án Xin chân thành cảm ơn! Vinh, ngày tháng 12 năm 2013 Trần Duy Anh LỜI MỞ ĐẦU N hững năm gần đây, xã hội có nhiều thay đổi, nhiều xu hƣớng phát triển mới, thành tích tiến vƣợt trội tất ngành công nghiệp nhƣ nơng nghiệp Điều phải kể đến đóng góp tích cực ngành khoa học đại, đáng kể đóng góp ngành Viễn thơng – Cơng nghệ thơng tin Đồ họa máy tính lĩnh vực lý thú phát triển nhanh tin học Ngay từ xuất hiện, đồ họa máy tính có sức hút mãnh liệt, đƣợc quan tâm ứng dụng nhiều lĩnh vực khác nhƣ: Khoa học, nghệ thuật, công nghiệp, giáo dục… Số lƣợng chƣơng trình, ứng dụng đồ họa khổng lồ phát triển liên tục OpenGL (Open Graphics Library) tiêu chuẩn kỹ thuật đồ họa đời nhƣ giao diện lập trình ứng dụng thống nhất, đơn giản hóa tƣơng tác phức tạp với máy xúc tiến ba chiều OpenGL đƣợc sử dụng rộng rãi thành cơng cơng nghiệp trị chơi điện tử Nhiều trò chơi điện tử đƣợc phát triển tảng OpenGL gặt hái đƣợc thành công rực rỡ, nhƣ: Call of Duty, HalfLife, World of Warcraft… Trong phạm vi đồ án này, xin giới thiệu thƣ viện đồ họa OpenGL với nội dung chính: Chƣơng I – Giới thiệu Giới thiệu OpenGL Chƣơng II – Cơ sở lý thuyết Những kiến thức sở hình học đồ họa Chƣơng III – Đồ họa OpenGL Giới thiệu thuật tốn, phép chiếu, biến hình, ánh sáng Chƣơng IV – Ví dụ minh họa Tổng kết Phụ lục MỤC LỤC LỜI CẢM ƠN LỜI MỞ ĐẦU MỤC LỤC CHƢƠNG I – GIỚI THIỆU 1.1 Lịch sử phát triển 1.2 Cách làm việc OpenGL 1.3 Thao tác OpenGL 1.4 Thành phần CHƢƠNG II – CƠ SỞ LÝ THUYẾT 10 2.1 Đồ họa hai chiều 10 2.1.1 Tọa độ Đề-Các tọa độ hình 10 2.1.2 Định nghĩa Vertex kiểu liệu hình phẳng 11 2.1.3 Các phép biến hình 12 2.1.4 Sử dụng ma trận phép biến hình 14 2.2 Đồ họa ba chiều 16 2.2.1 Hệ tọa độ ba chiều 16 2.2.2 Định nghĩa đối tƣợng ba chiều 16 2.2.3 Các phƣơng pháp thể đối tƣợng ba chiều 17 2.2.4 Ma trận phép biến hình 19 CHƢƠNG III – ĐỒ HỌA OPENGL 22 3.1 Chƣơng trình OpenGL 22 3.1.1 Cú pháp lệnh, kiểu liệu OpenGL 22 3.1.2 Ngữ cảnh biểu diễn 22 3.1.3 Định dạng điểm vẽ 23 3.2 Vẽ hình sử dụng màu 24 3.2.1 Các trạng thái OpenGL 24 3.2.2 Định nghĩa hình vẽ 26 3.3 Các phép biến hình OpenGL 30 3.3.1 Xây dựng đối tƣợng ba chiều từ đa giác 30 3.3.2 Phép chiếu 31 3.3.3 Phép biến hình đối tƣợng 32 3.3.4 Viewport 33 3.4 Chiếu sáng đối tƣợng 34 3.4.1 Các loại nguồn sáng 34 3.4.2 Định nghĩa nguồn sáng 34 3.4.3 Tính chất vật liệu 37 CHƢƠNG IV – VÍ DỤ MINH HỌA 39 4.1 Mục tiêu 39 4.2 Thực 39 TỔNG KẾT 46 PHỤ LỤC 47 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL CHƢƠNG I – GIỚI THIỆU 1.1 Lịch sử phát triển OpenGL đƣợc đị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, đƣợc 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 ba chiều phức tạp với độ tinh vi, xác cao, mà ngƣời thiết kế khơng phải đánh vật với núi cơng thức tố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ừ dùng đƣợc phần cứng hệ điều hành khác 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 lọai cấu hình phần cứng, nhƣ hệ điều hành khác Version 1.0 OPENGL đƣợc giới thiệu vào ngày 01/7/1992 Để bảo đảm tính “mở”, nâng cấp OpenGL phải thông qua OpenGL Architecture Review Board (Ủy Ban Xem Xét Kiến Trúc OpenGL) 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 nhƣng khơng đƣợc quyền bỏ phiếu Version 1.1 OPENGL đƣợc OpenGL Architecture Review Board thông qua vào tháng 12 năm 1995 1.2 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 buớc cần thiết để có đuợc thể hay hiệu định Các “buớ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 đƣợc dùng để vẽ phần tử đồ họa nhƣ điểm, đuờng đa giác không gian ba chiều Trần Duy Anh – Lớp 50K1 – Khoa CNTT Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Ngồi ra, OpenGL cịn 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 khơng có chức quản lý cửa sổ, tƣơng tác với nguời dùng hay xuất nhập file Mơi truờng chủ (tức hệ diều hành) có chức chịu trách nhiệm thực biện pháp quản lý cho OpenGL Các phần tử đồ họa lệnh giới thiệu phần tử đồ họa (primitive) thực lệnh Cách làm việc OpenGL cho biết loại thao tác đồ họa mà OpenGL kiểm sốt Mơ hình hoạt động client/server cho việc thơng dịch lệnh OpenGL Thao tác OpenGL đƣa mô tả mức cao cách OpenGL xử lý liệu tạo hình ảnh tƣơng ứng 1.3 Thao tác OpenGL Danh sách hiển thị thay xử lý toàn lệnh, số lệnh đƣợc gom lại danh sách để xử lý sau Bộ uớc luợng: Ƣớc lƣợng trình OpenGL sinh vertex thơng số từ phƣơng trình Bézier (phƣơng trình tham số thƣờng đƣợc sử dụng đồ họa máy tính để xác định đƣờng cong, tam giác, mặt phẳng…) xác định truớc, cung cấp phƣơng cách hiệu để xấp xỉ hình học bề mặt đƣờng cong cách đánh giá lệnh đa thức giá trị đƣa vào Các thao tác vertex tổ hợp primirite: OpenGL xử lý primirite hình học (điểm, đoạn thẳng đa giác) Những primirite đƣợc biểu diễn vertex Các vertex đƣợc biến đổi, chiếu sáng, primirite đƣợc khử các phần khuất theo viewport để chuẩn bị rasterze Raterization: giai đoạn resterize tạo chuỗi địa đệm khung giá trị liên kết sử dụng hình dạng hai chiều điểm, đoạn thẳng hay đa giác Các fragment tạo đuợc cung cấp cho trình Các thao tác fragment: thao tác cuối liệu, truớc lƣu trữ liệu duới dạng pixel đệm khung Trần Duy Anh – Lớp 50K1 – Khoa CNTT Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Các thao tác bao gồm việc cập nhật (có điều kiện) đệm khung dựa giá trị lƣu trữ giá trị vừa có, việc pha trộn màu vừa có màu lƣu trữ, nhƣ thao tác mask thao tác logic khác giá trị pixel Dữ liệu đƣợc đƣa vào duới dạng pixel Hoặc đuợc lƣu trữ nhƣ nhớ texture, để dùng cho giai đoạn rasterizatrion hay rasterize, với kết fragment đuợc kết hợp vào đệm khung, chúng phát sinh từ liệu hình học, liệu pixel 1.4 Thành phần OpenGL gồm có hàm Bộ hạt nhân có 115 hàm bản: tên hàm bắt dầ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 dầu “GLU”; Thƣ viện OpenGL Auxiliary: tên hàm bắt đầu “AUX”); Bộ hàm”WGL”: tên hàm bắt đầu “WGL”; Các hàm WIN32 API: tên hàm khơng có 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 duợc thể nhiều dạng khác tùy thuộc vào loại liệu mà chúng tiếp nhận, nên thực tế có hon 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ố 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 nhƣ 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ụ nhƣ quản lý cửa sổ, điều khiển xuất/nhập, vẽ đối tuợng ba chiều định Các hàm “WGL” kết nối OpenGL với Windows NT, cho phép nguờ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 Các hàm Win32 API đƣợc dùng giải định dạng điểm ảnh tạo đệm đôi Trần Duy Anh – Lớp 50K1 – Khoa CNTT Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL CHƢƠNG II – CƠ SỞ LÝ THUYẾT 2.1 Đồ họa hai chiều 2.1.1 Tọa độ Đề-Các tọa độ hình y Max x O x Max y Hệ tọa độ Đề-Các Hệ tọa độ hình Do khác biệt hình thể tọa độ Đề-Các, cần có phƣơng pháp chuyển đổi chúng Thuật ngữ đồ họa gọi mapping điểm tọa độ Đề-Các sang tọa độ hình để thể đối tuợng vị trí Nếu bỏ qua vấn đề giá trị âm, việc thể điểm (x1,y1) tọa độ ĐềCác sang điểm (x2,y2) tọa độ hình cho công thức sau: X2=X1; Y2=maxY – Y1; Để thực cơng thức này, truớc hết cần biết kích thuớc cửa sổ, cách gọi hàm GetClientRect() Hàm điền đầy cấu trúc RECT với kích thƣớc cửa sổ Ví dụ: Int triangle[6]={2,5,5,2,2,2,}; CCLientDC dc(this); Int newX,newY,startX,startY; Trần Duy Anh – Lớp 50K1 – Khoa CNTT 10 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL 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 Ví dụ: glMatrixMode(GL_PROTECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 7.0); glMatrixMode(GL_MODEVIEW); glLoadIdentity(); glTranslatef(0.0f, 0.0f, -3.5f); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); DrawCube(); glFlush(); Trong đó, DrawCube hàm định nghĩa Vertex hình khối Cube Phép quay Tƣơng tự hai phép biến hình trƣớc, phép quay sử dụng hàm glRotatef() tạo ma trận quay, nhân với ma trận đƣợc chọn hành Bốn đối số hàm giá trị GLfloat xác định gốc quay ngƣợc chiều kim đồng hồ tọa độ X,Y Z vertex quay (để quay theo trục, đặt giá trị 1.0 cho trục 0.0 cho trục lại) Một phiên khác hàm hàm glRotated() có đối số kiểu Gldouble 3.3.4 Viewport OpenGL cung cấp phép chiếu phối cảnh (hoặc song song) để xén hình chiếu phối cảnh (hoặc song song) Sau đó, thực phép biến đổi viewport, để định cách mà vertex đƣợc thể thiết bị (màn hình hay máy in).Viewport đơn giản chữ nhật mà hình đƣợc thể Trần Duy Anh – Lớp 50K1 – Khoa CNTT 33 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Khi không cần xác định viewport riêng biệt, ta sử dụng viewport mặc định để thể hình Tuy nhiên, có lúc cần sử dụng viewport phần cửa sổ, hay cần viewport thay đổi thay đổi kích thƣớc cửa sổ… Khi đó, hàm glViewport() đƣợc sử dụng để thiết lập kích thƣớc vị trí viewport(): glViewport(left,bottom,width,height); Hai đối số đầu hàm giá trị Glint xác định góc trái dƣới Hai đối số giá trị xác định chiều rộng chiều cao viewport 3.4 Chiếu sáng đối tƣợng 3.4.1 Các loại nguồn sáng OpenGL có bốn loại nguồn sáng: Môi trƣờng: Là ánh sáng đến từ hƣớng lúc Ví dụ: Ánh sáng phịng đƣợc chiếu sáng đầy đủ Khuyếch tán: Là ánh sáng đến từ hƣớng Ánh sáng làm cho bề mặt đối tƣợng góc cạnh trở nên sáng hơn, sau ánh sáng bị khuếch tán (tùy vào định nghĩa vật liệu) Phản chiếu: Là ánh sáng tạo đốm phản chiếu, thƣờng màu trắng, bề mặt có tính chất phản chiếu cao Nguồn phát: Là nguồn phát ánh sáng Ví dụ: Mặt trời, bóng đèn… Có thể có nguồn phát khác chƣơng trình OpenGL Thêm vào đó, xác định tính phản xạ ánh sáng bề mặt đối tƣợng cảnh Đối tƣợng phụ thuộc vào ánh sáng mà phản xạ Ví du thiết lập bề mặt đối tƣợng phản xạ ánh sáng xanh dƣơng, OpenGL thể đối tƣợng với bóng xanh dƣơng khác (ánh sáng chiếu vào đối tƣợng ánh sáng trắng) 3.4.2 Định nghĩa nguồn sáng OpenGL Cho phép có tám nguồn sáng khác chƣơng trình nguồn sáng có nhiều thuộc tính để kiểm sốt ánh sáng tác động đến cảnh Các nguồn sáng Các ánh sáng bao gồm ánh sáng môi trƣờng, ánh sáng khuếch tán, ánh sáng phản chiếu ánh sáng vị trí Cần xát định thành phần phần trăm màu đỏ, xanh dƣơng, xanh lục thuộc tính ánh sáng mơi trƣờng, Trần Duy Anh – Lớp 50K1 – Khoa CNTT 34 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL khuếch tán,và phản chiếu; Đồng thời phải xác định tọa độ X,Y,Z W nguồn sáng Công việc đƣợc quản lý mảng chứa giá trị yêu cầu Thiết lập mảng giá trị ánh sáng Glfloat ambientLight0[]={0.3f, 0.3f, 0.3f, 1.0f}; Glfloat diffuseLight0[]={0.5f, 0.5f, 0.5f, 1.0f}; Glfloat specularLight0[]={0.0f, 0.0f, 0.0f, 1.0f}; Glfloat positionLight0[]={0.0f, 0.0f, 1.0f, 0.0f}; o ambientLight0[]: Ánh sáng môi trƣờng 30% đỏ, 30% lam, 30% lục o diffuseLight0[]: Ánh sáng khuếch tán 50% đỏ, 50% lam, 50% lục o specularLight0[]: Ánh sáng phản chiếu với giá trị tối o positionLight0[]: Nguồn sáng Các tham số xác định vị trí nguồn sáng khoảng cách đến đối tƣợng Với giá trị tham số cuối 0, ánh sáng chiếu đến đối tƣợng tia sáng song song (khoảng cách đến nguồn sáng vô lớn), với giá trị 1, ánh sáng chiếu vào đối tƣợng theo góc khác Kích hoạt nguồn sáng Sau định nghĩa mảng giá trị ánh sáng, cần chuyển giá trị cho OpenGL: glLightfv (GL_LIGHT0,GL_AMBIENT, ambientLight0); glLightfv (GL_LIGHT0,GL_DIFFUSE, diffuseLight0); glLightfv (GL_LIGHT0,GL_SPECULAR, specularLight0); glLightfv (GL_LIGHT0,GL_POSITION, positionLight0); Ba đối số glLightfv() gồm nguồn sáng để định nghĩa, số thể tính chất ánh sáng muốn thay đổi, địa mảng chứa giá trị dùng thay đổi tính chất ánh sáng Đối với thuộc tính ánh sáng mơi trƣờng, khuếch tán, phản chiếu, mảng chứa giá trị RGBA Đối với địa nguồn sáng, mảng chứa tọa độ X,Y,Z, W ánh sáng Đối số số từ GL_LIGHT0 đến GL_LIGHT7 (OpenGL có tối đa nguồn sáng) Trần Duy Anh – Lớp 50K1 – Khoa CNTT 35 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Đối số thứ hai số cho bảng: Hằng số Ý nghĩa Gl_AMBIENT Xác định ánh ánh sáng môi trƣờng GL-CONSTANT_ATTENUATION Xác định lƣợng giảm ánh sáng theo hệ số GL_DIFFUSE Xác định ánh sáng khuếch tán Xác định lƣợng giảm ánh sáng GL-LINEAR_ATTENUATION sở khoảng cách từ nguồn sáng đến đối tƣợng GL_POSITION Xác định vị trí nguồn sáng GL_QUADRATIC_ATTENUATION Xác định lƣợng giảm ánh sáng theo bình phƣơng khoảng cách từ nguồn sáng đến đố tƣợng GL_SPECULAR Xác định ánh sáng khoảng chiếu GL_SPOT_CUTOFF Xác định góc trải đèn chiếu GL_SPOT_DIRECTION Xác định hƣớng đèn chiếu GL_SPOT_EXPONENT Xác định cƣờng độ đèn chiếu ,có tính đến góc ánh sáng Kích hoạt chiếu sáng: glEnable(GL_LIGHTING); Bật nguồn sáng: glEnable(GL_LIGHT0); Vị trí nguồn sáng bị ảnh hƣởng phép biến hình đối tƣợng nhƣ đối tƣợng khác Do đó, phải gọi glMatrixMode(gl_MODELVIEW) glLoadldentity() trƣớc gọi glLight() Nếu muốn biến đổi vị trí hƣớng Trần Duy Anh – Lớp 50K1 – Khoa CNTT 36 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL nguồn sáng theo đối tƣợng khác cảnh, phải thực phép tịnh tiến, co giãn, quay trƣớc gọi glLight() 3.4.3 Tính chất vật liệu Tính chất phản chiếu vật liệu ảnh hƣởng đến cảnh Ví dụ, hình khối màu trắng ánh sáng đỏ có màu đỏ khơng màu trắng ; Trong , khối đỏ ánh sáng xanh lục có màu đen Ngồi ra, vật liệu có độ sáng khác phản xạ ánh sáng khác Màu đối tƣợng cảnh phụ thuộc vào màu ánh sáng mà phản xạ Ví dụ, đối tƣợng phản xạ ánh sáng xanh lục, có màu xanh lục ánh sáng trắng Do thành phần màu đỏ xanh dƣơng ánh sáng bị hấp thụ lại thành phần xanh lục đến đƣợc mắt ngƣời Thông thƣờng, ánh sáng môi trƣờng ánh sáng khuếch tán phản xạ từ đối tƣợng theo cách Tức đối tƣợng phản xạ ánh sáng xanh lục, phản xạ màu xanh lục ánh sáng môi trƣờng lẫn ánh sáng khuếch tán Trong ánh sáng phản chiếu hầu nhƣ luôn màu với ánh sáng chiếu vào đối tƣợng Ví dụ, xét khối vng đƣợc thể ánh sáng vàng (màu vàng tổ hợp đồng lƣợng màu đỏ xanh dƣơng) Nếu muốn khối vng có màu đỏ, vật liệu phải phản xạ màu đỏ ánh sáng mội trƣờng ánh sáng khuếch tán Để làm khối vuông trở nên sáng hơn, phải thiết lập cho tính phản xạ màu vàng ánh sáng phản chiếu OpenGL cho phép định nghĩa tính chất đối tƣợng, để xác định loại ánh sáng mà đối tƣợng phản xạ, nhƣ gián tiếp xác định màu cuối đối tƣợng Thiết lập mảng giá trị vật liệu Glfloat materialAmbient[]={0.0f, 0.7f, 0.0f, 1.0f} Glfloat materialSpecular[]={1.0f, 1.0f, 1.0f, 1.0f} Mỗi mảng chứa giá trị RGBA cho kiểu phản xạ ánh sáng riêng biệt, giá trị RGBA tƣơng ứng với màu sắc ánh sáng dội từ vật liệu đối tƣợng o materialAmbient[] định nghĩa vật liệu phản xạ 70% màu xanh lục ánh sáng mơi trƣờng khuếch tán mà nhận đƣợc, nhƣng không phản xạ màu đỏ xanh dƣơng o materialSpecular[] định nghĩa vật liệu phản xạ ánh sáng trắng, gồm 100% thành phần đỏ, xanh dƣơng, xanh lục Trần Duy Anh – Lớp 50K1 – Khoa CNTT 37 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Chuyển mảng vật liệu GlMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, materialAmbient); GlMaterialfv (GL_FRONT, GL_SPECULAR, materialSpecular); Các đối số hàm glMaterialfv() gồm xác định bề mặt đa giác muốn định nghĩa vật liệu, định nghĩa tính chất vật liệu, trỏ trỏ đến mảng chứa giá trị dùng thiết lập tính chất vật liệu Đối số GL_FRONT, GL_BACK, hay GL_FRONT_AND_BACK, tƣơng ứng với lựa chọn mặt trƣớc, mặt sau, hay mặt trƣớc lẫn sau đa giác tạo nên đối tƣợng Đối với đối tƣợng đặc nhƣ hình khối, GL_FRONT thƣờng đƣợc chọn mặt sau khơng thấy đƣợc Nhƣng hình khối mặt, GL_FRONT_AND_BACK đƣợc chọn, cảnh nhìn thấy hai mặt sau trƣớc đa giác Đối số thứ hai số đƣợc cho bảng: Hằng số Ý nghĩa GL_AMBIENT Ánh sáng môi trƣờng bi ánh xạ GL_AMBIENT_AND_DIFFUSE Ánh sáng môi trƣờng ánh sáng khuếch tán bị ánh xạ GL_COLOR_INDEXES Xác định số màu cho ánh sáng GL_DIFFUSE Ánh sáng khuếch tán bị phản xạ GL_EMISSION Xác định nguồn sáng phát GL_SPECULAR Ánh sáng phản chiếu bị phản xạ GL_SHININESS Xác định độ bóng vật liệu Trần Duy Anh – Lớp 50K1 – Khoa CNTT 38 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL CHƢƠNG IV – VÍ DỤ MINH HỌA 4.1 Mục tiêu Xây dựng chƣơng trình thể đối tƣợng ba chiều Sử dụng hàm, lệnh thƣ viện OpenGL/C++: Phép chiếu phối cảnh tạo ảo giác ba chiều Các phép biến hình đối tƣợng và/hoặc viewport Định nghĩa sử dụng loại ánh sáng Tịnh tiến, thay đổi giá trị màu RBG Ý tƣởng: Vẽ khối lập phƣơng ba chiều tự động quay hình theo ba trục tọa độ Sử dụng phép tịnh tiến Viewport để phóng to thu nhỏ khối lập phƣơng Định nghĩa sử dụng nguồn sáng RBG thay đổi giá trị màu vị trí 4.2 Thực Chƣơng trình sử dụng o Microsoft® Visual Studio™ Ultimate 2013 o Thƣ viện OpenGL/C++ Khai báo thƣ viện đồ họa glut.h include “glut.h” Khai báo biến tổng thể o Hệ số góc phép quay o Định nghĩa ánh sáng vị trí: Ánh sáng khuếch tán (diffuse light): Giá trị ban đầu ánh sáng trắng Ánh sáng môi trƣờng (ambient light): Giá trị ban đầu ánh sáng trắng Vị trí nguồn sáng (position light variables): Đặt trƣớc Viewport, vị trí (0,0,10) o Biến giá trị Z Axis Viewport: Nhằm thay đổi vị trí khung nhìn để phóng to thu nhỏ đối tƣợng Trần Duy Anh – Lớp 50K1 – Khoa CNTT 39 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Hàm vẽ đối tƣợng o Mục đích Vẽ khối lập phƣơng tự động xoay với hệ số góc khai báo trên, với giá ban đầu X Axis, Y Axis Z Axis o Nội dung glRotatef(angle, 1.0, 0.0, 0.0); glRotatef(angle, 0.0, 1.0, 0.0); glRotatef(angle, 0.0, 0.0, 1.0); glutSolidCube(2); Hàm khởi tạo đồ họa o Mục đích Khởi tạo đồ họa: Kiểm tra chiều sâu, bật nguồn sáng… o Nội dung glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glShadeModel(GL_SMOOTH); Hàm khởi tạo Bitmap Font o Mục đích Khởi tạo font o Nội dung void *font = GLUT_BITMAP_TIMES_ROMAN_24; Hàm output(int x,int y,int z,char *string) o Mục đích Định nghĩa hàm output để xuất chuỗi ký tự hình Trần Duy Anh – Lớp 50K1 – Khoa CNTT 40 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL o Nội dung int len, i; glColor3f(1.0, 1.0, 1.0); glRasterPos3f(x, y, z); len = (int)strlen(string); for (i = 0; i < len; i++) { glutBitmapCharacter(font, string[i]); Hàm display(void) o Mục đích Sử dụng hàm để xuất kết hình o Nội dung glClearColor(0.0, 0.0, 0.0, 1.0); //black screen glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); GLfloat DiffuseLight[] = { dlr, dlg, dlb }; GLfloat AmbientLight[] = { alr, alg, alb }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseLight); glLightfv(GL_LIGHT1, GL_AMBIENT, AmbientLight); GLfloat LightPosition[] = { lx, ly, lz, lw }; glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); gluLookAt(0.0, 0.0, zz, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); cube(); output(1, 1, 1, "Graphical programing"); glutSwapBuffers(); angle+=0.02; Trần Duy Anh – Lớp 50K1 – Khoa CNTT 41 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL Hàm reshape(int w,int h) o Mục đích Định nghĩa viewport, thiết lập ma trận biến hình o Nội dung glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0); glMatrixMode(GL_MODELVIEW); Hàm keyboard(unsined char key,int x, int y) o Mục đích Thiết lập phím điều khiển cho chƣơng trình o Nội dung if (key == '1') { dlr = 1.0; //R dlg = 0.0; dlb = 0.0; } if (key == '2') { dlr = 0.0; //G dlg = 1.0; dlb = 0.0; } if (key == '3') { Trần Duy Anh – Lớp 50K1 – Khoa CNTT 42 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL dlr = 0.0; //B dlg = 0.0; dlb = 1.0; } if (key == 'r') { if (dlr == 1.0) dlr = 0.1; else dlr += 0.1; //+R } if (key == 'g') { if (dlg == 1.1) dlg = 0.1; else dlg += 0.1; //+G } if (key == 'b') { if (dlb == 1.1) dlb = 0.1; else dlb+= 0.1; //+B } if (key == 'w') ly += 10.0; //U Trần Duy Anh – Lớp 50K1 – Khoa CNTT 43 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL if (key == 's') ly -= 10.0; //D if (key == 'a') lx -= 10.0; //L if (key == 'd') lx += 10.0; //R if (key == 'q') { lx = 0.0; //Reset ly = 0.0; lz = 10.0; dlr = 1.0; dlg = 1.0; dlb = 1.0; } if (key == '=') zz += 1; if (key == '-') zz -= 1;} Hàm main o Mục đích Sử dụng hàm định nghĩa gọi vòng lặp main thể chƣơng trình o Nội dung glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(800, 600); Trần Duy Anh – Lớp 50K1 – Khoa CNTT 44 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL glutInitWindowPosition(100, 100); glutCreateWindow("Opengl Demo Applications"); init(); glutDisplayFunc(display); // glutIdleFunc(display); //update glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); //checkkey glutMainLoop(); return 0; Trần Duy Anh – Lớp 50K1 – Khoa CNTT 45 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL TỔNG KẾT OpenGL nói riêng lập trình đồ họa nói chung chủ đề đầy tiềm Với tính tƣơng thích mạnh mẽ, OpenGL khơng dành riêng cho hệ điều hành hay hệ thống Có thể sử dụng OpenGL tạo ứng dụng cho Windows, Macintosh, Unix hay chí siêu máy tính SGI dùng để tạo nên bầu trời nhà mơ hình vũ trụ Hayden Planetanium New York Qua chƣơng trên, đồ án cung cấp nhìn tổng thể thƣ viện đồ họa OpenGL, định nghĩa để làm quen với lập trình đồ họa ba chiều, phép chiếu, biến hình, chiếu sáng đối tƣợng Đồ án chƣa thể trình bày đƣợc chi tiết giải thuật, nhƣ chƣa giới thiệu chức phức tạp OpenGL nhƣ hiệu ứng pha trộn, giảm cƣa, sƣơng mù, displaylist, quadric, blending, fog… Do thời gian, kiến thức cịn hạn chế nên đồ án khơng thể tránh khỏi thiếu sót Mong nhận đƣợc góp ý quý thầy cô bạn Trần Duy Anh – Lớp 50K1 – Khoa CNTT 46 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL PHỤ LỤC Tài liệu, website tham khảo Hoàng Kiếm, Dƣơng Anh Đức, Lê Đình Huy, Vũ Hải Quân, Giáo trình Cơ sở Đồ họa máy tính, Nhà xuất Giáo dục Francis S Hill, Computer Graphics, Macmillan Publishing Company, New York, 1990 http://www.opengl.org/ http://www.glprogramming.com/ http://www.youtube.com/ Trần Duy Anh – Lớp 50K1 – Khoa CNTT 47 ... – Khoa CNTT 21 Đồ án tốt nghiệp Đại Học – Tìm hiểu thƣ viện đồ họa OpenGL CHƢƠNG III – ĐỒ HỌA OPENGL 3.1 Chƣơng trình OpenGL 3.1.1 Cú pháp lệnh, kiểu liệu OpenGL Cú pháp: