Czym jest WebGL? Jak symulacje 3D działają w Twojej przeglądarce

Jak strona internetowa renderuje 80 000 obracających się gwiazd przy 60 klatkach na sekundę — albo symuluje płyn z 10 000 oddziałujących ze sobą cząstek — bez instalowania czegokolwiek? Odpowiedź prostym językiem dla ciekawych uczniów i nauczycieli.

Krótka odpowiedź

Twój GPU — układ graficzny — to masowo równoległy komputer, do którego przeglądarka ma bezpośredni dostęp poprzez znormalizowane API o nazwie WebGL. Symulacje na tej stronie oddają obliczenia fizyczne i rysowanie pikseli GPU, który jest setki razy szybszy w tego typu pracy niż CPU wykonujący Twój JavaScript.

Nie zauważasz tego przejścia. Otwierasz kartę, symulacja startuje. Ale za kulisami Twoja przeglądarka skompilowała małe programy nazywane shaderami, wysłała tysiące liczb do dedykowanej pamięci GPU i weszła w pętlę odpalającą się 60 razy na sekundę.

Bez instalacji, bez wtyczki, bez aplikacji. WebGL jest wbudowany w każdą główną przeglądarkę od 2011 roku. Każda symulacja na tej stronie działa całkowicie wewnątrz przeglądarki, korzystając ze sprzętu, który już masz w komputerze, tablecie czy telefonie.

CPU vs GPU — jaka jest różnica?

CPU (główny procesor) jest zoptymalizowany do szybkich, sekwencyjnych zadań — wykonywania jednej złożonej instrukcji po drugiej. Nowoczesny CPU ma 8–24 rdzenie.

GPU jest zoptymalizowany do wykonywania wielu prostych zadań równolegle. Typowy GPU laptopa ma 1000–4000 rdzeni. Każdy rdzeń jest wolniejszy niż rdzeń CPU, ale gdy trzeba wykonać to samo obliczenie dla tysięcy cząstek jednocześnie — zaktualizować ich pozycje, sprawdzić kolizje, obliczyć kolory — GPU wygrywa z ogromnym marginesem.

Właściwość CPU GPU
Liczba rdzeni 8–24 (konsumenckie) 1000–10 000+
Taktowanie 3–5 GHz 1–2 GHz
Najlepszy do Logiki sekwencyjnej Danych równoległych
Typ pamięci RAM (współdzielona) VRAM (dedykowana)
Używany do symulacji? Logika fizyki, AI Renderowanie, obliczenia

Potok WebGL

Każda klatka symulacji 3D przechodzi przez tę samą sekwencję kroków. Oto, co dzieje się między „JavaScript aktualizuje fizykę" a „fotony opuszczają Twój ekran":

  1. 1
    JavaScript wysyła dane
    Pozycje, kolory i rozmiary cząstek są pakowane w typowane tablice (Float32Array) i wysyłane do pamięci GPU (VRAM) za pomocą wywołań buforów WebGL.
  2. 2
    Vertex shader — raz na punkt
    Mały program (kod GLSL) działa na każdej cząstce jednocześnie. Przekształca 3D współrzędne świata na 2D współrzędne ekranu przy użyciu algebry macierzy.
  3. 3
    Rasteryzacja — z 3D na piksele
    GPU ustala, które piksele ekranu pokrywa każdy trójkąt lub punkt. Ten krok jest w pełni automatyczny i zachodzi w dedykowanym sprzęcie o stałej funkcji.
  4. 4
    Fragment shader — raz na piksel
    Kolejny program GLSL decyduje o ostatecznym kolorze każdego piksela — oświetlenie, tekstura, przezroczystość, efekty poświaty. Wszystko zachodzi jednocześnie na tysiącach pikseli.
  5. 5
    Klatka zamieniona na ekranie
    Ukończona klatka jest wyświetlana. requestAnimationFrame wywołuje pętlę ponownie — idealnie 60 razy na sekundę, zsynchronizowane z częstotliwością odświeżania monitora.

Czym jest shader?

Shader to mały program napisany w GLSL (Graphics Library Shading Language), który działa bezpośrednio na GPU. Shadery nie mają console.log, pętli po tablicach ani sposobu komunikacji między równoległymi instancjami — każda z nich przetwarza swój własny punkt danych w całkowitej izolacji.

To ograniczenie sprawia, że są szybkie. GPU może uruchomić 4000 instancji fragment shadera jednocześnie, bo nie dzielą one między sobą żadnego stanu.

Three.js — WebGL bez złożoności

Surowy WebGL wymaga ręcznego napisania całego potoku. Większość symulacji na tej stronie korzysta z Three.js, biblioteki JavaScript, która obsługuje szablonowy kod — kamerę, graf sceny, pomocnicze funkcje geometrii, wbudowane materiały — jednocześnie pozwalając pisać własne shadery, gdy są potrzebne.

Prostsze symulacje 2D (automaty komórkowe, dyfuzja, niektóre symulacje fal) używają zamiast tego Canvas 2D API — wolniejszego, ale prostszego API do rysowania dla przypadków, które nie potrzebują pełnego potoku GPU.

Wypróbuj: symulacje pokazujące GPU w akcji