Ray tracing là gì: Nguyên lý, thuật toán và phần cứng chuyên dụng

Ray tracing là kỹ thuật đồ hoạ máy tính mô phỏng cách ánh sáng lan truyền trong không gian để tạo ra hình ảnh. Nhờ đó, hiệu ứng phản xạ, khúc xạ, bóng đổ và ánh sáng gián tiếp trở nên chân thực với thực tế. Bài viết này phân tích nguyên lý hoạt động, so sánh với rasterization, giải thích cấu trúc cây BVH và vai trò của phần cứng chuyên dụng.

Điểm khác biệt cốt lõi nằm ở hướng giải pháp. Rasterization đi từ hình học đến màu sắc, còn ray tracing đi từ ánh sáng đến vật thể, nên ánh sáng trở thành kết quả tự nhiên của thuật toán chứ không phải thứ được dựng thủ công.

Quy trình tạo ảnh bằng ray tracing

Quy trình cơ bản bắt đầu khi tia được phát ra từ vị trí camera, đi xuyên qua các điểm ảnh trên mặt phẳng hình ảnh, rồi lao vào trong khung cảnh. Khi tia chạm một bề mặt, thuật toán tính toán điểm giao, màu sắc tại điểm đó, rồi tạo ra các tia mới theo những hướng được quy định bởi vật liệu:

  • Tia phản xạ (reflection): bật ngược lại theo hướng đối xứng với mặt phẳng tại điểm chạm, dùng cho gương và vật liệu kim loại.
  • Tia khúc xạ (refraction): đi xuyên qua vật liệu trong suốt như thủy tinh hay kính, bị lệch hướng theo định luật khúc xạ.
  • Tia bóng (shadow ray): hướng về từng nguồn sáng. Nếu bị vật cản chắn, điểm đó rơi vào vùng tối.

Quá trình này lặp lại đệ quy. Tại mỗi bước, cường độ ánh sáng bị nhân với hệ số phản xạ hoặc truyền xuyên của vật liệu, nên nhanh chóng trở nên nhỏ. Ngay khi cường độ tích luỹ giảm xuống dưới một ngưỡng, thuật toán dừng nhánh đó lại. Ví dụ với hệ số phản xạ 0,5, các đóng góp qua từng lần bậc là 0,5; 0,25; 0,125; 0,0625 và cứ thế giảm dần.

Một chi tiết quan trọng là thuật toán dùng chiến lược backwards ray tracing: phát tia từ mắt người xem ra, chứ không phát từ nguồn sáng. Lý do là phần lớn ánh sáng phát ra từ nguồn không bao giờ đến được mắt, nên phát ngược chiều tiết kiệm tính toán hơn nhiều lần.

Để tìm điểm giao giữa tia và một hình cầu, thuật toán giải phương trình bậc hai t² + 2(v·d)t + (v² - r²) = 0. Nếu discriminant âm, tia không cắt hình cầu và bỏ qua được ngay. Với gương phẳng, phương trình phản xạ đơn giản hơn nhiều: r = d - 2(n·d)n.

Cảnh ba chiều dựng bằng path tracing với phản xạ trên mặt gương và bóng đổ rõ nét

Rasterization và ray tracing khác nhau ở đâu

Rasterization rẻ hơn vì nó có data coherence: các pixel lân cận dùng chung dữ liệu đỉnh hình học và dùng chung cache bộ nhớ. Ray tracing xử lý từng tia độc lập, mỗi tia có thể đi vào một vùng hoàn toàn khác. Đổi lại, ray tracing dễ bắn thêm tia cho các kỹ thuật chống răng cưa không gian (spatial anti-aliasing) vì mỗi tia độc lập, không cần chia sẻ mẫu.

Một điểm mấu chốt về tính chân thực: phương pháp ray tracing kiểu Whitted (chỉ xét gương, khúc xạ và bóng) vẫn chưa photorealistic. Muốn đạt độ chân thực đầy đủ phải giải toàn bộ phương trình vận chuyển ánh sáng, mà với tài nguyên hiện tại thì bất khả thi. Chính vì vậy, các engine render lớn như Arnold hay RenderMan đều kết hợp ray tracing với các kỹ thuật xấp xỉ khác.

Path tracing và phương trình rendering

Path tracing là hướng tiếp cận ngẫu nhiên hoá. Thay vì tính trực tiếp tích phân, nó xấp xỉ bằng tích phân Monte Carlo:

