Strona głównaArtykułyRenderowanie

Tunnel Neonowy: Raymarchowanie Nieskończonego Koridoru z Jednego Formuły

Nieskończenie lataj w glosnym tunelu neonowym, pełen pulsujących pętli, stworzonym przy użyciu pola odległości z podpisem, śladowania sfer i fraktalnego shadera fragmentowego mapującego tunel policjonalny.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Scena bez wierzchołków

Tunnel neonowy nie ma siatki, brzegów wierzchołkowych ani żadnych trójkątów. Cała korytarz istnieje tylko jako matematyczna funkcja, oceniana dla każdego piksela, każdej ramki, wewnątrz shadera fragmentowego uruchamianego na karcie graficznej. Ten styl renderowania, znany jako raymarching, pozwala na realizację sceny tak bogatej z punktu widzenia geometrii - nieskończone powtarzające się pętle, błyszczące gradienty, poruszający się obraz - w czasie rzeczywistym za pomocą kilkudziesięciu linii kodu shadera zamiast modelowanego asetu 3D.

demo na żywo · powiązana symulacja● LIVE

Pole odległości z podpisem: formula pomiaru pustki

Szyderstwo opisuje ściany tunelu za pomocą funkcji odległości z podpisem (SDF): formuły, która dla dowolnego punktu w przestrzeni zwraca odległość tego punktu od najbliżej leżącej powierzchni - dodatnia, jeśli punkt jest poza geometrią, ujemna, jeśli jest wewnątrz. Dla prostego cylindrycznego tunelu o promieniu r odległość punktu o radialnej odległości rho od osi centralnej tunelu wynosi prosto:

float sdTunnel(vec3 p, float r) {
  float rho = length(p.xy);   // radial distance from the tunnel's axis
  return r - rho;             // positive outside the wall, negative inside it
}

Sphere tracing: bezpieczne skoki zamiast siła brzuchu

Dla każdego piksela sfera shaderu odbija jedno półprzezroczyste światło od wirtualnej kamery przez ten piksel do sceny i powtarza pytanie SDF: „jaka jest odległość od najbliższej powierzchni?”. Ponieważ ta odległość jest gwarantowana jako bezpieczny promień z niczym bliższym, półprzezroczyste światło może skoczyć dokładnie o tą odległość bez ryzyka przeskoczenia przez ścianę – technika ta nazywa się sphere tracing. Powtarzając pętlę krok-i-zapytanie, zwykle 50 do 100 razy na piksel, sfera shaderu postępuje powoli bliżej powierzchni aż do chwili, gdy odległość zwracana spadnie poniżej niewielkiego próg, wówczas shader traktuje ten punkt jako trafienie i farbuje go.

float t = 0.0;
for (int i = 0; i < MAX_STEPS; i++) {
  vec3 p = rayOrigin + rayDir * t;
  float d = sceneSDF(p);
  if (d < EPSILON) break;    // close enough - treat as a hit
  t += d;                    // safe jump: nothing is closer than d
}

Punkty polarne tworzą pętle, operacja modulo sprawia, że one są nieskończone

Poszczególne świecące pętle pochodzą z konwersji pozycji punktu wokół obwodu tunelu na kąt polarny. Następnie używane są funkcje okresowe, takie jak sinus lub powtarzające się wzór skoku tego kąta, aby wykopać paski jasne i ciemne. Illuzja nieskończonej głębokości wynika z prostej techniki: przed ocenieniem pola odległości shader stosuje operację modulo do pozycji punktu wzdłuż długości tunelu, skracając cały nieskończony oś do jednego krótkiego powtarzającego się segmentu. Geometria sceny musi opisywać tylko pojedynczą pętlę tunelu; operacja modulo sprawia, że każdy segment powtarza ją, dlatego kamera może latać wzdłuż nieskończonej ścieżki, podczas gdy na dole znajduje się tylko kilka linii arytmetycznych.

Nawinagrywanie blasku

Prawdziwy blask neonowy wynika z rozpraszania światła w otaczającym go powietrzu i szkole, co jest drogowskazem do prawidłowego symulowania. Taniestym przybliżeniem używanym tutaj jest akumulacja małej ilości dodatkowej jasności na każdym kroku raymarchu w zależności od tego, jak blisko wartość SDF danego kroku była zera, nawet jeśli ten krok nie był wystarczająco bliski do uznania za prawdziwy traf. Punkty, które przepływają blisko krawędzi jasnej pędu bez technicznego dotyku nadal dodają mieliznę łagodną, a sumowanie tej kontrubucji po wszystkich krokach raymarchu dla pojedynczego piksela tworzy przekonujący gradient blasku o znacznie niższym koszcie od prawdziwego rozpraszania światła wolumetrycznego.

Często zadawane pytania

Czym jest raymarching i jak się ono różni od ray tracingu?

Obie techniki wysyłają strumień światła z kamery do sceny, ale klasyczne ray tracing rozwiązuje problem exactnej przecięcia się ze geometryczną strukturą, taką jak trójkąty lub sfera. Raymarching natomiast przesuwa się longitudynalnie po strumieniu używając funkcji odległości znamionowanej, która mówi, ile bezpiecznych kroków można zrobić bez przeprzecięcia się niczego, powtarzając proces aż do momentu, gdy osiągnie ona wystarczająco bliską odległość do powierzchni, aby stwierdzić, że jest to trafienie. To sprawia, że raymarching jest idealnie nadane do scen opisanych wzorami matematycznymi zamiast siatków wielokątów.

Dlaczego tunel wygląda na nieskończony, choć jest prosto powtarzającym się kształtem?

Shader wykonuje operację modulo nad odległością strumienia światła wzdłuż osi tunelu przed oceną pola odległościowego, co przekształca nieskończoną linię przestrzennej na krótkie powtarzające się segmenty. Scena musi opisać tylko pojedynczy pasek, ale ponieważ każda sekcja longitudynalna używa tej samej geometrii, wynik renderowany wygląda tak, jakby kontynuował się nieskończony.

Jak shader tworzy błyszczący efekt bez rzeczywistej źródła światła?

Zamiast oświetlać scenę symulowanym światłem i liczyć cienie, shader dodaje jasność do piksela na podstawie tego, jak blisko raymarched path przemknął obok błyszczącej powierzchni, nawet jeśli technicznie nie trafił. Punkty, które przechodzą blisko krawędzi pętli, akumulują łagodny blask proporcjonalny do odległości tej bliskiej trafiły, co jest znacznie tańsze niż prawdziwe rozpraszanie światła i daje charakterystyczne miękkie neonowe mglisty.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Neon Tunnel Simulation i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Neon Tunnel Simulation

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)