Bài giảng Đồ họa máy tính - Chương 8: Tô màu vật thể 3 chiều
Giới thiệu
Mô hình tô màu
Sử dụng nguồn sáng
Tô màu phẳng, tô màu trơn
Dán texture lên mặt đa giác
Tóm tắt nội dung Bài giảng Đồ họa máy tính - Chương 8: Tô màu vật thể 3 chiều, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ĐỒ HỌA MÁY TÍNH Trường Đại Học Bách Khoa TP Hồ Chí Minh Khoa Khoa học & Kỹ thuật Máy tính CHƯƠNG 8: TÔ MÀU VẬT THỂ 3 CHIỀU NỘI DUNG TRÌNH BÀY Giới thiệu Mô hình tô màu Sử dụng nguồn sáng Tô màu phẳng, tô màu trơn Dán texture lên mặt đa giác GIỚI THIỆU Tập trung vào tính toán màu sắc cho pixel Dựa vào mô hình màu ( mô hình hóa việc ánh sáng tương tác với đối tượng ) Không mô phỏng hết các nguyên lý vật lý của sự phát tán và phản xạ ánh sáng Đưa ra mô hình mang tính xấp xỉ và tạo nên nhiều mức độ chân thực khác nhau GIỚI THIỆU Mô hình khung dây ( wireframe ) đơn giản , chỉ có các cạnh được vẽ nhìn xuyên qua vật thể , khó phân biệt được vật thể GIỚI THIỆU Line Drawing: mô hình khung dây với các mặt khuất được loại bỏ . chỉ có các cạnh được vẽ nhìn giống khối rắn , phân biệt được vật thể GIỚI THIỆU Tô màu phẳng (flat shading): ánh sáng phản xạ được tính tại một điểm bất kỳ các điểm thuộc mặt được tô bởi một màu thấy rõ ranh giới giữa các mặt GIỚI THIỆU Tô màu mượt (smooth shading): màu được tính ở một số điểm , sau đó nội suy cho các điểm còn lại . ranh giới giữa các mặt biến mất a/s phản chiếu GIỚI THIỆU Tạo bóng đổ , dán texture lên bề mặt đối tượng MÔ HÌNH TÔ MÀU Nguồn sáng không màu có nhiều mức xám Nguồn sáng điểm và nguồn sáng nền Ánh sáng tới tương tác với bề mặt theo 3 cách : (a) hấp thụ chuyển thành nhiệt , (b) phản xạ , (c) truyền vào trong Thành phần ánh sáng phản xạ A/s khuyếch tán : phát tán theo mọi hướng , tương tác mạnh với bề mặt , màu sắc phụ thuộc vào màu sắc vật thể A/s phản chiếu : tính định hướng cao , không đi vào vật thể , phản xạ ở bề mặt vật thể , tăng độ sáng bề mặt đối tượng , màu giống màu a/s tới MÔ HÌNH TÔ MÀU Yếu tố hình học để xác định ánh sáng phản xạ vector pháp tuyến m của bề mặt vector v từ P đến mắt nhìn vector s từ P đến nguồn sáng MÔ HÌNH TÔ MÀU Thành phần ánh sáng khuyếch tán phần ánh xạ phản xạ đến được mắt nhìn , ký hiệu I d khuyếch tán đồng nhất theo mọi hướng chỉ phụ thuộc m, s. định luật Lambert: I s : cường độ n/s , ρ d : h/s p/x khuyếch tán MÔ HÌNH TÔ MÀU Thành phần ánh sáng khuyếch tán Ví dụ : hệ số p/x khuyếch tán 0, 0.2, 0.4, 0.6, 0.8, 1.0. Cường độ nguồn sáng là 1, cường độ a/s nền 0.4 MÔ HÌNH TÔ MÀU Thành phần ánh sáng phản chiếu tăng độ sáng , tăng mức độ chân thực cho đối tượng có đặc tính sáng bóng . lượng ánh sáng phản xạ lớn ở hướng p/x r. f : [1, 200] MÔ HÌNH TÔ MÀU Thành phần ánh sáng phản chiếu f vô cùng : tập trung chủ yếu ở hướng p/x Giảm tg tính toán , dùng vector nửa đường h = s + v. = 0, nhìn thấy lượng a/s phản chiếu nhiều nhất MÔ HÌNH TÔ MÀU Thành phần ánh sáng phản chiếu hệ số s từ trên xuống là 0.25, 0.5, 0.75. Hệ số f từ trái sang phải là 3, 6, 9, 25, 200. MÔ HÌNH TÔ MÀU Ánh sáng nền : khắc phục hiện tượng phần không nhận được a/s có màu đen hoàn toàn , thêm a/s nền . không có vị trí cố định , chiếu sáng đồng nhất theo mọi hướng Thêm I a : cường độ , a : hệ số phản chiếu nền a : 0.0, 0.1, 0.3, 0.5, 0.7: càng lớn khung cảnh càng sáng MÔ HÌNH TÔ MÀU Tổng hợp các thành phần ánh sáng Thêm màu sắc MÔ HÌNH TÔ MÀU Chỉ định camera, nguồn sáng , vector pháp tuyến đỉnh Sau khi thực hiện phép biến đổi mô hình – phép nhìn , tất cả được biểu diễn trong hệ tọa độ camera glBegin(GL_POLYGON ); for(int i = 0; i< 3; i++){ glNormal3f(norm[i].x, norm[i].y , norm[i].z ); glVertex3f(pt[i].x, pt[i].y , pt[i].z );} glEnd (); SỬ DỤNG NGUỒN SÁNG Tạo nguồn sáng - vị trí GLfloat myLightPosition [] = {3.0, 6.0, 5.0, 1.0}; glLightfv(GL_LIGHT0, GL_POSITION, myLightPosition ); glEnable(GL_LIGHTING ); //enable glEnable(GL_LIGHT0);//enable this particular source ( x , y , z , 1) nguồn sáng điểm , ( x , y , z , 0)n/s định hướng - màu sắc GLfloat amb0[] = {0.2, 0.4, 0.6, 1.0}; GLfloat diff0[] = {0.8, 0.9, 0.5, 1.0}; GLfloat spec0[] = {1.0, 0.8, 1.0, 1.0}; glLightfv(GL_LIGHT0, GL_AMBIENT, amb0); glLightfv(GL_LIGHT0, GL_DIFFUSE, diff0); glLightfv(GL_LIGHT0, GL_SPECULAR, spec0); SỬ DỤNG NGUỒN SÁNG Nguồn sáng dạng đèn pha glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); // góc cắt bằng 450 glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 4.0); // = 4.0 GLfloat dir[] = {2.0, 1.0, -4.0}; // hướng của nguồn sáng glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); Suy giảm ánh sáng theo khoảng cách glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0); GL_LINEAR_ATTENUATION và GL_QUADRATIC_ATTENUATION SỬ DỤNG NGUỒN SÁNG Chỉ định thuộc tính vật liệu GLfloat myDiffuse [] = {0.8, 0.2, 0.0, 1.0}; glMaterialfv(GL_FRONT, GL_DIFFUSE, myDiffuse); GL_BACK, GL_FRONT_AND_BACK GL_AMBIENT, GL_SPECULAR,GL_EMISSION TÔ MÀU PHẲNG, TÔ MÀU TRƠN Tô màu mặt đa giác di chuyển theo các đường quét , xác định màu cho mỗi pixel. đa giác lồi hiệu quả vì mỗi đường quét chỉ cắt đa giác tối đa ở 2 điểm for ( int y = ybott ; y <= ytop ; y++) { find xleft and xright ; for ( int x = xleft ; x <= xright ; x++) { find the color c for this pixel; put c into the pixel at (x, y) ; } } TÔ MÀU PHẲNG, TÔ MÀU TRƠN Tô màu phẳng : nguồn sáng ở xa , mặt là đa giác phẳng các điểm thuộc mặt có cùng màu sắc glShadeModel(GL_FLAT ); for ( int y = ybott ; y <= ytop ; y++) { find xleft and xright ; find the color c for this scan line; for ( int x = xleft ; x <= xright ; x++) { put c into the pixel at (x, y) ; } } TÔ MÀU PHẲNG, TÔ MÀU TRƠN Tô màu Gouraud : color left = lerp( color 1 , color 4 , f ), for ( int y = ybott ; y <= ytop ; y++){ find xleft and xright ; find colorleft and colorright ; colorinc = ( colorright – colorleft )/ ( xright – xleft ) for ( int x = xleft , c = colorleft ; x <= xright ; x++, c += colorinc ) { put c into the pixel at (x, y); } } TÔ MÀU PHẲNG, TÔ MÀU TRƠN Tô màu Gouraud : glShadeModel(GL_SMOOTH ); TÔ MÀU PHẲNG, TÔ MÀU TRƠN Tô màu Phong : chậm hơn nhiều so với phương pháp tô màu Gouraud OpenGL không hỗ trợ phương pháp tô màu này DÁN TEXTURE LÊN MẶT ĐA GIÁC DÁN TEXTURE LÊN MẶT ĐA GIÁC Có hai loại texture: texture bitmap và texture được tạo bằng giải thuật Color3 texture(float s, float t){ return txtr[(int)(s * C)][(int)(t *R)];} float fakeSphere(float s, float t){ float r = sqrt((s - 0.5)*(s - 0.5) + (t - 0.5)*(t - 0.5)); if (r < 0.3) return 1- r/0.3; else return 0.2; } DÁN TEXTURE LÊN MẶT ĐA GIÁC Các bước để dán texture lên bề mặt đọc hoặc tạo dữ liệu texture vào mảng textureData tạo đối tượng texture: glGenTextures(1, & textureObject ); gán kiểu texture glBindTexture(GL_TEXTURE_2D, textureObject ); gán số liệu cho đối tượng texture glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, wid , height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureData ); DÁN TEXTURE LÊN MẶT ĐA GIÁC Các bước để dán texture lên bề mặt lựa chọn texture: glBindTexture(GL_TEXTURE_2D, textureObject ); gán tọa độ texture cho các đỉnh của đa giác glBegin(GL_QUADS ); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, 2.5, 1.5); glTexCoord2f(0.0, 0.6); glVertex3f(1.0, 3.7, 1.5); glTexCoord2f(0.8, 0.6); glVertex3f(2.0, 3.7, 1.5); glTexCoord2f(0.8, 0.0); glVertex3f(2.0, 2.5, 1.5); glEnd (); DÁN TEXTURE LÊN MẶT ĐA GIÁC Ứng dụng của texture Tạo đối tượng phát sáng Điều chỉnh hệ số phản xạ Mô phỏng sự gồ ghề bằng phép ánh xạ Bump
File đính kèm:
- bai_giang_do_hoa_may_tinh_chuong_8_to_mau_vat_the_3_chieu.ppt