Kỹ thuật tạo bóng Z-Fail

Một phần của tài liệu nghiên cứu một số kỹ thuật tạo bóng khối trong đồ họa ba chiều (Trang 56)

Z - Fail là thuật toán tạo bóng đổ bằng bóng khối phổ biến nhất hiện nay, nó

một mặt khắc phục được nhược điểm chính của Z - Pass không thể hiện được đúng khi điểm nhìn nằm trong khối bóng, nhưng đồng thời cũng không yêu cầu nhiều tính toán khác trên CPU, hầu như nó chỉ yêu cầu nhiều hơn thời gian tính toán trên

GPU.

Tư tưởng của thuật toán:

+ Vẽ các mặt sau (back face) của shadow volume. Nếu độ sâu của điểm ảnh so sánh thất bại (thường là giá trị lớn hơn giá trị trong depth buffer), giá trị của stencil buffer tại điểm đó sẽ tăng lên 1.

+ Vẽ các mặt trước (front face) của shadow volume. Nếu độ sâu của điểm ảnh so sánh thất bại, giá trị của stencil buffer giảm đi 1.

Sau khi vẽ bóng khối bằng thuật toán trên tất cả các điểm trong bối cảnh bị phủ bởi bóng tối có giá trị trong stencil buffer khác 0 trong khi các điểm khác thì bằng 0. Sau đây là hình vẽ minh họa cho thuật toán dựng bóng tối (z-fail)

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

48

Hình 2.18. Thuật toán tạo bóng khối với kỹ thuật z-fail

Trong hình vẽ trên vật màu cam biễu diễn cho vật thể nhận bóng tối, vật màu xanh là vật thể chắn sáng. Các khu vực A, B, C, D, E là 5 khu vực sẽ được dựng hình mà có sự ảnh hưởng của shadow volume. Các giá trị ở các vùng là giá trị trong stencil buffer thay đổi khi mặt trước (front face) hay mặt sau (back face) của bóng khối được vẽ vào frame hình. Tại khu vực A và E, mặt trước và sau khi vẽ đều khiến giá trị trong stencil buffer không đổi do trong 2 khu vực này vật nhận bóng tối (màu cam) và vật chắn sáng (màu xanh) gần mắt hơn nên làm cho việc kiểm tra độ sâu thất bại khiến giá trị trong stencil buffer trung hòa về 0. Trong khu vực B và D, mặt trước sẽ vượt qua sự kiểm tra độ sâu trong khi mặt sau thì thất bại, vì thế giá trị stencil tại các vùng này sẽ mang giá trị 1 (do chỉ có mặt sau làm stencil buffer thay đổi mà thôi). Ở khu vực C, cả mặt trước và sau đều vượt qua sự kiểm tra độ sâu, nên không làm cho giá trị trong stencil thay đổi. Khi kết thúc quá trình vẽ bóng khối thì stencil ở khu vực B, D khác 0, cho thấy B và D nằm trong vùng bóng tối của vật chắn sáng.

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

49

Cuối cùng ta chỉ cần phủ tối vùng B, D bằng cách vẽ một tứ giác lớn bao phủ toàn bộ bối cảnh là kết thúc thuật toán. [4], [5]

Tư tưởng chính của Z-Fail được thể hiện thông qua “Hình 2.18”. Từ điểm nhìn vẽ các đường thẳng vào không gian, chỉ xét đường thẳng từ điểm nó đã va chạm với bề mặt của mội đối tượng nào đó, khi đường thẳng gặp một mặt phẳng có hướng vector pháp tuyến ngược với hướng nhìn (tích vô hướng của hai vector là nhỏ hơn 0) thì tăng giá trị lên 1, và mặt phẳng ở phía kia thì trừ giá trị đi 1 đơn vị. Kết quả những đường thẳng có giá trị lớn hơn 0 thì có nghĩa điểm trên tia nhìn đó là điểm thuộc khu vưc đổ bóng (điểm có bóng đổ).

Hình 2.18. Tư tưởng của Z-Fail

Với tư tưởng như vậy cách thể hiện của Z-Fail trái ngược với Z-Pass. Nó chỉ kiểm tra những điểm trên bề mặt của khối bóng có khoảng cách tới điểm nhìn là lớn hơn giá trị trong bộ đệm Z-Buffer.

Các bước thực hiện như sau:

Bƣớc 1: Tính đường Silhouette.

Bƣớc 2: Vẽ mô hình bằng các thuật toán tô bóng cục bộ.

Bƣớc 3: Thiết lập các giá trị ban đầu cho Stencil Buffer là 0. Tắt việc cập nhật các giá trị vào các bộ đệm khác chỉ để các giá trị được cập nhật vào Stencil

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

50

Buffer. Tắt hết các hiệu ứng môi trường, để chế độ tô bóng về chế độ đơn giản nhất

nhằm tăng tốc độ render. Thiết lập Depth TestDepth-Fail.

