Giải thuật vùng đệm độ sâu (Z-Buffer)

Một phần của tài liệu GiaoTrinhDoHoaMayTinh-Phuong-Tao-Quynh-New - Copy (Trang 116 - 119)

5. TỔNG QUAN VỀ MỘT HỆ ĐỒ HỌA

7.2.3. Giải thuật vùng đệm độ sâu (Z-Buffer)

Bằng cách tính giá trị độ sâu (là giá trị Z trong hệ toạ độ quan sát) của mỗi điểm trong tất cả các mặt đa giác, tại mỗi điểm trên mặt phẳng chiếu cĩ thể cĩ ảnh của nhiều điểm trên nhiều mặt đa giác khác nhau, song hình vẽ chỉ được thể hiện hình ảnh của điểm cĩ độ sâu thấp nhất ( tức là điểm ở gần nhất). Với cách thực hiện này giải thuật cĩ thể khử được tất cả các trường hợp mà các giải thuật khác mắc phải.

Giới hạn của phương pháp này là địi hỏi nhiều bộ nhớ và thực hiện nhiều tính tốn. Z- Buffer là một bộ đệm dùng để lưu độ sâu cho mỗi pixel trên hình ảnh của vật thể, thơng thường ta tổ chức nĩ là một ma trận hình chữ nhật. Nếu dùng 1 byte để biểu diễn độ sâu của một pixel, thì một vật thể cĩ hình ảnh trên mặt phẳng chiếu là 100x100 sẽ cần 10000 byte dùng để làm Depth Buffer, và khi đĩ vùng đệm độ sâu sẽ cho phép ta phân biệt được 256 mức sâu khác nhau, điều này cĩ nghĩa là nếu cĩ 257 pixel ở 257 độ sâu khác nhau thì khi đĩ buột ta phải quy 2 pixel nào đĩ về cùng một độ sâu. Nếu ta dùng 4 byte để biểu diễn độ sâu của một pixel, thì khi đĩ vùng đệm độ sâu sẽ cho phép ta phân biệt được 4294967296 (232) mức sâu khác nhau, song lúc đĩ sẽ phải cần 40000 byte cho một bộ đệm kích thước 100x100. Do tính chất 2 mặt này nên tuỳ vào tình huống và yêu cầu mà ta cĩ thể tăng hay giảm số byte để lưu giữ độ sâu của 1 pixel. Và thơng thường người ta dùng 4 byte để lưu giữ độ sâu của một điểm, khi đĩ thì độ chính xác rất cao.

Một câu hỏi cĩ thể đặt ra là làm sao cĩ thể tính độ sâu của mỗi điểm trong đa giác. Ở đây cĩ 2 phương pháp: phương pháp trực tiếp và phương pháp gián tiếp.

• Phương pháp trực tiếp sẽ tính độ sâu của mỗi điểm dựa vào phương trình mặt phẳng chứa đa giác. Với phương pháp này chúng ta cần duyệt qua tất các điểm của đa giác (tất nhiên chỉ hữu hạn điểm), bằng cách cho các thành phần x và y, nếu cặp giá trị (x,y) thoả trong miền giới hạn của đa giác thì chúng ta sẽ tìm thành phần thứ 3 là z bằng cách thay thế x và y vào phương trình mặt phẳng để tính ra thành phần z. Về mặt tốn học thì phương pháp trực tiếp rõ ràng là rất khoa học, song khi áp dụng ta sẽ gặp phải vướng mắc:

Cần phải tính bao nhiêu điểm để hình ảnh thể hiện của đa giác lên mặt phẳng chiếu đủ mịn và cũng khơng bị tình trạng quá mịn (tức là vẽ rất nhiều điểm chồng chất lên nhau khơng cần thiết mà lại gây ra tình trạng chậm chạp và tăng độ phức tạp tính tốn. Cũng nên nhớ rằng khi thể hiện một đa giác lên mặt phẳng chiếu thì ảnh của nĩ cĩ thể được phĩng to hay thu nhỏ).

• Phương pháp gián tiếp: Chúng ta sẽ tính độ sâu của một điểm gián tiếp thơng qua độ sâu của các điểm lân cận. Để thực hiện chúng ta tiến hành theo các bước sau:

