Chương 2 : CÁC THUẬT TOÁN TÔ MÀU
7.3. Phương pháp dùng vùng đệm độ sâu (Depth-Buffer Method)
Một tiếp cận không gian ảnh được dùng phổ biến để khử mặt khuất là phương pháp vùng đệm độ sâu, còn được gọi là phương pháp z-buffer. Một cách cơ bản, thuật tốn này kiểm tra tính nhìn thấy được của các mặt mỗi lần một điểm. Với mỗi vị trí pixel (x,y) trên mặt phẳng quan sát, mặt nào có giá trị tọa độ z nhỏ nhất ở vị trí
pixel đó thì nhìn thấy được. Hình 7-4 trình bày ba mặt có độ sâu khác nhau, với sự quan tâm đến vị trí (x, y) trong hệ quan sát bàn tay trái. Mặt S1 có giá trị z nhỏ nhất ở vị trí này vì vậy giá trị độ sáng ở (x, y) được lưu.
Hai vùng đệm được cần để cài đặt phương pháp này. Một vùng đệm độ sâu
(depth buffer) được dùng để lưu trữ các giá trị z cho mỗi vị trí (x, y) của các mặt được so sánh. Vùng đệm thứ hai là vùng đệm làm tươi (refresh buffer) (hay còn gọi là vùng
đệm khung), lưu giữ các giá trị độ sáng cho mỗi vị trí (x, y).
Phương pháp này có thể được thực hiện hiệu quả trong các hệ tọa độ chuẩn, với
các giá trị độ sâu thay đổi từ 0 đến 1. Giả sử rằng một không gian chiếu (projection
volume) được ánh xạ vào một khơng gian quan sát hình hộp chuẩn, ánh xạ của mỗi mặt lên mặt phẳng quan sát là một phép chiếu trực giao. Độ sâu của các điểm trên bề mặt của một đa giác được tính từ phương trình mặt phẳng. Ban đầu, tất cả các vị trí
trong vùng đệm độ sâu được đặt giá trị 1 (độ sâu lớn nhất), và vùng đệm làm tươi được khởi tạo giá trị của độ sáng nền. Mỗi mặt (đã được lập danh sách trong các bảng đa
giác (polygon tables)) sau đó được xử lý. Mỗi lần một đường quét (scane line), tính độ sâu, hoặc giá trị z, ở mỗi vị trí (x, y). Giá trị z vừa được tính xong sẽ được so sánh với các giá trị lưu trữ trước đó trong vùng
đệm độ sâu ở vị trí đó. Nếu giá trị z
vừa được tính xong nhỏ hơn các giá
trị trước đó, giá trị z mới sẽ được lưu, và độ sáng của mặt ở vị trí đó cũng được cập nhật lại vào vị trí tương ứng
trong vùng đệm làm tươi.
Hình 7-4
Ở ví trí (x, y), mặt S1 có giá độ sâu nhỏ nhất và
thế được nhìn thấy ở ví trí đó vì • • • • x yv zv v S3 S2 S1
Chương 7: Khử các mặt kuất và đường khuất
Chúng ta có thể tổng kết các bước của thuật toán vùng đệm độ sâu như sau:
1. Khởi tạo vùng đệm độ sâu và vùng đệm làm tươi để với tất cả các vị trí
(x,y), depth(x, y) =1 và refresh(x, y) = background.
2. Đối với mỗi vị trí trên mỗi mặt, so sánh các giá trị độ sâu với các giá trị độ
sâu được lưu trước đó trong vùng đệm độ sâu để xác định tính chất nhìn
thấy được.
a. Tính giá trị z cho mỗi vị trí (x, y) trên mặt.
b. Nếu z < depth(x, y) thì đặt lại depth(x, y)= z và refresh(x, y) = i , với
i là giá trị độ sáng trên mặt ở vị trí (x, y).
Trong bước cuối cùng, nếu z không nhỏ hơn giá trị trong vùng đệm độ sâu ở vị trí đó,
điểm khơng được nhìn thấy. Khi q trình này được hồn thành cho tất cả các mặt,
vùng đệm độ sâu chứa các giá trị z của các mặt nhìn thấy được và vùng đệm làm tươi chỉ chứa các giá trị độ sáng của các mặt nhìn thấy được đó.
Các giá trị độ sâu cho một vị trí (x, y) được tính từ phương trình của mỗi mặt:
C D By Ax z = − − − (7-3)
Với mỗi đường quét bất kỳ (xem hình 7-5), các tọa độ x trên cùng đường quét sai khác nhau 1, và các giá trị y giữa hai đường quét cũng sai khác nhau 1. Nếu độ sâu của vị trí (x,y) được xác định là z, khi đó độ sâu z’ của vị trí kế tiếp (x+1, y) dọc theo theo đường quét có được từ phương trình 13-3 như
sau: Hình 7-5 Từ vị trí (x, y) trên một đường quét, vị
trí kế tiếp qua phải có tọa độ (x+1, y), và vị trí liền ngay bên dưới trên dịng kế tiếp có tọa độ (x, y-1)
y x y y-1 x x+1 • • • C D By x A z = − ( +1)− − ' hoặc C A z z'= − (7-4)
Chương 7: Khử các mặt kuất và đường khuất
Tỷ số A/C khơng đổi với mỗi mặt, vì vậy giá trị độ của điểm kế tiếp trên cùng đường quét có được từ giá trị trước đó với một phép trừ.
Chúng ta thu được các giá trị độ sâu giữa các đường quét theo cách tương tự. Một lần nữa giả sử rằng vị trí (x, y) có độ sâu z. Khi đó ở vị trí (x, y-1) trên đường quét ngay bên dưới, giá trị độ sâu được tính từ phương trình mặt phẳng như sau:
C D y B Ax z − − − − = ( 1) '' hoặc (7-5) C B z z ''= +
ở đây cần một phép cộng hằng B/C với giá trị độ sâu z trước đó.
Phương pháp vùng đệm độ sâu thì dễ dàng để cài đặt, và nó khơng cần sắp xếp các mặt trong ảnh. Nhưng nó cần đến một vùng đệm thứ hai đó là vùng đệm làm tươi. Một hệ thống với độ phân giải 1024 x 1024 có thể cần hơn một triệu vị trí trong vùng
đệm độ sâu, với mỗi vị trí cần đủ bit để lưu giữ các tọa độ z tăng. Một cách để giảm
bớt không gian lưu giữ cần thiết là tại mỗi thời điểm chỉ xử một phần của ảnh, dùng một vùng độ sâu nhỏ hơn. Sau mỗi phần ảnh được xử lý xong, vùng đệm được dùng
lại cho phần kế tiếp.