Zanim zaczniemy pisać kod śledzący promienie, warto zrozumieć, co dzieje się w silniku renderującym, gdy przełączasz viewport z podglądu na tryb finalnego renderu — i czym różni się to od klasycznej rasteryzacji.
Rendering to proces zamiany opisu sceny 3D — geometrii, materiałów, świateł i kamery — na dwuwymiarowy obraz. Od czterech dekad istnieją dwie rodziny podejść do tego problemu, i jako artysta techniczny prawdopodobnie korzystasz z obu, często bez zastanawiania się, co dzieje się pod maską.
Rasteryzacja odpowiada na pytanie: „który trójkąt zakrywa ten piksel?”. Geometria jest rzutowana na ekran, a bufor głębi (z-buffer) decyduje, co jest bliżej kamery. To podejście jest błyskawiczne i doskonale współpracuje z GPU — ale samo z siebie nic nie wie o świetle odbitym od innych obiektów. Stąd cały arsenał sztuczek: mapy cieni, sondy świetlne (light probes), odbicia w przestrzeni ekranu (SSR), zapieczone lightmapy.
Ray tracing zadaje inne pytanie: „co zobaczyłby promień światła, gdybyśmy wysłali go z kamery przez ten piksel?”. Zamiast pracować tylko na widocznej geometrii, promień może odpytać całą scenę — również to, czego nie widać na ekranie. Dzięki temu odbicia, cienie i załamania wychodzą naturalnie, jako efekt samego algorytmu, a nie dodatkowej sztuczki.
Na najbardziej podstawowym poziomie ray tracing robi trzy rzeczy w kółko, dla każdego piksela obrazu:
Ta rekurencja jest kluczowa. Promień odbity, trafiając w kolejną powierzchnię, sam staje się nowym „promieniem pierwotnym” dla tamtego punktu — stąd realistyczne odbicia w odbiciach, które w rasteryzacji trzeba by ręcznie symulować kaskadą sond i cubemap.
Idea nie jest nowa. W 1980 roku Turner Whitted opublikował pracę opisującą rekurencyjny ray tracing z odbiciami, cieniami i załamaniami — fundament, na którym stoi cała branża. Sześć lat później James Kajiya sformalizował to w postaci równania renderowania i wprowadził path tracing, czyli losowe próbkowanie metodą Monte Carlo, które dziś stoi za każdym „porządnym” rendererem offline. Ray tracing w czasie rzeczywistym, choć teoretycznie możliwy wcześniej, stał się praktyczny dopiero z pojawieniem się sprzętowej akceleracji — kart GPU z dedykowanymi jednostkami RT, wprowadzonych komercyjnie w 2018 roku.
Prawdopodobnie już dziś pracujesz z ray tracingiem częściej, niż myślisz:
Jako artysta techniczny rzadko piszesz raytracer od zera — ale gdy w renderze pojawia się szum, „fireflies” albo światło przecieka przez ścianę, to właśnie zrozumienie tego, co robi pojedynczy promień, pozwala zdiagnozować problem szybciej niż grzebanie w presetach.
W następnym rozdziale rozłożymy to, co właśnie poznałeś intuicyjnie, na wektory, punkty i operacje, które zaprogramujesz: jak dokładnie wygląda promień jako obiekt matematyczny i jak liczy się jego przecięcie ze sferą.