Strona głównaArtykułyRenderowanie

Tekstury Proceduralne: Szum, fBm & Komórki Worleya w GLSL

Marmur, drewno, lawa i chmury wygenerowane z niczego więcej niż matematyka wewnątrz fragment shader — bez plików obrazkowych, bez pamięci tekstury.

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

Tekstura proceduralna: szum, fBm i komórki Worleya w GLSL

Tekstura proceduralna jest generowana całkowicie z funkcji matematycznej wyewalizowanej dla każdego piksela, zamiast wyszukiwania jej z obrazu zapisywnego. Ta transakcja przynosi realne korzyści: nieskończona rozdzielczość bez rozmycia podczas powiększania, idealne nakładanie się bez widocznych szwów oraz zerowa przepustowość pamięci tekstury - cała szczegółowość powierzchni jest obliczana na nowo za każdym razem. Prawie każda tekstura proceduralna zaczyna się od tego samego elementu budującego: funkcji szumu, która mapuje współrzędne na gładkie wartości pseudo-random. Szum przypisuje losową wartość skalarową do każdego narożnika siatki i interpoluje między nimi; jest tani, ale ma tendencję do pokazywania delikatnego, blokowego artefaktu "poduszki" z powodu utraty informacji o gradientach na granicach komórki. Szum gradientowy – Perlin noise i jego wariant simplex – przypisują zamiast tego losowe wektory kierunkowe do narożników i interpolują iloczyn skalarnego między tym gradientem a przesunięciem do punktu próbki, co eliminuje pasmo i wygląda przekonująco organicznie.

perlinNoise(p):
  i = floor(p); f = fract(p)
  u = f*f*f*(f*(f*6 - 15) + 10)          // quintic fade — zero 1st & 2nd derivative
  a,b,c,d = dot(gradient(corner), offset)  for the 4 surrounding lattice corners
  return mix(mix(a,b,u.x), mix(c,d,u.x), u.y) * 0.5 + 0.5

Warstwianie oktaw: ruch Browna frakcyjny

Wykonanie pojedynczego wywołania szumu generuje wąską szerokość pasma częstotliwości – tak jak prawdziwe tereny, chmury i skały posiadają szczegóły na wielu skalach jednocześnie. fBm (ruch Browna frakcyjny) sumuje kilka oktaw tego samego funkcji szumu, każda z nich podwaja się w widzie (łaczność) i dzieli na amplitudzie (trwałość), wzorzec kontrolowany przez wykładnik Hurst. Podnoszenie trwałości do 0,6–0,7 wstrzykuje więcej energii o wysokiej częstotliwości dla szorstkiego, zarysującego terenu; obniżanie go do 0,4 produkuje gładką zmianę wariacji typową dla warstw chmur. Podwajanie dwóch prostych transformacji tego samego oktaw daje bardzo różne efekty: branie wartości bezwzględnej każdej oktawy przed zsumowaniem (szum fali) generuje nieregularną, przypominającą kalafiory teksturę chmur, podczas gdy złożenie jej jako 1 − |szum| (szum krawędziowy) przekształca łagodne wzgórza w ostre grzbiety górskie.

Szum Worleya: komórki zamiast kropel

W 1996 roku szum komórkowy Steve'a Worleego podążał zupełnie innym podejściem: rozrzucał losowy punkt cechy w każdej komórce siatki, a następnie dla każdego fragmentu obliczał odległość do najbliższego (F1) i drugiego najbliższego (F2). Tylko F1 daje wypełnione wieloboczne komórki, które wyglądają jak kostka brukowa; F2 - F1 podkreśla granice między komórkami, co jest dokładnie drobną siatką łusek gadów lub pęknięciami w wyschniętym błocie. Wystarczy sprawdzić otoczenie 3x3 komórek, aby zagwarantować znalezienie prawdziwego najbliższego punktu, o ile punkty cechy są losowo przesunięte o mniej niż pełną szerokość komórki.

demo na żywo · powiązana symulacja● LIVE

Od szumu do materiału: marmur, drewno i zdeformowane chmury

Materiały betonowe powstają poprzez zakłócanie prostego wzoru bazowego szumem. Marmur to wzór w postaci prążka o kształcie fali sinusoidalnej wzdłuż jednej osi, a wejście zniekształca turbulencja – odmiana fBm, która sumuje bezwzględną wartość każdego oktawy – przed obliczeniem fali sinusoidalnej, co wygina proste prążki w żyły. Kory drewno na podstawie promienia od punktu osi wzrostu, perturbuje go fBm tak, aby pachy nie były idealnymi kołami, a następnie progowy (threshold) część tego promienia zamienia na naprzemienne pasy jasne i ciemne. Najpotężniejszą techniką jest zniekształcanie domeny (popularizowaną przez Inigo Quileza): wyjście z jednej oceny fBm podawane jako przesunięcie do współrzędnych wejściowych kolejnej.

q = fbm(p) // pierwsza deformacja pola r = fbm(p + q * k) // druga deformacja, wykorzystująca pierwszą jako przesunięcie result = fbm(p + r * k) // ostateczny wzór – k ≈ 1–4 kontroluje siłę zniekształcenia Dwa lub trzy poziomy tej informacji zwrotnej przekształcają zwykły fBm w wirujące, organiczne detale widoczne w mgławicach, płomieniach, lawie i obcych terenach – kosztem wywołania fbm dwa lub trzy razy na piksel, co jest powodem, dla którego shadery mobilne często ograniczają się do 3–4 oktaw na wywołanie, aby pozostać w budżecie.

q = fbm(p)               // first warp field
r = fbm(p + q * k)        // second warp, using the first as an offset
result = fbm(p + r * k)   // final pattern — k ≈ 1–4 controls warp strength

Frequently asked questions

Dlaczego gradient (Perlin) szum jest preferowany zamiast szumu wartości?

Szum wartości interpoluje losowe skale znajdujące się w narożnikach siatki, co powoduje utratę informacji o nachyleniu na granicach komórki i generuje widoczny efekt blokowy lub przypominający poduszkę. Szum gradientu zamiast tego przypisuje każdy narożnik losowemu wektorowi kierunku i interpoluje iloczyn skalarny z przesunięciem do punktu próbkowania, co eliminuje paski i wygląda organicznie gładko.

Co kontroluje fBm i co się dzieje, jeśli zmieniam parametry?

fBm sumuje kilka oktaw tego samego funkcji szumu o rosnącej częstotliwości (lacunaryczność) i malejącej amplitudzie (długowieczność). Domyślne ustawienia podwajają częstotliwość i obniżają amplitudę o połowę w każdej oktawie. Podwyższenie długowieczności do 0,6–0,7 zachowuje więcej szczegółów wysokiej częstotliwości i generuje bardziej szorstki, szumowy teren; obniżenie go do 0,4 tworzy gładką, chmurkowatą zmianę.

Czy generowanie proceduralnych tekstur jest kosztowne dla GPU?

Każda oktawa szumu wiąże się z kilkoma operacjami hash i interpolacji, a efekty takie jak zniekształcanie domeny wywołują funkcję szumu wielokrotnie na piksel — podwójne zniekształcenie przy 5 oktach to 15 ocen funkcji szumu na fragment. Jest to tanio w porównaniu z próbkowaniem tekstury z pamięci, ale na urządzeniach mobilnych często ograniczane jest liczenie októw do 3–4 lub wraca się do szumu wartości, aby pozostać w budżecie.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz the 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ę the simulation

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)