Danh sách cạnh viền

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 42)

Mỗi vật thể đối với mỗi nguồn sáng sẽ có một bóng khối. Để đơn giản ta sẽ chỉ xét với một nguồn sáng duy nhất. Ý tưởng để tạo ra bóng khối là ta sẽ xây dựng một lưới các đa giác bao quanh vùng bóng khối mà vật thể tạo ra do được chiếu sáng. Để làm được điều đó, ta phải tìm ra danh sách các cạnh viền của vật thể, chúng là những cạnh chủ yếu để tạo ra bóng khối, khi ánh sáng chiếu đến những

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

34

cạnh đó, nó sẽ không dừng lại mà đi tiếp. Có thể hiểu đó là những cạnh tiếp xúc của vật thể với tia sáng.

Hình 2.5. Cạnh viền (Silhouette Edge) được tô đỏ.

Hình 2.6. Khi nhìn từ vị trí của nguồn sáng ta sẽ không thấy bóng và rất dễ để xác định cạnh và đỉnh viền.

Một cạnh (bất kỳ) được cấu tạo bởi hai điểm và có từ 1 đến 2 mặt kề liền với nó, cạnh đó được gọi là cạnh viền khi nó chỉ có 1 mặt kề hay có 2 mặt kề nhưng một mặt hướng về phía ánh sáng trong khi mặt còn lại thì không. [4]

Hình 2.7. Cạnh viền là cạnh có một mặt kề hướng ánh sáng còn mặt còn lại thì không

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

35

Thực tế việc tìm cạnh viền đã được phát triển thành 2 thuật toán hoàn toàn riêng biệt.

Thuật toán 1: Kiểm tra tất cả các tam giác của vật thể để tìm các cạnh có tính chất của cạnh viền. Cụ thể: để tìm được các cạnh viền, trước tiên ta cần xác định mặt nào của vật thể sẽ được chiều bởi ánh sáng và mặt nào thì không. Việc này khá đơn giản khi ta đã biết tọa độ của nguồn sáng, vectơ pháp tuyến của mặt và phương trình của mặt phẳng. Ta chỉ việc thay tọa độ nguồn sáng vào phương trình mặt phẳng, rồi tính kết quả, nếu kết quả >0 thì khi đó pháp tuyến và nguồn sáng nằm cùng một phía với mặt phẳng đó, và do đó nó được chiếu sáng. Thuật toán 1 tìm cạnh viền như sau:

Bƣớc 1: Lặp cho tất cả các tam giác của vật thể.

Bƣớc 2: Nếu tam giác hướng về phía nguồn sáng ( tích vô hướng của vector hướng ánh sáng và vector pháp tuyến của tam giác đó >= 0):

Bƣớc 2-a: Chèn 3 cạnh (là 3 cặp vertices) của tam giác đó vào edge stack. Bƣớc 2-b: Kiểm tra trong stack xem 3 cạnh vừa chèn đó đã xuất hiện rồi hay chưa (tính luôn thứ tự đảo của cạnh, ví dụ AB = BA).

Bƣớc 2-c: Nếu cạnh đó đã tồn tại trước trong stack, gỡ bỏ cả hai cạnh khỏi stack.

Bƣớc 3: Cuối cùng, các cạnh còn lại trong stack là các cạnh viền. Thủ tục xác định mặt được chiếu sáng sẽ như sau:

Gọi P[i](x,y,z) = a*x + b*y + c*z + d là phương trình của mặt thứ i của vật thể. L = (Lx, Ly, Lz) là vị trí của nguồn sáng. n: Số mặt của vật thể Procedure VisiblePlaneTest( ) Begin Side: interger; For i = 0 to n do Begin

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

36

Side =a*Lx + b*Ly + c*Lz + d; if (Side>0) then P[i].visible = True else P[i].visible = False;

End End [4], [5]

