Giải thuật (The Algorithm)

Một phần của tài liệu Bài giảng Kỹ thuật đồ họa: Phần 2 (Trang 60 - 62)

CHƢƠNG 8: ÁNH SÁNG

8.3.3.1.Giải thuật (The Algorithm)

Có 2 bƣớc hay sự chuyển tiếp trong giải thuật:

Xây dựng photon mapping sử dụng vạch dấu

Tái sử dụng lại những photon mapping này

Bƣớc đầu tiên: vạch dấu Photon (First Pass: The Photon Tracing)

thuật đã đƣợc sử dụng để quyết định này đƣợc gọi là Russian Roulette. Ý tƣởng cơ bản là không phải tất cả photon đều cần phải đƣợc cho phép tiếp tục (survice) khi chạm 1 vật chất, một khi kết quả này trong 1 số mũ của số photon đƣợc lƣu trữ, và có lẽ phép đệ quy vô hạn. Thay vào đó là phản chiếu photon khác, vận chuyển hoặc hút. Cách này theo lý thuyết xác suất thì tất cả các photon sẽ dần dần đƣợc hút.

Những photon đƣợc lƣu giữ trong bản đồ photon thì chỉ đƣợc lƣu trữ khi chúng đƣợc phản chiếu. Việc lƣu giữ những photon trên sự phản xạ phản chiếu không cho bất kỳ thông tin hữu ích nào, trong khi những điều đó đƣợc trả lại khá tốt sử dụng kỹ thuật raytracing chuẩn. Một photon có thể đƣợc lƣu giữ vài lần dọc theo đƣờng dẫn của nó, và mỗi lần 1 photon đƣợc lƣu vị trí, năng lƣợng photon đi vào và điều khiển vào đƣợc cất giữ. Cấu trúc dữ liệu cho việc cất giữ photon sẽ trông nhƣ sau:

typedef struct Photon { Vector pos;

Vector power; Vector dir; short flag; };

Jensen gợi ý một cấu trúc dữ liệu gọn hơn nơi anh ta đóng gói năng lƣợng và phƣơng hƣớng vào và ít byte hơn. Trong sự thực hiện, chúng ta đƣợc chọn để tập trung vào sự rõ ràng của mã thay vì kích cỡ và tốc độ. Tuy nhiên với 1 số lƣợng rất lớn photon chúng ta gặp vài vấn đề hiệu năng bởi việc tải bộ nhớ rất nặng. Cấu trúc của photon sử dụng 38 byte ngƣợc lại với 20 bytes mà Jensen gợi ý trong tài liệu của anh ấy. Biến cờ đƣợc sử dụng trong KD – sự thực hiện cây.

Chuẩn bị Photon mapping cho sự chuyển trở lại (Preparing the photonmap for the rendering pass). Trong thời gian trả lại, chúng ta cần định vị những photon đóng tới 1 điểm tùy ý trong không gian 3D nhiều thời gian, vài cấu trúc dữ liệu cho phép tìm nhanh hơn ở những photon liền kề, và cũng điều khiển tốt những những phân phối không đồng dạng. Về điều này, Jensen gợi ý 1 cây kd cân bằng. Điều này cho thời gian tìm kiến tốt hơn và cân bằng của cây kd có thể thực hiện trong thời gian O(nlog(n)) nơi mà n là 1 số photon trong photon mapping. Sự cân bằng của cây kd đƣợc thực hiện bởi việc tìm kiếm điểm giữa của trục lớn nhất và chọn đó nhƣ là một đƣờng chia (splitplane). Mã giải để xây dựng một cây kd cân bằng:

balance(photons P) {

find the bounding box of P

choose the largest axis A as splitplane find the median of P in axis A

divide the pointsets into S1 and S2 according to median balance(S1)

balance(S2) }

Nhƣ đƣợc tìm thấy trong những hình ảnh chúng ta thử các kiểu khác nhau của nguồn sáng, chỉ với điểm nguồn sáng xuyên qua. Tuy nhiên một đặc tính mạnh mẽ khác tìm đƣợc bởi việc sử dụng photon mapping, có thể về cơ bản dù mẫu nào hoặc hình dạng nào của nguồn sáng mà ta muốn. Từ thứ duy nhất cần thay đổi là phƣơng hƣớng và nguồn

gốc thực tế của lightrays. Chú ý làm sao để 2 ảnh dƣới đây sử dụng những mô hình phân phối khác nhau, và hiệu ứng đó có trên kết quả cuối cùng. Đầu tiên một cái đƣợc bắn tại tất cả các phƣơng, nơi mà ngay lập tức đƣa nhiều phƣơng sáng theo hƣớng cửa của phòng. Sau đó khi photon mapping đƣợc làm cho trực quan sử dụng một sự chiếu sáng đánh giá những sự khác nhau này trở nên thậm chí còn sáng hơn nữa.

Bƣớc 2: trả lại bản đồ photon (Second Pass: Rendering The Photon Map)

Bây giờ với sự xây dựng photon mapping và khả năng nhanh chóng xem những photon trong đó, chúng ta sẵn sàng để bắt đầu trả lại khung cảnh thực tế.

Một phần của tài liệu Bài giảng Kỹ thuật đồ họa: Phần 2 (Trang 60 - 62)