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