Gọi G là một mặt đa giác được biểu diễn bởi tập các điểm P1, P2, … Pn và G’ là hình chiếu của G xuống mặt phẳng chiếu với tập các đỉnh P1’,P2’,… Pn’.

Để thể hiện hình ảnh của G lên mặt phẳng chiếu thì rõ ràng là chúng ta phải tiến hành tơ đa giác G’. Song như thuật tốn đã phát biểu, chúng ta cần xác định xem mỗi điểm M’ bất kỳ thuộc G’ là ảnh của điểm M nào trên G và dựa vào độ sâu của M để so sánh với độ sâu đã cĩ trong z-buffer để quyết định là cĩ vẽ điểm M’ hay khơng. Nếu ta gán thêm cho các điểm ảnh một thành phần nữa, đĩ là giá trị độ sâu của điểm tạo ảnh (tức là điểm đã tạo ra điểm ảnh sau phép chiếu) thì lúc này ta khơng cần thiết phải xác định M để tính độ sâu, mà ta cĩ thể tính được giá trị độ sâu này qua cơng thức sau:

Nếu M’ nằm trên đoạn thẳng P’Q’ với tỷ lệ là: P’M’/P’Q’=t và nếu biết được độ sâu của P’ và Q’ lần lượt là z(P’) và z(Q’) thì độ sâu mà điểm ảnh M’ nhận được là

z(M’)=z(P’)+(z(Q’)-z(P’))t (7.1)

Ta cĩ thể sử dụng được cơng thức trên với tất cả các phép chiếu cĩ bảo tồn đường thẳng. Từ đĩ ta cĩ thể xác định quy trình vẽ đa giác G’ là ảnh của G như sau: Gán thêm cho mỗi điểm đỉnh của đa giác G’ một thành phần z cĩ giá trị bằng độ sâu của điểm tạo ảnh. Cĩ nghĩa là P’1 sẽ chứa thêm giá trị z(P1), P’2 sẽ chứa thêm giá trị z(P2), hay một cách tổng quát P’i sẽ chứa thêm giá trị z(Pi) với i=1..n.

Tiến hành tơ đa giác G’ theo một quy trình tương tự như thuật tốn tơ đa giác theo dịng quét. Cĩ nghĩa là cho một dịng quét chạy ngang qua đa giác, tại mỗi vị trí bất kỳ của dịng quét, chúng ta tiến hành tìm tập các giao điểm của dịng quét với đa giác. Gọi {xm} là tập các giao điểm, một điều cần chú ý là ta cần tính độ sâu cho các giao điểm này. Giả sử xi là giao điểm của đường quét với cạnh Pi’Pj’ thế thì ta cĩ thể tính ra độ sâu của xi thơng qua cơng thức (6.1) như sau:

Nếu gọi yscan là giá trị tung độ của dịng quét thế thì:

z(xi) = z(Pi’)+z(Pj’)*[(yscan – y(Pi’))/(y(Pj’)-y(Pi’))] (7.2) {trong đĩ y(P) là thành phần toạ độ y của điểm P}

Rõ ràng qua cơng thức trên ta thấy, nếu xi là trung điểm của Pi’Pj’ thì z(xi) = z(Pi’)+z(Pj’)*1/2.

BÀI TẬP

1. Viết chương trình cài đặt giải thuật Depth-Sorting để biểu diễn và quan sát vật thể 3D theo mơ hình "các mặt đa giác".

TÀI LIỆU THAM KHẢO

[1]. Francis S. Hill , Computer Graphics, 1990 (Vol. I & II).

[2]. Nguyễn Xuân Huy, Giáo trình Đồ hoạ Máy tính, Trường Đại học Bách Khoa Hà Nội, 1994.

[3]. Phan Hữu Phúc, Cơ sởĐồ hoạ Máy tính, NXB Giáo dục Hà Nội, 1998.

[4]. Lê Tấn Hùng, Huỳnh Quyết Thắng, Kỹ thuật đồ họa, Nhà xuất bản khoa học và kỹ thuật, Hà nội, 2000.

Một phần của tài liệu GiaoTrinhDoHoaMayTinh-Phuong-Tao-Quynh-New - Copy (Trang 116 - 119)