Zakłócenie stworzone z odległości, nie gradientów
Worley noise — zaproponowane przez Stevena Worley'ego w 1996 roku i również nazywane cellular noise — podchodzi do generowania zakłóceń zupełnie inaczej niż Perlin's gradient noise. Rozrzucamy zestaw losowych punktów cech po płaszczyźnie, a następnie dla każdego piksela szukamy odległości do najbliższego punktu cech i używamy tej odległości jako wartości zakłócenia. Wynik nie jest gładki i chmurkowy; jest cellular — każdy punkt cech ma region wokół siebie, a granice między obszarami tworzą ostre lub łagodne krawędzie w zależności od wybranej metryki odległości i zrankowanej sąsiedni punktu.
F1, F2 i algebra między nimi
Konwencja zakłada obliczanie dla każdego piksela uporządkowanego listy odległości do punktów cech: F1 to odległość do najbliższego punktu, F2 – do drug najbliżejgo, a dalej tak dalej. Używanie tylko F1 powoduje tworzenie wzoru podobnego do Voronoi, gdzie każda komórka jest około jednolitej koloru, który się zasłania w centrum i oświetla na granicy – to od czego zaczynają się tekstury kamienne, pęknięte gliny i organiczne komórkowe. Kombinując F1 i F2 otwieramy całą inną rodzinę: F2 − F1 tworzy jasne, cienkie linie dokładnie wzdłuż granic komórek Voronoi (wartość jest równa zero tylko tam, gdzie piksel jest równo oddalony od dwóch punktów cechowych), co jest standardowym technikiem do tworzenia procedywnych tekstur pękniętego ziemi, skali żółwia i okładkowych szklanych.
for each pixel p: distances = sort([ dist(p, feature_i) for feature_i in nearby_points ]) F1 = distances[0] F2 = distances[1] value = F1 // classic cellular blobs value = F2 - F1 // bright cell-boundary lines (~0 at edges) value = F1 * F2 // sharper, more contrasted cell interiors
Metryki odległości zmieniają kształt komórek całkowicie
Wszystko powyżej zakłada metrykę euklidesową, która tworzy znajome, organiczne kształty komórek. Zamiast niej użycia metryki Manhattan (|Δx| + |Δy|) daje kwadratowe komórki z prostymi, ostrymi brzegami; metryka Chebyshev (max(|Δx|, |Δy|)) tworzy kwadratowe komórki. Jeden tylko parametr jest wystarczający, aby przenieść tą samą podstawową algorytmikę od "wygląda na komórkę biologiczną" do "wygląda na płytę elektroniczną" lub "wygląda na ceramiczę płytkę z rysami", bez zmiany umieszczenia punktów cechowych.
Szybkość: funkcja punktów zdefiniowanych w kubikach
Implementacja prosta sprawdza każdy piksel przeciwko każdemu punktowi cechowego na całym obrazie — O(piksele × punkty). Na naprawdę dużej rozdzielczości jest niemożliwa. Standardowe rozwiązanie polega na tym samym triku z przestrzenną haszowaniem używanym w całości grafiki komputerowej: podzielić płaszczyznę na siatkę komórek, zapewnić, że każda komórka ma co najwyżej jeden (lub małą ustaloną liczbę) losowych punktów cechowych, używając haszowania współrzędnych komórki jako siedmiotkanu, a dla każdego zapytującego piksela sprawdzić tylko punkty cechowe w swojej własnej komórce siatki i osiem bezpośrednich sąsiadów. Ponieważ gęstość punktów cechowych jest ograniczona przez konstrukcję na każdym komórkowym poziomie, to zmniejsza koszt na piksel O(punktów) do O(1). I krytycznie, ponieważ punkty cechowe są wygenerowane z haszowania współrzędnych siatki, a nie przechowywane w tablicy, szum jest nieskończony, bezpiecznie powtarzalny i nie wymaga wcześniejszej tabeli przeszukiwania.
// bucketed Worley — check only the pixel's own cell + 8 neighbours
function nearestFeatureDist(p) {
const cell = floor(p / cellSize);
let best = Infinity;
for (let dy = -1; dy <= 1; dy++)
for (let dx = -1; dx <= 1; dx++) {
const c = cell + [dx, dy];
const feature = hashToPoint(c); // deterministic per-cell pseudo-random point
best = Math.min(best, dist(p, feature));
}
return best;
}
Gdzie jest widoczne
Worley noise stanowi standardową technikę za tkaninami kamiennej i skał, kąpieliste ciepła wody i wzory foama, szerszeń organicznych komórek błon i shaderów tkanki biologicznej, a także — warstwowo na wielu skalach tak jak warstwowanie ruchomego ruchu brzmieniowego Perlin noise – pękniętego glinu, suchych łoża jeziorek i skóry girafów. Dobrze się komponuje z przekrzywaniami dziedziny (wprowadzając współrzędne przez jedno funkcję noise przed próbkowaniem innej), aby rozpraszyc inaczej bardzo regularny, równomiernie odstępowany wygląd powodowany przez umieszczenie dokładnie jednego punktu cechy na każdym komórce siatki.
Często zadawane pytania
Jak się różni Worley noise od Perlin noise?
Perlin noise interpoluje gładkie gradienty między punktami siatki, tworząc miękkie, chmurowe zmiany. Wśród innych handluje Worley noise od odległości każdego piksela do najbliższego ze zbioru rozrzutnego punktów cechowych, tworząc wzory cywilacyjne podobne do diagramów Voronoi z wyraźnymi obszarami i granicami — wygląda fundamentalnie inaczej, choć oba są powszechnymi komponentami tekstur procedurywnych.
Co daje mi F2 minus F1, a dlaczego jest to użyteczne?
F1 to odległość do najbliższego punktu cechowego, a F2 do drugiej najbliższego. F2 - F1 zbliża się tylko do zera w punktach równoodległych od dwóch punktów cechowych — co dokładnie jest brzegiem między komorami diagramu Voronoi — więc ta kombinacja rysuje jasne, delikatne linie na krawędziach komórek, standardowy sposób tworzenia tekstur podobnych do łamanych ziemi i skalek ryb.
Jak Worley noise jest dostosowany do szybkich obrazów w czasie rzeczywistym?
Poprzez grupowanie punktów cechowych w siatkę przestrzenną oraz wyznaczanie punktu cechowego dla każdej komórki na podstawie hasha współrzędnych komórki zamiast przechowywania punktów w tablicy. Wtedy piksel musi sprawdzić tylko swoją komórkę siatki i osiem sąsiednich, co daje koszt O(1) dla każdego piksela zamiast porównywania do każdego punktu cechowego na obrazie.
Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Worley Noise Texture Generator 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ę Worley Noise Texture Generator