Шум створений на відстані, а не градієнтами
Шум Worley — винайдений Стівеном Вотлі в 1996 році та також відомий як клітинний шум — використовує повністю інший підхід, ніж градієнтний шум Перліна. Розподіліть набір випадкових точок ознак по площині, а потім для кожного пікселя знайдіть відстань до найближчої точки ознаки та використовуйте цю відстань як значення шуму. Результат не є плавним і схожим на хмару; він є клітинним — кожна точка ознаки володіє областю навколо неї, а межі між областями утворюють гострі або м’які краї в залежності від того, який ви використовуєте показник відстані та якого рангового сусіда.
Цей метод особливо добре підходить для симуляцій, де важливо точно відображати геометрію на великих відстанях. Він також може бути використаний для створення цікавих візуальних ефектів у іграх або інших застосунках.
F1, F2 и алгебра между ними
Конвенция заключается в вычислении для каждого пикселя отсортированного списка расстояний до точек признаков: F1 — расстояние до ближайшей точки, F2 — расстояние до второй ближайшей и так далее. Использование только F1 создает похожий на Вено́еву ячейку узор, где каждая ячейка приблизительно имеет однородный цвет, темнеющий к центру и светлеющий на границе — это то, с чего начинают текстуры из потрескавшейся земли, глина или органических клеток. Объединение F1 и F2 открывает совершенно другую семью: F2 − F1 создает яркие, тонкие линии точно вдоль границ ячейки Вено́евой структуры (значение равно нулю только там, где пиксель находится на одинаковом расстоянии от двух точек признаков), что является стандартной техникой для процедурных текстур потрескавшейся земли, чешуи рептилии и витражей.
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
Зміни в метриках відстаней повністю змінюють форму клітини
Все вище припускає використання евклідової відстані, що дає звичні округлі та органічні форми клітин. Заміна на метрику Манхеттену (|Δx| + |Δy|) створює діаманбоподібні клітини з прямими, кутовими межами; використання метрики Чебишева (max(|Δx|, |Δy|)) дає квадратні клітини. Зміна лише цього одного параметра може перетворити ту ж саму основну алгоритмічну систему з «вигляду біологічних клітин» на «вигляд мікросхем», або «вигляд трісканого керамічного плитки», не змінюючи розташування точок.
Оптимізація швидкості: групування точок ознак
Наївна реалізація перевіряє кожен піксель проти кожної точки ознаки в усій зображенні — O(пікселі × точки), що є безглуздим для будь-якого реального розділення. Стандартне рішення таке саме, як і використання просторового хешування в комп'ютерній графіці: поділити площину на сітку клітин, гарантуючи не більше однієї (або невелику фіксовану кількість) випадкових точок ознак на кожну клітину сітки за допомогою хешування координат клітини як ключа, і для будь-якого запиту пікселя перевіряються лише точки ознак у його власній клітинці та в її восьми безпосередніх сусідах. Оскільки щільність точок ознак обмежена на кожну клітину за конструкцією, це зменшує вартість на піксель з O(точки) до O(1) — і, що найважливіше, оскільки точки ознак отримуються за допомогою хешування координат сітки, а не зберігаються в масиві, шум є безмежним, безперервно пливає та не потребує попереднього обчислення таблиці пошуку.
// 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;
}
Де це проявляється
Шум Ворлі є стандартною технікою, що стоїть за процедурними каменями та скельними текстурами, водним каустиком і пінними візерунками, шейдерами мембран клітин організмів і біологічних тканин, а також — укладеними на кількох рівнях, як фрактальний броунівський рух, що поєднується з шумом Перліна, розбитий грязю, сухим берегом озера та шкірою зі вставками жирафі. Він добре поєднується з деформацією домену (подаючи координати через одну шумову функцію перед відбором іншої) для руйнування надмірно регулярного та рівномірно розподіленого вигляду, який виникає при розміщенні лише однієї точки ознаки на кожній комірці сітки.
Frequently asked questions
Яка різниця між шумом Worley та шумом Perlin?
Шум Perlin інтерполює плавні градієнти між сітчастими точками, створюючи м'які, хмарні варіації. Шум Worley замірює відстань від кожного пікселя до найближчого з набору розкиданих ознакових точок, що дає комірки, схожі на віроноєві, із чітко визначеними областями та межами — він принципово відрізняється, незважаючи на те, що обидва є поширеними будівельними блоками для процедурних текстур.
Що дає F2 мінус F1 і чому це корисно?
F1 – відстань до найближчої ознакової точки, а F2 – відстань до другої найближчої. F2 - F1 наближається до нуля лише в точках, які знаходяться на однаковій відстані від двох ознакових точок, що є точно межею між віроновими комірками — таким чином, ця комбінація створює яскраві, тонкі лінії вздовж країв комірок, стандартну техніку для текстур з тріщинами та рептильних малюнків.
Як Worley noise роблять достатньо швидким для реального часу?
Розділяючи ознакові точки на просторову сітку та виводячи ознаку кожної комірки з хешу координат комірки замість зберігання точок в масиві. Пікселю потрібно лише перевірити власну сітчасту комірку та її вісім сусідів, що дає вартість O(1) на піксель замість порівняння з кожною ознаковою точкою на зображенні.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Worley Noise і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Worley Noise