Bƣớc 4: Vẽ các đa giác của khối bóng có hướng vector pháp tuyến mà tích vô hướng của nó với hướng nhìn < 0. Với lựa chọn cập nhật Stencil Buffer là tăng thêm một đơn vị.

Bƣớc 5: Vẽ các đa giác của khối bóng có hướng vector pháp tuyến mà tích vô hướng của nó với hướng nhìn > 0. Với lựa chọn cập nhật Stencil Buffer là giảm đi một đơn vị.

Khối bóng được tạo thành từ các đa giác tạo bởi từng đoạn thằng thành phẩn của đường Silhouette và hướng nguồn sáng (ra đến một giá trị vô cùng lớn). Và các đa giác đậy hai đầu các theo đường Silhouette. Các đa giác đậy hai đầu có thể xây dựng được bằng hai cách: một là sử dụng chính các đa giác cấu thành bề mặt đối tượng (các đa giác có hướng pháp tuyến mà tích vô hướng giữa pháp tuyến đó với hướng nguồn sáng đến đa giác là > 0) hai là sử dụng các đa giác được tạo thành khi tam giác hóa đường Silhouette. Tùy vào từng yêu cầu cụ thể có thể cân nhắc việc sử dụng các cách trên.

Bƣớc 6: Sau khi vẽ hoàn tất các khối bóng ta được dữ liệu trong bộ đệm

Stencil Buffer là các giá trị, các giá trị này phản ánh tính chất của từng điểm. Với điểm có giá trị > 0 có nghĩa nó có bóng đổ và ngược lại. Việc còn lại là kết hợp các giá trị trên bộ đệm này với bộ đệm màu là kết qua từ bước hai.

Nhìn chung Z-Fail phải thực hiện cập nhật Stencil Buffer nhiều hơn so với

Z-Pass vì nó sử dụng lựa chọn cập nhật khi khoảng cách tại điểm đang xét là lớn

hơn giá trị ghi trong Depth Buffer.

Các thuật toán vẽ bóng đổ cũng có một vài cải tiến ví dụ cải tiến nhằm khắc phục lỗi của Z-Pass, các cải tiến xung quanh việc tam giác hóa đường Silhouette

nhằm thể hiện đúng nhất bóng của đối tượng mà không phải vẽ cả phần nửa bề mặt đối tượng (phần có vector pháp tuyến mà tích vô hướng của nó với hướng ánh sáng là lớn hơn 0). Xa hơn nữa trong việc nâng cao chất lượng bóng người ta cũng có

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

51

những phương pháp để tạo ra bóng mềm (một loại bóng đổ gần với thực tiến hơn vì mức độ bóng trên đối tượng là liên tục) từ bóng khối [2]

Thuật toán Z-Pass ở trên có một nhược điểm rất lớn là chưa xử lý được trường hợp khi điểm nhìn (viewpoint) nằm ở trong vùng bóng khối. Có 3 giải pháp để xử lý trường hợp này:

Trừ giá trị của Stencil Buffer 1 đơn vị cho phần bóng khối mà điểm nhìn nằm trong (trong trường hợp có nhiều vật thể). Tuy nhiên nếu làm như thế này thì chi phí tính toán sẽ rất đắt.

Tạo một mặt phẳng nằm trước và rất gần điểm nhìn cho mỗi phần bóng khối mà điểm nhìn nằm trong đó. Cách này cũng vậy, khá phức tạp và chi phí tính toán cũng đắt.

Cách thứ 3 là sử dụng thuật toán Z-Fail do. Thay vì tính toán giá trị Stencil bằng việc tăng các mặt trước của bóng khối và giảm giá trị của các mặt sau khi Z-Buffer Pass, toàn bộ quá trình sẽ được thay đổi để đếm từ vô cực thay vì đếm từ điểm nhìn. Vì thế thuật toán này còn gọi là Z-Fails.

Thuật toán Z-fail được thể hiện bằng đoạn mã giả sau:

Procedure IN_SHADOW_TEST // Z-fail

For {tất cả các vật thể cần đổ bóng} do

- Xây dựng danh sách các cạnh viền.

- Tính toán các tứ giác bao quanh bóng khối dựa trên các cạnh viền và từ vị trí của nguồn sáng.

End for

For {Tất cả các mặt trước của bóng khối nhìn từ vị trí của điểm nhìn} do

if Depth test fails then

- Giảm giá trị Stencil Buffer.

End if

End for

For {Tất cả các mặt sau của bóng khối nhìn từ vị trí của điểm nhìn} if Depth test fails then

Số hóa bởi Trung tâm Học liệu http://www.lrc-tnu.edu.vn/

52

- Tăng giá trị Stencil Buffer.

End if

End for

Một phần của tài liệu nghiên cứu một số kỹ thuật tạo bóng khối trong đồ họa ba chiều (Trang 56)

Tải bản đầy đủ (PDF)

(75 trang)