Mỗi cạnh sẽ có 2 mặt chứa nó, mỗi cạnh viền sẽ phải có một đa giác kề được chiếu tới bởi ánh sáng và một thì bị che. Bởi vì nếu cả 2 đa giác đó đều được chiếu sáng hoặc là cả 2 đều bị che thì cạnh đó sẽ không phải là cạnh viền. Khi đó ta có thuật toán tìm danh sách các cạnh viền dưới dạng mã giả như sau:

Gọi P[i] là đa giác thứ i của vật thể. n: là số đa giác.

Procedure Danhsachcanhvien()

Begin

for i = 0 to n do // Kiểm tra tất cả các đa giác.

if (P[i].visible = true} // Nếu mặt chứa đa giác đó được chiếu sáng

Begin

for {tất cả cạnh của đa giác} do

if {cạnh đó đã có ở trong danh sách cạnh viền} - Loại bỏ nó ra khỏi danh sách.

else

- Thêm cạnh đó vào danh sách.

End;

End;

Ưu điểm:

Đơn giản do sử dụng CPU để thực hiện.

Bóng khối tạo ra có số mặt tối thiểu, render nhanh. Khuyết điểm:

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

37

Skinning (dùng cho diễn hoạt khung xương) phải thực hiện trước trên CPU. [4], [5]

Thuật toán 2: Tạo ra một vật thể mới (shadow volume mesh) từ vật thể chắn sáng nhưng có thêm các mặt được bổ sung ở các cạnh, rồi dùng Vertex Shader để tạo hình khối của bóng khối (shadow volume).

Cách tạo Shadow Volume Mesh

Như ta đã biết nội dung chủ yếu của thuật toán 2 là phải tính được shadow volume mesh và dùng Vertex Shader để tạo hình khối shadow volume từ mesh này. Hình vẽ sau đây minh họa cách tạo ra shadow volume mesh.

Hình 2.8. Dựng shadow volume mesh bằng các thêm vào các mặt phụ

Thuật toán tạo shadow volume mesh

Bƣớc 1: Lặp cho tất cả các mặt trong vật thể

Bƣớc 2: Tính vector pháp tuyến cho mỗi mặt.

Bƣớc 3: Lặp cho 3 cạnh của mỗi mặt.

Bƣớc 3-a: Thêm cạnh đó vào 1 list kiểm tra.

Bƣớc 3-b: Nếu cạnh đó đã xuất hiện ở trong list ( ta đã tìm thấy cạnh được dùng chung cho 2 mặt):

+ Nếu pháp tuyến của các mặt kề cạnh đó không song song với nhau, thêm 1 tứ giác (degenerate quad) vào list kết quả.

+ Ngược lại, chỉ thêm cạnh đó vào list kết quả.

Bƣớc 3-c: Gỡ bỏ cạnh đang xử lý và các cạnh tương tự ra khỏi list kiểm tra.

Bƣớc 4: Tạo mảng dữ liệu để chứa dữ liệu của shadow volume mesh, mỗi vertex của shadow volume mesh chỉ gồm vị trí và pháp tuyến mà thôi.

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

38

Bƣớc 5: Nếu còn cạnh nào trong list kiểm tra thì vật thể đang xử lý không phải là khối đặc vì trong khối đặc tất cả các cạnh đều có 2 mặt kề với nó.

Ưu điểm:

Tốc độ nhanh do thực hiện ngay trên GPU (Vertex Shader), giải phóng CPU.

Có thể thực hiện skinning trên phần cứng. Khuyết điểm:

Phức tạp do thuật toán tạo vật thể mới, việc tính toán chậm. Phải sử dụng thêm Vertex Shader.

Shadow Volume có số mặt tạo ra lớn hơn rất nhiều so với vật thể gốc, render sẽ chậm hơn.

Sử dụng thuật toán 2 cho ra tốc độ nhanh hơn hẳn thuật toán 1 dù khi render có chậm hơn do có nhiều mặt hơn. [4], [5]

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 42)