Симплекс-шум
Симплекс-шум (англ. Simplex noise) — метод побудови n-вимірної функції шуму, подібно до шуму Перлина («класичного шуму»), але з меншою кількістю артефактів і кращою продуктивністю. Кен Перлин розробив алгоритм у 2001 році щоб усунути обмеження класичної функції шуму, особливо за великої кількості вимірів.
Переваги симплекс-шуму над шумом Перлина:
- Симплекс-шум має меншу обчислювальну складність і вимагає менше операцій множення.
- За більшої кількості вимірів (4D, 5D) симплекс-шум є продуктивнішим, складність — для вимірів, в той час як у класичного шуму — .[1]
- Симплекс-шум не має помітних артефактів (візуально вони ізотропні), проте шум, згенерований для різних вимірів візуально відрізняється (наприклад, двовимірний шум виглядає інакше, ніж переріз тривимірного шуму; вигляд погіршується зі збільшенням кількості вимірів).
- Симплекс-шум має добре визначений неперервний градієнт, який обчислюється доволі швидко.
- Симплекс-шум легко реалізувати на машинному рівні.
В той час як класичний шум інтерполює значення градієнтів вузлових точок сітки (тобто північно-східного, північно-західного, південно-східного й південно-західного для двовимірної сітки), симплекс-шум поділяє простір на симплекси (тобто -вимірні трикутники). Це зменшує кількість вузлів. Гіперкуб у вимірах має кутів, симплекс — лише . У 2D трикутники рівносторонні, але за більшої кількості вимірів симплекси лиш близькі до правильної форми.
Симплекс-шум корисний для програм комп'ютерної графіки, які будують шуми для двох, трьох, чотирьох чи п'яти вимірів. За більшої кількості вимірів n-вимірні сфери навколо кутів симплекса знаходяться недостатньо щільно, тим самим занулюючи функцію на вільних ділянках простору.
Симплекс-шум зазвичай реалізують як дво-, три-, чи чотиривимірну функцію, проте він може бути визначений для довільної скінченної кількості вимірів. Реалізація складається з чотирьох кроків: відхилення координат, поділ на симплекси, вибір градієнта і сумування ядер.
Вхідні координати трансформують за допомогою формули:
де
Результатом є розміщення координати на решітці A*n, яка, по суті, є розміщенням вершин стільникового гіперкуба, розплющеного вздовж своєї головної діагоналі настільки, щоб відстань між точками (0, 0, …, 0) і (1, 1, …, 1) дорівнювала відстані між (0, 0, …, 0) і (1, 0, …, 0).
Вихідні координати (x', y', …) дозволяють визначити, в яку комірку зміщеного одиничного гіперкуба потрапляє вхідна точка, (xb'=floor(x'), yb'=floor(y'), …), і її внутрішні координати (xi'=x'-xb', yi'=y'-yb', …).
Коли вищезгадане визначено, значення внутрішніх координат (xi', yi', …) сортуються за спаданням, щоб визначити, якій ортосхемі Шлефлі симплекса належить точка. Тоді результуючий симплекс складають з вершин, що відповідають впорядкованому обходу від (0,0, …, 0) до (1, 1, …, 1), і є n! варіантів, що можуть відповідати одній перестановці координат. Іншими словами, починаємо від нульової координати, потім послідовно додаємо ті, що відповідають найбільшому значенню внутрішньої координати, закінчуючи відповідником найменшого значення.
Наприклад, точка (0.4, 0.5, 0,3) буде лежати всередині симплекса з вершинами (0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 1, 1). Значення по осі ординат найбільше, тому визначення координат симплекса починатимемо з нього. Потім збільшуємо значення по осі абсцис, і так далі.
Кожна вершина симплекса додається до базової координати відхиленого гіперкуба, потім хешується у псевдовипадковий градієнтний вектор. Хеш можна реалізувати багатьма способами.
Варто звертати увагу на вибір множини градієнтів, щоб мінімізувати появу артефактів.
Внесок кожної з n+1 вершин симплекса враховується за допомогою суми радіально симетричних ядер з центром у кожній вершині. Спочатку за допомогою оберненої формули визначаються невідхилені координати:
де
Ця точка віднімається від вхідних координат, щоб отримати невідхилений вектор переміщення. Цей вектор потрібен для двох цілей:
- Порахувати екстрапольоване значення градієнта з використанням скалярного добутку
- Визначити d2, квадрат відстані до точки
Далі внесок ядра кожної суми визначається з рівняння
де r2 зазвичай обирають рівним 0,5 чи 0,6. 0,5 забезпечує відсутність розривів, в той час як 0,6 може покращити зовнішній вигляд у застосунках, де розриви непомітні. 0,6 використовувався у оригінальній реалізації Кена Перлина.
Використання реалізації у 3D and higher для textured image synthesis покривається патентом U.S. Patent 6 867 776, якщо алгоритм реалізований з використанням специфічних методик, описаних у будь-якому з пунктів патенту.
- ↑ Ken Perlin, Making noise. Based on a talk presented at GDCHardcore (Dec 9, 1999). (url) [Архівовано 17 лютого 2015 у Wayback Machine.]