Jak działają shadery Raymarch?

49

Patrzyłem na shadery znalezione tutaj shadertoy.com i większość z nich ma wspólny szum i rymarchę. W ogóle nie rozumiem kodu źródłowego, ale naprawdę chcę. Jak działają te shadery i jak działa algorytm raymarch? Wszędzie szukałem i nic nie mogę znaleźć na ten temat.

Dzięki

jmasterx
źródło
6
Iñigo Quilez napisał na ten temat doskonałe samouczki. Zobacz iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htm i iquilezles.org/www/articles/distfunctions/distfunctions.htm . Te fajne shadery to nie tylko algorytmy rymowania, ale w szczególności pola rymarchizacji, zwane także śledzeniem sfery.
sprzedać
Czy pytasz ogólnie o marsz ray czy marsz ray na GPU?
concept3d
@Milo Czy możesz wyjaśnić swoje pytanie? Czy pytasz, w jaki sposób te algorytmy są używane do generowania obrazów, które widzisz na fajnych pokazach? Czy pytasz, jak działa marsz promieniowy? Zastanawiasz się, jak działa marsz promienny w modułach cieniujących fragmenty / piksele (tj. Efektywna implementacja)?
TravisG,
Zaimplementowałem Raymarching w Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Odpowiedzi:

79

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:

  1. 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)

  2. Oceń swoją funkcję odległości, aby oszacować, jak blisko jesteś powierzchni. (Największy okrąg na schemacie)

  3. 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ę.

  4. Teraz masz nowy punkt (P1 poniżej) - uzyskaj nowy kosztorys i powtórz.

  5. 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)

  6. 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.

Maszerujesz promieniem z P0 w kierunku jego skrzyżowania

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 .

Raymarching przezroczystej tekstury objętości

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.

DMGregory
źródło