Tài liệu tổng hợp môn kỹ thuật đồ họa C++. OpenGL được định nghĩa là “giao diện phần mềm cho phần cứng đồ họa ”. Thực chất, OpenGL là một thư viện các hàm đồ họa, được xem là 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 các ứng dụng 3D phức tạp với độ tinh vi, chính xác cao, mà người thiết kế không phải đánh vật với các núi công thức toán học và các mã nguồn phức tạp. Và do OpenGL là tiêu chuẩn công nghiệp, các ứng dụng tạo từ nó dùng được trên các phần cứng và hệ điều hành khác nhau.
KỸ THUẬT ĐỒ HỌA Tiểu Luận: Tìm Hiểu Thư Viện Đồ Họa OpenGL MỤC LỤC LỜI MỞ ĐẦU……………………………………………………………………… CHƯƠNG I GIỚI THIỆU VỀ OPENGL…………………… ………………… CHƯƠNG II CÀI ĐẶT OPENGL TRONG DEV- C++…………………… … CHƯƠNG III CÁC THÀNH PHẦN CƠ BẢN CỦA OPENGL……………… 3.1 Chương trình opengl………………….… 3.2 Xoá hình opengl……………………………… 3.3 Vẽ hình opengl…………………………………………… 3.4 Sử dụng màu vẽ…………………………………………………… 3.5 Giao diện cửa sổ quản lý cửa sổ………………………… 3.6 Quan sát – khung nhìn…………………………………………… 3.7 Chuột……………………………………………………… 3.8 Thể toạ độ chiều…………………………………………… 3.9 Sử dụng ánh sáng opengl…………………………………… 3.10 Vẽ nhiều vật – Dùng ma trận…………………………………… CHƯƠNG IV CÁC ĐỐI TƯỢNG HÌNH HỌC CƠ BẢN TRONG OPENGL 4.1 Vẽ điểm, đường, đa giác (Point, Line, Polygon)….……… 4.1.1 OpenGl tạo điểm, đường, đa giác từ đỉnh( Vertex)……… 4.1.2 Một số lệnh khác……………………………………………… 4.2 Tập lồi………………………………………………………… 4.2.2 Phéo đặc tam giác hợp lệ……………………………………… 4.3 Phép biến đổi điểm nhìn biến đổi mô hình (Verwing and Modeling Transformations)…………………………………………… 4.3.1 Phéo biển đổi điểm nhìn………………………………………… 4.3.2 Phéo biển đổi mô hình………………………………………… 4.3.3 Các chuyển đổi từ phép biến đổi điểm nhìn sang biến đổi mô hình…………………………………………………………………… 4.3.4 Phép biến đổi cổng nhìn………………………………………… 4.3.5 Điểu khiển ngăn xếp ma trận……………………………… LỜI MỞ ĐẦU Cùng với phát triển tin học, kỹ thuật đồ họa máy vi tính, ngày trở nên tinh xảo Giao diện phần mềm ngày trở nên thân thiện,đẹp mắt nhờ thể đồ họa Sự hổ trợ tin học cho ngành khác trở nên đắc lực nhờ khả đồ họa vi tính Và giới thực biểu diễn cách sinh động, linh hoạt, đầy màu sắc không gian ba chiều Trong thành công kỹ thuật đồ họa ngày không nói đến phát triển vượt bậc tốc độ phần cứng lẫn hệ điều hành Nhưng thân kỹ thuật đồ họa có bước tiến nhảy vọt từ phép tính toán học phức tạp đến thư viện đồ họa tạo sẳn Các thư viện cho phép giảm nhẹ thời gian công sức người lập trình; Bởi với chúng, để có “tác phẩm ”đồ họa không đòi hỏi phải có kiến thức hùng hậu đường cong Bezier, B-spline, hình học, tạo bóng…, mà ứng dụng hàm tạo sẳn Một thư viện OpenGL, xem tiêu chuẩn thiết kế công nghiệp cho đồ họa ba chiều Mục tiêu tiểu luận tìm hiểu thư viện đồ họa OpenGL đồ họa ba chiều, đồng thời cố gắng đưa ứng dụng OpenGL việc minh họa giải thuật đồ họa ba chiều Tuy nhiên, tiểu luận không tránh khỏi hạn chế thiếu sót, nên mong bảo, góp ý thầy Chương I Sơ Lược Về OPENGL 1.1.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 lọai cấu hình phần cứng, hệ điều hành khác Version1.0 OPENGL 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 Uy 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 tuận quyền bỏ phiếu ) Open GL version1.1 ARB thông qua vào tháng 12/1995 1.2.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 3-D phức tạp với độ tinh vi, xác cao, mà người thiết kế đánh vật với núi 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ừ dùng phần cứng hệ điều hành khác Các mục sau giới thiệu cách nhìn tổng quát cách làm việc 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 lọai thao tác đồ họa mà OpenGL kiểm soát - Mô hình hoạt động nói mô hình 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 lên điệm khung Các phần tử đồ họa lệnh: Primitive xác định nhóm hay nhiều vertex điểm không gian Mỗi vertex xác định điểm, đầu đoạn thẳng hay đỉnh đa giác Dữ liệu (bao gồm tọa độ vertex, màu sắc, normal, texture cờ xác định loại cạnh) kết hợi với vertex Khi xử lý primitive, cập vertex liệu liên kết với sử lý độc lập với cập khác, theo thứ tự phương pháp Ngoại lệ trường hợp khử phần khuất primirite(clipping) Khi đó, liệu vertex sửa vertex khác tạo Loại clipping tuỳ thuộc loại primirite mà nhóm vertex biểu diễn Các lệnh luôn xử lý theo thứ tự mà tiếp nhận, mặt dù có trì hoãn không xác định trước lệnh có hiệu lực Nghĩa primirite vẽ trọn vẹn trước lệnh có hiệu lự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”này 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: Mô hình thông dịch lệnh OpenGL client-server Mã ứng dụng(vai trò client) đưa lệnh Lệnh thông dịch sử lý OpenGL (vai trò server) Server client máy tính khác Theo nghĩa này, OpenGL network-transparent (tạm dịch mạng suốt) Server trì nhiều ngữ cảnh OpenGL, ngữ cảnh trạng thái OpenGL Client nói với ngữ cảnh Giao thức mạng sử dụng độc lập hóa dựa giao thức mạng có (tức OpenGL dùng máy độc lập hay môi trường mạng) Không có lệnh OpenGL tiếp nhận việc nhập liệu trực tiếp từ người dùng Cuối cùng, hệ thống cửa sổ kiểm soát tác dụng lệnh OpenGL đệm khung qua thao tác: - Quyết định phần đệm khung mà OpenGL truy xuất thời điểm cho phép - Truyền đạt cho OpenGL thông tin cấu trúc phần - Như vậy, lệnh OpenGL định dạng đệm khung hay khởi tạo OpenGL Sự định dạng đệm khung thực bên OpenGL liên kết với hệ thống cửa sổ Sự khởi tạo OpenGL tiến hành hệ thống cấp phát cửa sổ cho việc biểu diễn Thao tác OpenGL bản: Sơ đồ khối 1.2 tóm tắt cách OpenGL xử lý liệu Các lệnh vào phía trái sơ đồ qua “đường ống xử lý” Một số lệnh xác định đối tượng hình học vẽ, số khác kiểm soát cách quản lý đối tượng qua giai đoạn sử lý khác Các giai đoạn xủ lý khác nhau: Danh sách hiển thị thay xử lý toàn lệnh, số lệnh gom lại danh sách để xử lý sau Bộ ước lượng: ước lượng trình OpenGL sinh vertex thông số từ phương trình Bézier xác định trướ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 cửa 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 biểu diễn vertex Các vertex biến đổi, chiếu sáng, primirite 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 cung cấp cho trình Các thao tác fragment: thao tác cuối liệu, trước lưu trữ liệu dạng pixel đệm khung 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ữ, thao tác mask thao tác logic khác giá trị pixel Dữ liệu đưa vào dạng cac pixel Khi đó, sau giai đoạn thao pixel, liệu pixel Hoặc lưu trữ nhớ texture, để dùng cho giai đoạn rasterizatrion Hay rasterize, với kết fragment kết hợp vào đệm khung, chúng phát sinh từ liệu hình học 1.3.Thành phần: OpenGL gồm phận hàm: 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 auxiliary(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 mà 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 hoá 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 dĩ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 ký 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 II Cài Đặt OpenGL Trong Dev-C++ Chuẩn bị Dev-C++ 5.4.0 hơn, glut 3.7.6 Download xong ta giải nén Việc bạn copy file glut32.dll vào C:\Windows\System32 Tiếp tục copy file glut.h vào C:\ProgramFiles\DevCpp\MinGW32\include\GL Và thư mục GL chưa có bạn tự tạo copy vào Cuối copy file glut32.lib vào C:\Program Files\Dev-Cpp\MinGW32\lib xong Các bạn mở DevC lên, FileNewProjectEmpty ProjectOK, chọn tab Projectproject options Chọn tab Parameters.Trong mục Linker điền: -lglut32-lglu32-lopeng32-lwinmm-lgdi32 Ok, chuột phải vào biểu tượng project góc phải hình add to Project Chọn file Lab01_Perimitives.cppOK bắt đầu chạy Chương III: Các Thành Phần Cơ Bản Của OPENGL 3.1.Chương trình OpenGL //*filename: hello.c*// //*Chương trình tạo cửa sổ opengl*// #ifdef unix //*Phần dùng để xác định môi trường làm việc bạn*// #include //*Nó xác định bạn biên dịch chương trình unix*// #include “aux.h“ //*hay Windows, với lập trình viên windows bạn có / #define CALLBACK / /*thể bỏ phần bên lấy phần in đậm*// #else #include #include #include #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); return 0; } */ Lệnh auxInitWindow(string); có tác dụng tạo cửa sổ mới, string tiêu đề cửa sổ đó, bạn viết tiều đề tuỳ Chương trình sau biên dịch cửa sổ đóng ngay, windows ta chạy nhanh ta không nhìn thấy hết Sau bắt Window dùng lại chừng giây để quan sát.Cũng với mã lệnh bạn cần thêm dòng lệnh: sleep(số_giây_muốn_xem x 1000);(tức lệnh bắt window tạm dừng vòng phần nghìn giây) 3.2.Xóa hình OpenGL /*filename: clear.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); /*Những dòng lệnh mới*/ glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glFlush(); /*Những dòng lệnh mới*/ Sleep(1000); return 0; } Các lệnh glClearColor(), glClear(),glFush() lệnh Opengl.glClearColor() có nhiệm vụ chọn màu để xoá window, bạn dễ dàng nhận có tham số, tham số RGBA( red green blue alpha).Không giống với hàm RGB() Win32 API , tham số có giá trị khoảng 0.0f đến 1.0f(kiểu float).Ba tham số đầu màu đỏ xanh xanh da trời, tham số thứ độ sáng tối window 3.3.Vẽ hình OpenGL - vẽ số hình đơn giản: /*filename line.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #endif int main(int argc, char *argv[]) { auxInitWindow(argv[0]); glClearColor(1.0,1.0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT); /*những dòng lệnh mới*/ glBegin(GL_LINE_LOOP); glVertex2d(0.1,0.1); glVertex2d(0.9,0.1); glVertex2d(0.9,0.9); glVertex2d(0.1,0.9); /*những dòng lệnh mới*/ glEnd(); glFlush(); Sleep(1000); return 0; } Tất hình khối vẽ opengl nằm hai dòng lệnh glBegin() glEnd() glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); } int main(int argc, char *argv[]) { auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; } 3.6.Quan sát-khung nhìn: Chương trình trên, ta thay đôi kích cỡ có lúc ta không nhìn thấy hình vuông mà vẽ nữa, lại vậy?Câu trả lời nằm chương trình đây: /*filename: view.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #endif GLvoid CALLBACK draw(void){ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); /*hàm mới*/ glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); /*hàm mới*/ } int main(int argc, char *argv[]) { auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; } Nhóm giới thiệu Viewport Viewport xác định cổng nhìn cho chúng ta, tức phần không gian cửa sổ window ma người quan sát phép quan sát Nó hình chữ nhật Hai tham số hàm xác định toạ độ đỉnh phía tay trái hình chữ nhật, hai toạ dộ sau xác định chiều rộng chiều cao hình chữ nhật Với tham số ta thấy , chương trình cho phép ta quan sát toàn hình 3.7.Chuột Trong trò chơi ta thấy quan trọng việc sử dụng chuột, phần xem xét làm để chương trình nhận bấm trái chuột, di chuyển chuột Để làm điều sử dụng hàm auxMouseFunc() Dưới mã nguồn chương trình mouse.cpp /*filename mouse.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #include"stdio.h" /*nếu bạn dòng hàm printf() không thực hiện*/ #endif GLvoid CALLBACK draw(void){ glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK left(AUX_EVENTREC *event) { printf("%d,%d\n",event->data[AUX_MOUSEX],event->data[AUX_MOUSEY]); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w/2,h/2); glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); /*hàm mới*/ auxMouseFunc(AUX_LEFTBUTTON,AUX_MOUSEDOWN,left); /*hàm mới*/ auxMainLoop(draw); return 0; } Trong chương trình , thấy xuất hàm left() hàm auxMouseFunc() Hàm auxMouseFunc() có gọi đến hàm left(), có ý nghĩa rằng, chuột bấm thực hàm left() Trong tham số hàm auxMouseFunc() có tham sô sau: tham số nói đến phần chuột tác động, tham số thứ nói đến tác động nào, tham số cuối muốn nói tác động làm Trong hàm left() tham số có dạng trỏ có kiểu AUX_EVENTREC, lấy liệu toạ độ x y chuột Trong chương trình có hàm auxMouseFunc() mà bạn dùng tuỳ thích, miễn đừng va chạm được, phần mã nguồn có cho thêm chương trình ví dụ cách dùng lần hàm auxMouseFunc()(trong file mouse2.cpp) 3.8.Thể tọa độ chiều Đến ta biết đến toạ độ chiều opengl, có chẳng khác lập trình Window cả.Vì phần xem opengl vẽ hình chiều /*filename : rotated45.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #endif GLvoid CALLBACK draw(void) { glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT); glRotated(45,0.0,1.0,0.0); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0); glVertex2d(0.1,0.9); glEnd(); glFlush(); } GLvoid CALLBACK resize(GLsizei w,GLsizei h) { glLoadIdentity(); glViewport(0,0,w,h); glOrtho(-1.0,1.0,-1.0,1.0,0.0,1.0); } int main(int argc, char *argv[]) { auxInitPosition(200,100,640,480); /*quay quanh trục OY 45 độ*/ auxInitDisplayMode(AUX_RGBA); auxInitWindow(argv[0]); auxReshapeFunc(resize); auxMainLoop(draw); return 0; } Chương trình đặc biệt hàm glRotated() , hàm cho phép quay hình tứ giác quanh trục OY với góc quay 45 độ.Tham số góc quay, tham số sau tham số vector mà hình quay với góc quay trên.Ta nhận thấy giá trị vector : toạ độ x 0, toạ độ y 1, toạ độ z Tức véctơ thẳng đứng theo trục OY, ta thay đổi thông số vector để kiểm nghiệm hàm xem Các giá trị thông số kiểu double.(Chú ý không thử thông số khác bạn khó để quan sát hàm hoạt động ) 3.9.Sử dụng ánh sáng OpenGL Để xác định mặt chiếu sáng với cường độ sáng bao nhiêu, người ta dùng véc tơ pháp tuyến (normal vector) Trong chương trình giới thiệu cách dùng véc tơ Mã nguồn: /*filename: light1.cpp*/ #ifdef unix #include #include "aux.h" #define CALLBACK #else #include #include #include #endif #include GLdouble vertex[][3]={ {0.0,0.0,0.0}, {1.0,0.0,0.0}, {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0} }; int face[][4]={ {0,1,2,3}, {1,5,6,2}, {5,4,7,6}, {4,0,3,7}, {4,5,1,0}, {3,2,6,7} }; GLdouble normal[][3]={ {0.0,0.0,-1.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}, {-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,1.0,0.0} }; GLvoid CALLBACK none(void) { } GLvoid CALLBACK draw(void) { int i,j; static int r=0; glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(3.0,4.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glRotated((double)r,0.0,1.0,0.0); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); /*tham số mới*/ glEnable(GL_LIGHT0); /*tham số mới*/ glBegin(GL_QUADS); for(i=0;i[...]... đến 1 Chú ý là chương trình trên chúng ta đã đổi tham số mới cho hàm glBegin(), bây giờ nó sẽ vẽ một tứ giác, và trong chương trình này thì là một hình vuông.Trong phần này nhóm tôi muốn trình bày một kỹ thuật nữa, chương trình trên chỉ cho chúng ta nhìn thấy một màu đỏ do chúng ta đặt một màu duy nhất trước khi vẽ Để có thể tạo nhiều màu ấn tượng bạn có thể cài đặt đi cài đặt lại hàm glColor3d() mỗi... auxReshapeFunc(), tham số của nó cũng là con trỏ chỉ đến hàm mà chúng ta có thể thay đôi thông số của cửa sổ, tham số của nó trong chương trình này là hàm resize() Nếu bạn đã học qua về đồ hoạ máy tính thì sẽ dễ dàng hiểu về toạ độ trong đồ hoạ, hàm glLoadIdentity() có nhiệm vụ thiết định ma trận của toạ độ là ma trận đơn vị Mã nguồn dưới đây sẽ cho chúng ta rõ hơn: /*filename: interface.cpp*/ #ifdef unix #include... glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); /*tham số mới*/ glVertex2d(0.1,0.1); glVertex2d(0.9,0.1); glVertex2d(0.9,0.9); glVertex2d(0.1,0.9); glEnd(); glFlush(); Sleep(1000); return 0; } Hàm auxInitDisplayMode() báo với window rằng chúng ta chọn cách hiển thị những gì mà chúng ta sắp vẽ tới đây, tham số của nó là AUX_RGBA chính là mode RGBA mà nhóm chúng tôi đề cập ở trên Hàm glColor3d() cho phép chúng ta chọn... ///*chú ý bạn có thể không cần chữ void //*khi lập trình với VC, Glvoid là kiểu */ glClear(GL_COLOR_BUFFER_BIT);//*hàm trong opengl, nó tương tụ */ glClearColor(0.0,0.0,0.0,0.0); //*như void trong C hay C++* / glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_QUADS); glColor3d(1.0,0.0,0.0); glVertex2d(0.1,0.1); glColor3d(0.0,1.0,0.0); glVertex2d(0.9,0.1); glColor3d(0.0,0.0,1.0); glVertex2d(0.9,0.9); glColor3d(1.0,0.0,1.0);... auxReshapeFunc(resize); auxIdleFunc(draw); glCullFace(GL_BACK); auxMainLoop(none); return 0; } Thông số mới trong hàm glEnable() và glDisable(), các thông số này cho phép chúng ta sử dụng ánh sáng trong khi tạo đồ vật Opengl cung cấp cho chúng ta 8 nguồn sáng mà chương trình trên mới chỉ sử dụng một nguồn sáng LIGHT0, hàm glNormal3dv() thiết lập véc tơ pháp tuyến cho mỗi mặt chúng ta vẽ, vì thế khi vật thể quay... chúng ta không sử dụng màu nên màu sẽ được xác định là màu mặc định như các bạn đã thấy Tiếp theo đây tôi xin giới thiệu cách sử dụng vật liệu để tạo vật với các màu sắc ấn tượng khác nhau.Chúng ta khai báo dữ liệu sau: GLfloat GLfloat GLfloat GLfloat ambient[]={ 0.2,0.2,0.2,1.0}; diffuse[]={ 0.8,0.0,0.0,1.0}; specular[]={0.5,0.5,0.5,1.0}; shininess=40.0; Trong đó các thông số trên đều được đặt theo hệ... trường bên ngoài, diffuse là độ khuếch tán, specular là độ phản xạ và shininess là độ bóng(độ bóng sáng) Các thông số trên được hàm glMaterial*() sử dụng để tạo vật thể của chúng ta.Hãy quan sát cách khai báo hàm trên: glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);