Ứng dụng công nghệ ray tracing phổ
(larswander.com)- Ray tracing phổ là cách tạo ra phân bố công suất phổ (SPD) cho từng pixel bằng cách xử lý cả bước sóng và pha, thay vì dùng các tia chỉ mang giá trị RGB
- Ray tracing thông thường truy vết ngược từ camera về phía nguồn sáng để tối ưu hiệu năng, và đơn giản hóa tia sáng như các hạt mang vector RGB
- Mắt người tạo ra màu sắc từ phản ứng của ba loại tế bào nón nhạy với bước sóng ngắn, trung bình và dài; cùng một màu vẫn có thể xuất phát từ các SPD khác nhau
- Trong các cảnh mà bước sóng ảnh hưởng đến đường đi và màu sắc của ánh sáng như tán sắc hay giao thoa màng mỏng, phép gần đúng RGB thôi có thể không còn đủ
- Một spectral ray tracer không phụ thuộc thư viện, viết bằng JavaScript và GLSL, được dùng làm công cụ tạo ra màu sắc và chuyển động phi thực trong computer art, nơi các định luật ánh sáng bị cố ý thay đổi
Camera được tạo bằng mã và ray tracing
- Trong computer art, cả cảnh và camera đều được tạo bằng mã, rồi kết quả render được chuyển thành mảng giá trị RGB
- Ray tracing cho các tia sáng bật nảy giữa các vật thể ảo, mô hình hóa đường đi của ánh sáng đi qua giữa camera mô phỏng và nguồn sáng
- Vì hiệu năng, người ta không truy vết nguyên xi chuyển động của ánh sáng thật mà dùng nhiều phép đơn giản hóa
- Vì phần lớn tia từ nguồn sáng không đến được camera, nên thay vì xuất phát từ nguồn sáng, chúng được truy vết ngược từ góc nhìn của camera
- Việc truy vết ngược này là hợp lý về mặt vật lý dưới giả định T-symmetry, tức các quy luật truyền ánh sáng đối xứng theo hướng thời gian
- Một phép đơn giản hóa lớn hơn là coi tia sáng như các hạt mang vector màu RGB thay vì là sóng
- Cách này bỏ qua tính chất sóng của ánh sáng, nhưng trong nhiều cảnh vẫn cho ra kết quả có vẻ hợp lý về mặt vật lý
- Phép gần đúng này khả thi vì mắt người có ba loại tế bào cảm nhận màu nhạy với bước sóng ngắn, trung bình và dài
Mắt phản ứng với phổ chứ không phải RGB
- Ánh sáng trong thực tế thường không phải một bước sóng đơn lẻ mà là phân bố công suất phổ (SPD) gồm nhiều bước sóng trộn lại
- Một màu mà con người nhìn thấy có thể tương ứng với vô số SPD, hiện tượng này được gọi là metamerism
- Ví dụ, màu vàng có thể được nhìn thấy từ một bước sóng đơn lẻ quanh mức 580nm
- Trên các thiết bị chỉ dùng RGB như màn hình máy tính, màu vàng cũng được tái tạo bằng tổ hợp ánh sáng đỏ và xanh lục
- Cũng có những màu phi phổ không thể tạo bằng một bước sóng đơn lẻ, như magenta
- Magenta không nằm ở một vị trí đơn lẻ trên phổ
- Nó cần sự kết hợp của bước sóng thấp và bước sóng cao, tức ánh sáng xanh lam và đỏ
- Quá trình chuyển SPD thành màu có thể được xử lý bằng toán học
- Có một mối liên hệ định lượng nối vật lý, sinh lý học và trải nghiệm màu sắc chủ quan
- Mối liên hệ này được thể hiện trong CIE 1931 color spaces, được xây dựng vào năm 1931
- Nếu muốn tự triển khai, có thể tham khảo chương về màu sắc trong Physically Based Rendering
Những cảnh mà bước sóng làm thay đổi kết quả
- Trong ray tracing, không phải lúc nào cũng cần xét toàn bộ phổ hay bước sóng của từng tia riêng lẻ
- Tuy vậy, trong một số cảnh, tính chất sóng của ánh sáng ảnh hưởng trực tiếp đến đường đi, và vì thế cũng làm thay đổi màu sắc nhìn thấy
- Ví dụ tiêu biểu là tán sắc
- Đường truyền của ánh sáng bị bẻ cong khác nhau tùy theo bước sóng
- Hiện tượng lăng kính tách ánh sáng trắng thành các tần số cấu thành thuộc trường hợp này
- Một ví dụ khác là giao thoa màng mỏng (thin film interference)
- Nó giải thích các hoa văn giống cầu vồng thấy trên bong bóng xà phòng
- Ánh sáng phản xạ từ lớp trên và lớp dưới của biên xà phòng tạo ra giao thoa tăng cường và triệt tiêu
- Quá trình này không tách phổ thành các bước sóng đơn lẻ mà làm tăng hoặc giảm đóng góp của một số phần trong phổ
- Kết quả là thường tạo ra các màu phi phổ như cyan-xanh lục, teal, magenta và nâu
Spectral ray tracing xử lý điều gì
- Spectral ray tracing là ray tracing có xét đến tính chất sóng của ánh sáng
- Thay vì chỉ tính thế giới bằng màu RGB, nó tạo ra phân bố công suất phổ cho từng pixel của cảnh
- Nó dùng cả bước sóng lẫn pha của tia để ước lượng màu tốt hơn trong những tình huống mà thông tin này quan trọng
- Đặc biệt hữu ích khi bước sóng và pha làm thay đổi màu kết quả, như trong tán sắc hay giao thoa màng mỏng
Ứng dụng trong computer art
- Trong các tác phẩm gần đây, người ta cố ý phá vỡ các quy luật chi phối chuyển động của ánh sáng và tạo bằng mã các camera thuộc những vũ trụ hơi khác thực tại
- Khi xử lý sự phong phú của toàn bộ phổ ánh sáng, họ cũng có thể thay đổi các quy tắc truyền ánh sáng theo cách phi thực
- Các đầu ra được công bố đều được tạo bằng spectral ray tracer JavaScript và GLSL không phụ thuộc thư viện viết thủ công
- Các tác phẩm ví dụ gồm có
- Light Doesn't Bend That Way #1, 2023
- Được tạo bằng cách biến góc phản xạ thành một hàm của bước sóng
- Quá trình này có vẻ chỉ tạo ra các màu phổ
- Untitled, 2023
- Là tác phẩm đang thực hiện cho series FULL_SPECTRUM, được công bố tại Tokyo năm 2023
- Untitled, 2023
- Được cung cấp dưới dạng Video 3
- Quá trình làm cho tác phẩm chuyển động trong hệ thống này được nhấn mạnh là đặc biệt quan trọng
- Untitled, 2024
- Light Doesn't Bend That Way #1, 2023
1 bình luận
Ý kiến trên Hacker News
Nếu muốn tự tay làm thử, ebook miễn phí Ray Tracing Gems II 1 có nói về ray tracing GPU thời gian thực dựa trên API mới nhất và tăng tốc phần cứng, đồng thời cũng có chương về spectral rendering
Đặc biệt là chương 42, “Efficient spectral rendering on the GPU for predictive rendering”
1 https://www.realtimerendering.com/raytracinggems/rtg2/
Nếu cần phần nhập môn thật nhanh thì cũng khuyên đọc Ray Tracing in One Weekend 1, còn nếu sau đó muốn đào sâu thì Physically Based Rendering [2] là lựa chọn tốt
1 https://raytracing.github.io/
[2] https://pbrt.org/
Tôi không có thời gian để trực tiếp vọc ray tracing, nhưng khi lướt phần đầu cuốn sách thì thấy alias sampling là một kỹ thuật rất thanh nhã và hay
Nó hữu ích trong bối cảnh rộng hơn nhiều so với đồ họa, nên tôi có cảm giác giá mà biết đến nó sớm hơn
Có một vài ví dụ về spectral ray tracer
Mitsuba là một renderer nghiên cứu mã nguồn mở với nhiều tính năng rất hay như differentiable rendering https://www.mitsuba-renderer.org/
Maxwell có hai chế độ spectral với độ chính xác khác nhau, và cách phức tạp hơn thường được dùng trong lĩnh vực quang học https://maxwellrender.com/
Manuka của Wētā FX là một spectral renderer và đã được dùng trong nhiều phim điện ảnh dài tập https://dl.acm.org/doi/10.1145/3182161 và https://www.wetafx.co.nz/research-and-tech/technology/manuka
Nếu muốn xem cấu trúc bên trong nhưng thấy các hệ thống phục vụ production quy mô lớn quá phức tạp, tôi khuyên nên xem thử bản triển khai này
Đây là một ví dụ xuất sắc, gần như tối giản, về spectral path tracer https://github.com/TomCrypto/Lambda
Cũng có Indigo Renderer và LuxRender mã nguồn mở
https://indigorenderer.com
https://luxcorerender.org
Theo tôi, spectral rendering là một ví dụ rất hay cho thấy ray tracing tự nó không phải điểm đến cuối cùng của rendering mà gần như chỉ là điểm khởi đầu
Thỉnh thoảng có cảm giác như rendering đã được giải quyết nhờ ray tracing thời gian thực, nhưng theo tôi điều đó khá xa sự thật
Theo tôi biết, phần lớn các hệ thống spectral rendering không xử lý giao thoa màng mỏng hay các hiệu ứng dựa trên sóng khác, nên đó cũng là một vùng biên khác cần khai phá
Thực tế có nhiều chi tiết đến mức đáng kinh ngạc
Rendering càng tiến gần đến các nguyên lý vật lý nền tảng, game engine sẽ càng trở thành engine mô phỏng thế giới
Nhiều thành phần engine vốn thường được tách riêng ngày nay có thể sẽ hội tụ về một điểm chung, ví dụ như ranh giới giữa lớp vật lý và lớp rendering có thể giảm đi
Tôi tò mò không biết xu hướng này hiện giờ đã có thể quan sát phần nào hay chưa
Khi năng lực tính toán tăng thêm vài bậc độ lớn nữa, các trừu tượng hiện nay có lẽ cũng sẽ bị xem như những hình thức do ràng buộc kỹ thuật của quá khứ tạo ra, giống như cách ta nhìn công nghệ tối tân của 30 năm trước
Nó giống như fractal, càng nhìn gần càng lộ ra thêm nhiều chi tiết ảnh hưởng đến thứ chúng ta nhìn thấy
Chúng ta đang từng chút một tiến gần hơn tới rendering chính xác vật lý 100%, nhưng có lẽ sẽ không bao giờ chạm tới 100% mà chỉ tiếp tục cộng thêm những tỷ lệ nhỏ nữa
Nói thêm về ý rằng thực tế có nhiều chi tiết đến kinh ngạc, còn có phân cực ánh sáng1 — tuy ít nơi triển khai, nhưng trong một số cảnh nhất định nó có thể tạo ra hiệu ứng khá dễ nhận thấy
Có một engine spectral ray tracing rất tốt là LuxRender: https://luxcorerender.org/
Tuy nhiên, đó là ở các phiên bản cũ, còn renderer LuxCore mới hơn thì không có hỗ trợ spectral đầy đủ
Ngoài các hiệu ứng được nêu ở đây, spectral rendering còn có thêm nhiều ưu điểm khác
Nếu được triển khai theo hướng light tracing, thì về sau có thể thay đổi màu, phổ và cường độ của nguồn sáng, đồng thời trong nhiều cảnh ánh sáng gián tiếp cũng chính xác hơn nhiều
Nếu muốn tự vọc với việc triển khai ray tracing, thì tự viết nó hóa ra lại dễ hơn tưởng tượng
Có một cuốn sách miễn phí rất hay (https://raytracing.github.io/books/RayTracingInOneWeekend.ht...), và nếu bạn biết chút Unity thì hướng dẫn GPU (https://medium.com/@jcowles/gpu-ray-tracing-in-one-weekend-3...) cũng rất tốt
Bản Unity có GUI giúp xem trước cảnh và di chuyển camera dễ dàng, nên nghịch sẽ tiện hơn
Nếu không muốn viết từ đầu thì cũng có nhiều bản triển khai dựa trên các tài liệu này, nhưng tự làm thử chắc chắn rất đáng giá
Khi nghịch với phần triển khai cơ bản, tôi đã thử làm cho các tia di chuyển như hạt để bẻ cong quỹ đạo về phía vật thể hoặc theo hướng ngược lại, hoặc cho nó nhớ góc phản xạ cuối cùng để dùng cho lần va chạm vật liệu tiếp theo
Phần lớn kết quả không mấy ấn tượng, nhưng tôi có được trực giác về thứ mình đang nhìn, và chỉ cần di chuyển camera một chút cũng đã rất hữu ích
Đây là một dự án lập trình sở thích nhỏ thực sự rất vui
Tuy nhiên, cách làm là khi tia cắt vật thể thì đặt độ dài tối đa của tia nhỏ lại, rồi từ điểm đó bắn nhiều tia ra xung quanh và áp dụng thứ gì đó giống phương trình hấp dẫn cho mỗi va chạm
Tất nhiên là chậm và chỉ gần đúng, nhưng dễ làm, và còn có thể triển khai những thứ như đối tượng hố đen bẻ cong ánh sáng trong cảnh
Khi tôi viết ray tracer đầu tiên, việc đó không mất trọn cả cuối tuần, và chỉ khoảng bốn trang mã C viết trong một đêm
http://canonical.org/~kragen/sw/aspmisc/my-very-first-raytra...
Sau đó tôi đã tạo ray tracer bằng Clojure và Lua, rồi ray marcher bằng JavaScript, và chúng có thể rất nhỏ và đơn giản
Tối qua tôi xem Spongy của mentor/TBC https://www.pouet.net/prod.php?which=53871, một ray tracer hoạt hình fractal có sương mù chỉ gồm 65 lệnh máy và tệp thực thi MS-DOS chỉ 128 byte
Vì ảnh ray tracing vốn rất đẹp nên người ta dễ bị choáng ngợp và nghĩ rằng các thuật toán cùng cấu trúc dữ liệu tạo ra chúng hẳn phải rất khó, nhưng nếu bạn đã biết vector 3 chiều thì thực ra nó khá đơn giản
Tôi thấy SDF ray marching còn đơn giản hơn ray tracer kiểu Whitted truyền thống, vì nó thay thế phần lớn toán học phức tạp để giải giao cắt chính xác với hình học cảnh bằng một thuật toán xấp xỉ tuần tự rất đơn giản
Những ray tracer cực nhỏ như Spongy hay bootsector raytracer của Oscar Toledo G. https://github.com/nanochess/RayTracer thường lại khó hiểu hơn các bản triển khai lớn hơn một chút
Vì để làm chúng nhỏ như vậy cần rất nhiều mẹo, và những mẹo đó khó hiểu hơn mã đơn giản
Nếu muốn đi đến cùng, bạn phải theo dõi không chỉ bước sóng của mỗi tia mà còn cả phân cực và pha
Những thuộc tính này hiếm khi ảnh hưởng tới tri giác thực của con người, như trong màng mỏng hoặc cách tử nhiễu xạ, nhưng rõ ràng chúng có tồn tại
Có thể thấy được vẻ đẹp của việc toán học và vật lý thực sự vận hành
Tôi cũng tự hỏi liệu một số điều chỉnh được thêm vào vì tính thẩm mỹ có thể hữu ích cho các cách trực quan hóa khác hay không
Điều đó cũng làm tôi nhớ tới thời chép lại mã từ sách để tạo nhạc đa âm trên Apple II
Khi chạy thử thì rõ ràng có gì đó sai sai, nhưng thay vì tiếng ồn thô ráp lại xuất hiện một mẫu âm thanh kỳ lạ mà đẹp, và lỗi ngẫu nhiên đó khá cuốn hút
Tôi tự hỏi liệu có thể tạo ra hình ảnh với số kênh nhiều hơn rất nhiều so với 3 kênh, giống như ảnh siêu phổ hay không
Tôi từng xem xét việc này như một cách nhấn mạnh phổ màu để dạy trẻ em về màu sắc tốt hơn
Ví dụ, khi rê chuột lên một pixel trong hình ảnh1, nó sẽ hiển thị phổ để củng cố mối liên hệ giữa màu sắc và phổ
Nhưng ảnh siêu phổ thì hiếm, và theo truyền thống thì camera[2] rất đắt
Vậy còn ảnh siêu phổ tổng hợp thì sao?
Một trình kết xuất trong trình duyệt với độ phân giải rất thấp có thể đủ nhanh để nghịch tương tác với ánh sáng và vật liệu
Ngoài ra cũng có thể thử triển khai góc nhìn của người bị rối loạn sắc giác, con người “có thể nhìn thấy UV sau khi loại bỏ thủy tinh thể bị đục”, động vật có vú linh trưởng khác nhị sắc (chuột/chó), và cá ngựa vằn tứ sắc
1 http://www.ok.sc.e.titech.ac.jp/res/MSI/MSIdata31.html
[2] Camera đa phổ giá rẻ dùng chiếu sáng băng hẹp ghép kênh theo thời gian: https://ubicomplab.cs.washington.edu/publications/hypercam/
Giá trị cuối cùng của ảnh là giá trị đã biến đổi từ phần đóng góp của từng nguồn sáng, và vì biết phổ của nguồn sáng nên cũng có thể có phổ của pixel
Tuy nhiên, nếu gặp tán sắc đáng kể hoặc hiệu ứng màng mỏng thì phải lấy mẫu bước sóng theo từng đường đi, nên sẽ thành một cách tiếp cận gần đúng hơn
Tôi cũng đang nghĩ đến việc thử triển khai khúc xạ trong bộ dò tia phân bố của mình
Theo kiểu xác suất chứ không phải kiểu song song https://en.m.wikipedia.org/wiki/Distributed_ray_tracing
Có vẻ chỉ cần lấy mẫu ngẫu nhiên các tần số, tính màu của chúng rồi dùng nó để điều chỉnh màu của tia
Để bù cho việc màu khúc xạ thuần chỉ còn độ sáng bằng 1/3, có lẽ cần nhân kết quả với 3
Nếu nhớ không nhầm thì đây là thuật ngữ xuất hiện trong một bài báo SIGGRAPH của Rob Cook
Về mặt khái niệm chung và thống nhất hơn, chuyển sang hướng path tracing sẽ tốt hơn, và khi tìm kiếm hay nghiên cứu cũng dễ tìm mẹo và kỹ thuật hơn
Khi kết hợp kết xuất phổ với khúc xạ, đúng là cần lấy mẫu phân bố để chọn tần số
Nói chung việc này có thể khá khó nhằn, nên làm theo từng bước sẽ tốt hơn
Phản xạ cũng tương tự, nhưng trong cả hai trường hợp, việc có dùng vật liệu phụ thuộc tần số hay không là tùy lựa chọn
Ngay cả khi dùng vật liệu đơn giản hóa, vẫn có lý do chính đáng để dùng phương pháp phổ