I(x,x') = g(x,x')[eps(x,x') + INT_S rho(x,x',x'') * I(x',x'') * dx'']

Trong đó rho là hàm phản xạ hai chiều (BRDF) mô tả cách vật liệu phân tán ánh sáng, và eps là thành phần phát sáng. Vì mỗi pixel được lấy mẫu bằng nhiều đường tia ngẫu nhiên, ảnh thường bị nhiễu, nên cần tối thiểu hàng nghìn mẫu trên mỗi pixel (spp) mới đạt chất lượng chấp nhận được.

Các kỹ thuật tối ưu quan trọng gồm importance sampling để tập trung mẫu vào hướng có xác suất cao, next event estimation (NEE) để lấy mẫu trực tiếp từ nguồn sáng thay vì chờ tia va chạm, và Russian roulette để bỏ các đường tia yếu với xác suất tăng dần nhưng bù lại bằng cách tăng hệ số đóng góp, giữ thuật toán không thiên lệch.

Ngay trong game, bản path tracing thường là biased: giới hạn số lần bậc để đạt tốc độ khung hình. Kỹ thuật ReSTIR giải quyết vấn đề này bằng cách chia sẻ dữ liệu lấy mẫu giữa các pixel lân cận và giữa các khung hình liên tiếp.

Lưới tám ảnh cùng một khung cảnh với số mẫu mỗi pixel tăng dần, nhiễu giảm dần

BVH: làm cho ray tracing khả thi

Nếu kiểm tra từng tia với toàn bộ vật thể, chi phí sẽ là tuyến tính và không khả thi với khung cảnh chỉ vài nghìn vật thể. Bounding Volume Hierarchy là giải pháp: bọc các vật thể trong một thể tích giới hạn, gom chúng thành nhóm, rồi lặp lại đệ quy để tạo thành cây.

Sơ đồ cây phân cấp thể tích giới hạn với các hộp bao quanh vật thể

Ánh sáng gặm tia chỉ đi vào các nhánh có thể chứa điểm giao, bỏ qua ngay lập tức những nhánh không thể. Nhờ vậy độ phức tạp giảm từ tuyến tính xuống giữa tuyến tính và lôgarit.

Cây nhị phân (degree = 2) phổ biến nhất vì dễ dựng. Cây degree cao hơn thì traversal nhanh hơn nhưng phải kiểm tra nhiều node hơn mỗi bước. Heuristic phổ biến để chia nhánh là surface area heuristic (SAH), và cây rộng kiểu 4-ary hoặc 16-ary thường có lợi cho cả thời gian dựng lẫn truy vấn.

Về vòng đời, cách dựng top-down và bottom-up đều là offline, cần toàn bộ vật thể trước. Cách chèn động (insertion) là on-line nhưng hiệu năng truy vấn kém hơn việc dựng lại từ đầu. Vì vậy, thực tế thường dựng BVH bất đồng bộ và song song, hoặc dựng lại khi mức độ chồng lấn giữa các lá vượt ngưỡng.

Một tối ưu traversal đáng chú ý: kiểm tra thể tích gần mắt trước, nếu tìm được điểm giao chắc chắn gần hơn thì bỏ qua luôn thể tích thứ hai, vì hai thể tích không chồng nhau.

Phần cứng chuyên dụng cho ray tracing

Từ thế kỷ 21, các GPU thương mại bắt đầu tích hợp khối chức năng riêng gọi là RT core, tương đương texture unit về kích thước và giao diện. RT core đảm nhiệm các tác vụ lặp lại nhiều nhất của ray tracing: duyệt BVH, giải nén node BVH, và kiểm tra giao tia với hộp bao cũng như tam giác.

Theo lịch sử phát triển, GPU thương mại đầu tiên có ray tracing phần cứng thuộc thế hệ Turing ra mắt tháng 9/2018, và dòng GeForce RTX 2080 cùng 2080 Ti là những dòng phổ thông đầu tiên chạy ray tracing thời gian thực. Nền tảng DirectX Raytracing cho phép kết hợp rasterization với ray tracing theo kiểu lai, phần lõi của cách tiếp cận này.

Không chỉ GPU rời: Qualcomm Snapdragon 8 Gen 2, Arm Immortalis-G715, Samsung Exynos 2200 và cả Apple A17 Pro đều tích hợp khả năng ray tracing phần cứng, cho thấy kỹ thuật này đang lan xuống thiết bị di động.

Render ba chiều các quả cầu phản xạ với ánh sáng toàn cục và độ sâu trường ảnh

Ứng dụng thực tế

Trong điện ảnh, phim được render toàn bộ bằng path tracing đã xuất hiện từ khá lâu như Monster House năm 2006, được dựng bằng Arnold của Sony Pictures Imageworks. Lợi ích lớn nhất mà path tracing mang lại cho dựng phim là ánh sáng gián tiếp không còn phải dựng giả bằng cách đặt đèn thủ công như trước đây.

Ngoài lĩnh vực giải trí, ray tracing còn dùng rộng rãi trong CAD và kiểm kê công nghiệp, mô phỏng ánh sáng trong thiết kế nội thất và kiến trúc, và tạo hình ảnh sản phẩm cho thương mại điện tử, nơi độ chân thực ánh sáng quyết định quyết định tới tỷ lệ chuyển đổi.

Kết luận

Ray tracing đánh đổi chi phí tính toán lấy sự chân thực vật lý, và nhờ BVH cùng các thuật toán lấy mẫu thông minh, chi phí đó đã giảm đủ để dùng được trong thời gian thực. Nếu bạn đang tiếp cận chủ đề này, hãy bắt đầu bằng khái niệm cấu trúc BVH và phương trình rendering, rồi thử render một cảnh Cornell Box đơn giản để tự quan sát hiệu ứng ánh sáng gián tiếp.

Nguồn tham khảo: Ray tracing (graphics) – Wikipedia | Path tracing – Wikipedia | Bounding volume hierarchy – Wikipedia | Monte Carlo method – Wikipedia

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Mạng mesh không dây: Kiến trúc tự tổ chức và tự phục hồi mạnh mẽ

Mạng mesh không dây là gì? Đây là một mạng truyền thông gồm các nút radio được tổ chức theo topo lưới, trong đó mỗi thiết bị vừa đóng vai…

Xem thêm

Kubernetes là gì? Nền tảng điều phối container cho cloud-native

Kubernetes (viết tắt K8s) là hệ thống điều phối container mã nguồn mở, giúp tự động hoá việc triển khai, mở rộng và quản lý ứng dụng. Nó gom nhiều…

Xem thêm

WebRTC là gì: Truyền video và dữ liệu trực tiếp trên trình duyệt

WebRTC (viết tắt của Web Real-Time Communication) là một dự án mã nguồn mở giúp trình duyệt web và ứng dụng di động trao đổi âm thanh, hình ảnh và…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất