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

