Prawdopodobnie najłatwiej to zrozumieć w przeciwieństwie do raytracingu.
Aby renderować prymityw za pomocą raytracingu, potrzebujesz funkcji, która biorąc pod uwagę prymityw i promień wejściowy, mówi dokładnie, gdzie promień ten uderza w prymityw. Następnie możesz przetestować promień na wszystkich istotnych prymitywach i wybrać najbliższe skrzyżowanie. Procesory są w tym dobre.
Dzięki funkcji raymarching nie masz tak prostej funkcji przecinania promienia. Biorąc pod uwagę punkt na promieniu, możesz oszacować, jak blisko jest on do powierzchni, ale nie wiesz dokładnie, jak daleko musisz rozciągnąć ten promień, aby trafić na powierzchnię.
Tak więc „maszerujesz” krok po kroku:
Zacznij od „początku” promienia - bliskiej płaszczyzny do renderowania sceny lub przecięcia z ograniczającą objętością, jeśli jest to tylko jeden obiekt w scenie. (P0 na schemacie poniżej)
Oceń swoją funkcję odległości, aby oszacować, jak blisko jesteś powierzchni. (Największy okrąg na schemacie)
Idź naprzód wzdłuż promienia zgodnie z twoimi szacunkami. Ruch powinien być zachowawczo krótki, więc masz pewność, że nigdzie nie przejdziesz przez powierzchnię.
Teraz masz nowy punkt (P1 poniżej) - uzyskaj nowy kosztorys i powtórz.
Kontynuuj uzyskiwanie oszacowań i postępuj naprzód, aż znajdziesz się w progowej odległości od powierzchni lub osiągniesz maksymalną liczbę kroków. (P4 poniżej)
Teraz masz głębokość powierzchni i możesz wywnioskować takie rzeczy, jak normalne / okluzja otoczenia z pobliskich próbek, i użyć tych danych do oświetlenia i pokolorowania piksela.
Przykładowy diagram z GPU Gems 2, rozdział 8
Ponieważ każdy promień jest niezależny i używa (ogólnie) tylko lokalnych informacji na każdym etapie, jest gotowy do zrównoleglenia na GPU. Często na ekranie będą rysowane tylko dwa trójkąty. Po rasteryzacji każdy piksel przekazywany do modułu cieniującego fragment reprezentuje pojedynczy promień. Moduł cieniujący fragmenty przesuwa promień, aż osiągnie powierzchnię, zwracając wynik (często tylko wartość głębokości dla teksturowania i cieniowania w osobnym przejściu pełnoekranowym).
Dokładne kroki w dużym stopniu zależą od konkretnego efektu, który próbujesz osiągnąć. Techniki Raymarching są używane z ...
- pola wysokości do symulacji przemieszczenia powierzchni na tradycyjnej geometrii rasteryzowanej (mapowanie okluzji paralaksy)
- bufory głębi sceny dla rzeczy takich jak odbicia przestrzeni ekranu
- tekstury objętości do wizualizacji zestawów danych z próbkami 3D (często naukowe / medyczne)
- funkcje niejawne do renderowania rzeczy takich jak fraktale
- proceduralne pola odległości jak w pracy Iñigo Quileza (świetne linki od msell w powyższych komentarzach).
Raymarching jest również używany do mieszania na każdym kroku (często przy użyciu stałych kroków zamiast szacowania odległości za każdym razem) do renderowania półprzezroczystości, jak w tym przykładzie z Wikipedii .
Jest to popularny sposób renderowania szczegółowych chmur w czasie rzeczywistym .
Nawet odwzorowanie wnętrza , sposób symulacji szczegółów wnętrza pokoju za oknami budynku, można uznać za formę rymowania, w której promień przechodzi od punktu, w którym wchodzi do okna, do najbliższej ściany, podłogi / sufitu lub płaszczyzny mebli.
Jeśli interesuje Cię konkretny rodzaj efektu rymowania, prawdopodobnie możesz uzyskać bardziej szczegółowe odpowiedzi, zadając nowe pytanie z konkretnymi przykładami. Jako rodzina technika jest zbyt różnorodna, aby objąć wszystko jedną krótką odpowiedzią. ;) Mam nadzieję, że daje to ramy do zrozumienia, co dzieje się pod maską tych shaderów.