Strona główna Rendering Ray marching i SDF

🔮 Ray marching i SDF

Interaktywny renderer ray marching oparty na polach odległości ze znakiem. Sphere tracing SDF renderuje kule, sześciany i torusy z miękkimi cieniami, ambient occlusion i gładkimi operacjami boolowskimi — wszystko liczone w shaderze fragmentów GLSL.

Rendering2DŁatwy60 FPS
ray-marching ↗ Otwórz osobno
Interfejs samej symulacji jest w języku angielskim.

O ray marchingu z funkcjami odległości ze znakiem

Ta symulacja renderuje scenę 3D w całości na CPU za pomocą ray marchingu, zwanego też sphere tracingiem. Zamiast siatek, scena jest zdefiniowana funkcjami odległości ze znakiem (SDF), które zwracają odległość od dowolnego punktu do najbliższej powierzchni. Każdy promień kamery przesuwa się dokładnie o tę odległość — t += sceneSDF(origin + t·dir) — aż wartość spadnie poniżej 0,001, oznaczając trafienie. Piksele są obliczane w buforze 160×120 i skalowane 4× do 640×480.

Sterowanie pozwala wybrać cztery presety sceny (kula, mieszanka kuli i prostopadłościanu, torus i w pełni zmieszane trio), ustawić FOV od 30° do 90°, promień kuli, współczynnik mieszania smooth-min k i kierunek światła X. Przełączniki włączają miękkie cienie i ambient occlusion, a widok Normals pokazuje normalne powierzchni jako kolor. Te same techniki SDF napędzają shadery demoscenowe, fraktale proceduralne i efekty wolumetryczne w prawdziwych grach.

Najczęściej zadawane pytania

Czym jest ray marching?

Ray marching to metoda renderowania, w której promień kamery przesuwa się krok po kroku przez scenę opisaną funkcjami odległości zamiast wielokątów. Przy każdym kroku promień przeskakuje o najkrótszą odległość do dowolnej powierzchni, więc nigdy jej nie przekracza. Gdy ta odległość spadnie poniżej niewielkiego progu, uznaje się, że promień trafił w powierzchnię.

Czym jest funkcja odległości ze znakiem?

Funkcja odległości ze znakiem (SDF) zwraca odległość od punktu do najbliższej powierzchni kształtu, z dodatnim znakiem na zewnątrz kształtu i ujemnym wewnątrz. Na przykład kula o promieniu r wyśrodkowana w początku układu to po prostu długość wektora punktu minus r. Cała scena jest tu zbudowana z takich połączonych SDF.

Dlaczego nazywa się to też sphere tracing?

Każdy krok przesuwa promień o odległość do najbliższej powierzchni, co wyznacza pustą kulę o tym promieniu wokół bieżącego punktu. Promień może bezpiecznie przeskoczyć do krawędzi tej kuli bez przechodzenia przez jakąkolwiek geometrię. Wielokrotne śledzenie tych bezpiecznych kul nadaje technice alternatywną nazwę: sphere tracing.

Co robi suwak smooth-min (k)?

Współczynnik mieszania k kontroluje gładką sumę (smin), która łączy dwie prymitywy SDF w jeden ciągły kształt. Przy k bliskim zeru połączenie jest twardą krawędzią przecięcia; większe k poszerza miękkie zaokrąglenie, w którym kształty się zlewają. W tej demonstracji łączy ona kulę z prostopadłościanem i torusem, tworząc organiczne, kropelkowate formy.

Jak obliczane są normalne powierzchni?

Normalne są szacowane za pomocą różnic skończonych SDF, próbkując pole przy niewielkich przesunięciach (EPS = 0,001) wzdłuż każdej osi i obliczając gradient. Znormalizowany gradient wskazuje kierunek od powierzchni i jest używany do cieniowania. Widok Normals mapuje ten wektor bezpośrednio na czerwony, zielony i niebieski, byś mógł sprawdzić orientację powierzchni.

Jak działają miękkie cienie?

Drugorzędny promień jest przesuwany od powierzchni w kierunku światła. W trakcie przesuwania śledzi najmniejszy stosunek prześwitu SDF do przebytej odległości, co szacuje, jak blisko promień przechodzi obok przeszkód. Daje to współczynnik półcienia, tworząc miękkie, stopniowo zanikające krawędzie cieni zamiast twardych binarnych cieni.

Czym jest tutaj ambient occlusion?

Ambient occlusion przyciemnia szczeliny i miejsca styku, gdzie otaczająca geometria blokuje światło pośrednie. Ta implementacja próbkuje SDF w pięciu krótkich krokach wzdłuż normalnej i porównuje oczekiwany prześwit z rzeczywistym. Tam, gdzie pobliskie powierzchnie skupiają się wokół punktu, okluzja rośnie, dodając subtelną głębię i osadzając obiekty na podłodze.

Jaki model cieniowania jest używany?

Renderer używa cieniowania w stylu Phonga: składnika ambient, składnika rozproszonego proporcjonalnego do iloczynu skalarnego normalnej i kierunku światła, oraz refleksu lustrzanego podniesionego do potęgi dla połysku. Wynik jest tone-mapowany krzywą Reinharda i korygowany gammą (potęga 0,4545) przed zapisaniem do bufora pikseli.

Dlaczego renderuje się w tak niskiej rozdzielczości?

Ray marching jest obliczeniowo ciężki, ponieważ każdy piksel może ocenić SDF sceny dziesiątki razy, do 64 kroków każdy. Uruchomienie tego na CPU w JavaScript byłoby zbyt wolne w pełnej rozdzielczości, więc obraz jest obliczany w buforze 160×120 i skalowany 4×. Panel Stats podaje czas renderowania i średnią liczbę kroków promienia na piksel.

Czy to renderowanie jest fizycznie dokładne?

Jest inspirowane fizyką, ale nie jest fizycznie dokładne. Geometria i normalne są matematycznie poprawne z SDF, ale oświetlenie używa empirycznego cieniowania Phonga oraz przybliżonych miękkich cieni i ambient occlusion zamiast pełnego path tracingu. Wynik oddaje realistycznie wyglądającą głębię i cieniowanie, pozostając wystarczająco szybki, by działać na żywo na CPU.

Gdzie w praktyce stosuje się ray marching?

Ray marching z SDF jest szeroko stosowany w shaderach demoscenowych, eksperymentach Shadertoy i fraktalach proceduralnych, takich jak Mandelbulb. Pojawia się też w prawdziwych grach do renderowania wolumetrycznych chmur, mgły i miękkich pól, oraz w narzędziach potrzebujących renderować powierzchnie niejawne bez wcześniejszej konwersji na siatki wielokątów.

Podobne symulacje