Шум Перлина - Perlin noise
Шум Перлина это тип градиентный шум разработан Кен Перлин.
История
Кен Перлин развил шум Перлина в 1983 году в результате его разочарования в "машинном" виде компьютерные изображения (CGI) в то время.[1] Он официально описал свои выводы в СИГГРАФ газета 1985 г. называлась Синтезатор изображений.[2] Он разработал это в Mathematical Applications Group, Inc. (MAGI) для Дисней с компьютерная анимация научно-фантастический кинофильм Трон (1982). В 1997 году Перлин был удостоен награды Премия Оскар за технические достижения для создания алгоритма.[3] В 1997 году он выиграл Премия Оскар за технические достижения от Академия кинематографических искусств и наук за этот вклад в CGI.[4][5][6]
Кену Перлину за разработку Perlin Noise, техники, используемой для создания естественного внешнего вида. текстуры на компьютерных поверхностях для визуальных эффектов в кино. Разработка Perlin Noise позволила художникам, работающим с компьютерной графикой, лучше представить сложность природных явлений в визуальных эффектах для индустрии кино.
Перлин не подавал заявку на получение каких-либо патентов на алгоритм, но в 2001 году ему был предоставлен патент на использование 3D + реализаций симплексный шум за синтез текстуры. Симплексный шум имеет ту же цель, но использует более простую сетку, заполняющую пространство. Симплексный шум снимает некоторые проблемы с «классическим шумом» Перлина, в том числе вычислительную сложность и визуально значимые направленные артефакты.[7]
Использует
Шум Перлина - это процедурная текстура примитив, тип градиентный шум используется художниками по визуальным эффектам для увеличения реализма в компьютерная графика. Функция имеет псевдослучайный внешний вид, но все его визуальные детали одинакового размера. Это свойство позволяет легко управлять им; несколько масштабированных копий шума Перлина могут быть вставлены в математические выражения для создания множества процедурных текстур. Синтетические текстуры, использующие шум Перлина, часто используются в компьютерной графике, чтобы придать компьютерным визуальным элементам, таким как поверхности объектов, огонь, дым или облака, более естественный вид за счет имитации контролируемого случайного появления текстур в природе.
Он также часто используется для создания текстур, когда память чрезвычайно ограничена, например, в демонстрации. Его преемники, такие как фрактальный шум и симплексный шум, стали почти повсеместными в графические процессоры как для графика в реальном времени и для процедурных текстур не в реальном времени во всех видах компьютерной графики.
Деталь алгоритма
Perlin Noise - это функция, которая возвращает число от 0,0 до 1,0 для заданной координаты в N-измерениях. [8]
Шум Перлина чаще всего реализуется как двумерный, трехмерный или четырехмерный. функция, но может быть определен для любого количества измерений. Реализация обычно включает три этапа: определение сетки случайных векторов градиента, вычисление скалярное произведение между векторами градиента и их смещениями и интерполяцией между этими значениями. [9]
Определение сетки
Определить п-мерная сетка, в которой каждому пересечению сетки соответствует фиксированная случайная п-мерный вектор градиента единичной длины, за исключением одномерного случая, когда градиенты являются случайными скалярами между -1 и 1.
Скалярное произведение
Для определения значения любой точки-кандидата сначала находится уникальная ячейка сетки, в которой находится точка. Затем углы этой ячейки и связанные с ними векторы градиента идентифицируются. Затем для каждого угла вычисляется вектор смещения, представляющий собой вектор смещения от точки-кандидата к этому углу.
Для каждого угла берем скалярное произведение между его вектором градиента и вектором смещения до точки-кандидата. Это скалярное произведение будет равно нулю, если точка-кандидат находится точно в углу сетки.
Для точки в двумерной сетке это потребует вычисления 4 векторов смещения и скалярных произведений, в то время как для трех измерений потребуется 8 векторов смещения и 8 скалярных произведений. В целом алгоритм имеет масштабирование сложности.
Интерполяция
Последний шаг - интерполяция между точечные произведения. Интерполяция выполняется с помощью функции, которая сначала имеет ноль. производная (и, возможно, также вторая производная) на узлы сетки. Следовательно, в точках, близких к узлам сетки, выходные данные будут аппроксимировать точечное произведение вектора градиента узла и вектора смещения к узлу. Это означает, что функция шума будет проходить через ноль в каждом узле, придавая шуму Перлина характерный вид.
Если , пример функции, которая интерполирует значение в узле сетки 0 и значении в узле сетки 1
где плавный шаг функция была использована.
Функции шума для использования в компьютерной графике обычно производят значения в диапазоне [-1,0,1,0] и могут соответственно масштабироваться.
Выполнение
Ниже представлена двумерная реализация классического шума Перлина, написанная на C.
Первоначальная эталонная реализация Perlin была написана на Java с основными отличиями:
- он использует трехмерный подход, интерполируя между 8 углами куба вместо 4 углов квадрата ниже.
- случайное направление градиента перемешивает биты целочисленных координат углов, что намного быстрее, чем перемешивание с использованием интерференции при высокой частоте вращения целочисленных координат углов, объединенных и снова повернутых с высокой частотой с помощью продукта: вращения не являются равномерными распределены.
- Метод Перлина разбивает целочисленное пространство на кубы 256x256x256, а затем использует случайную перестановку этих кубов, чтобы перемешать их, а затем каждому углам положения куба назначается одно из двенадцати направлений соседним непереставленным кубам в пространстве мощения 4x4x4: для этого требуется только целочисленные операции, но сохраняет равномерное распределение направлений.
- функция интерполяции (названная
тускнеть
) является более плавным 4-градусным Плавный шаг (с первыми тремя производными равными нулю на границах зажима), а не основной линейный шаг. Это позволяет избежать видимых артефактов, особенно вдоль вершин или диагоналей, соединяющих углы выборки, где результат будет явно анизотропным (испортить желаемый белый шум в розовый шум; если бы шум использовался для создания твердого кристалла, он был бы не полностью черным и непрозрачным для света, а частично прозрачным и окрашенным в некоторых дискретных направлениях наблюдения).
Таким образом, приведенный ниже код является очень простым и предназначен только для иллюстрации, будет медленным и непригодным для использования в приложениях.
#включают <math.h>/ * Функция для линейной интерполяции между a0 и a1 * Вес w должен быть в диапазоне [0,0, 1,0]. */плавать интерполировать(плавать а0, плавать а1, плавать ш) { / * // Вы можете захотеть зажать, вставив: * если (0.0> w) return a0; * если (1.0 */ возвращаться (а1 - а0) * ш + а0; / * // Вместо этого используйте эту кубическую интерполяцию [[Smoothstep]] для гладкого внешнего вида: * return (a1 - a0) * (3.0 - w * 2.0) * w * w + a0; * * // Используйте [[Smootherstep]] для еще более гладкого результата со второй производной, равной нулю на границах: * return (a1 - a0) * (x * (w * 6.0 - 15.0) * w * w * w + 10.0) + a0; */}typedef структура { плавать Икс, у;} vector2;/ * Создаем случайный вектор направления */vector2 randomGradient(int ix, int иу) { // Случайное число с плавающей запятой. Отсутствие предварительно вычисленных градиентов означает, что это работает для любого количества координат сетки плавать случайный = 2920.f * грех(ix * 21942.f + иу * 171324.f + 8912.f) * потому что(ix * 23157.f * иу * 217832.f + 9758.f); возвращаться (vector2) { .Икс = потому что(случайный), .у = грех(случайный) };}// Вычисляет скалярное произведение векторов расстояния и градиента.плавать dotGridGradient(int ix, int иу, плавать Икс, плавать у) { // Получаем градиент из целочисленных координат vector2 градиент = randomGradient(ix, иу); // Вычислить вектор расстояния плавать dx = Икс - (плавать)ix; плавать dy = у - (плавать)иу; // Вычислить скалярное произведение возвращаться (dx*градиент.Икс + dy*градиент.у);}// Вычислить шум Перлина в координатах x, yплавать Перлин(плавать Икс, плавать у) { // Определение координат ячейки сетки int x0 = (int)Икс; int x1 = x0 + 1; int y0 = (int)у; int y1 = y0 + 1; // Определяем веса интерполяции // Здесь также можно использовать полином / s-кривую более высокого порядка плавать sx = Икс - (плавать)x0; плавать сы = у - (плавать)y0; // Интерполяция градиентов точек сетки плавать n0, n1, ix0, ix1, ценить; n0 = dotGridGradient(x0, y0, Икс, у); n1 = dotGridGradient(x1, y0, Икс, у); ix0 = интерполировать(n0, n1, sx); n0 = dotGridGradient(x0, y1, Икс, у); n1 = dotGridGradient(x1, y1, Икс, у); ix1 = интерполировать(n0, n1, sx); ценить = интерполировать(ix0, ix1, сы); возвращаться ценить;}
Перестановка
Многие реализации шума Перлина используют тот же набор перестановок, который Кен Перлин использовал в своей исходной реализации.[10] Эта реализация выглядит следующим образом:
int перестановка[] = { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 };
Эта конкретная перестановка не является абсолютно необходимой, хотя она требует рандомизированного массива значений [0–255] (включительно). При создании новой таблицы перестановок следует позаботиться о равномерном распределении значений.[11]
Сложность
Для каждой оценки функции шума скалярное произведение векторов положения и градиента должно оцениваться в каждом узле содержащейся ячейки сетки. Поэтому шум Перлина масштабируется со сложностью за размеры. Альтернативы шуму Перлина, дающему аналогичные результаты с улучшенным масштабированием сложности, включают симплексный шум и OpenSimplex шум.
Смотрите также
Рекомендации
- ^ Перлин, Кен. "Шуметь". noisemachine.com. Кен Перлин. Архивировано из оригинал 8 октября 2007 г.
- ^ Перлин, Кен (июль 1985). «Синтезатор изображений». SIGGRAPH Comput. График. 19 (97–8930): 287–296. Дои:10.1145/325165.325247.
- ^ Оригинальный исходный код
- ^ Керман, Филипп. Macromedia Flash 8 @work: проекты и методы для выполнения работы. Самс Паблишинг. 2006 г. ISBN 9780672328282.
- ^ В архиве 2018-05-01 в Wayback Machine функции когерентного шума Кена Перлина
- ^ Густавсон, Стефан. "Демистификация симплексного шума" (PDF). Получено 24 апреля 2019.
- ^ Патент США 6867776, Кеннет Перлин, «Стандарт шума Перлина», выпущенный 15 марта 2005 г., передан Kenneth Perlin и Wsou Investments LLC.
- ^ Шум Перлина, Брайан Макклейн
- ^ Густавсон, Стефан. "Демистификация симплексного шума" (PDF). Получено 24 апреля 2019.
- ^ Перлин, Кен. "Шум Перлина". Получено 26 августа 2020.
- ^ "Шум Перлина: Часть 2". Получено 26 августа 2020.
внешняя ссылка
- Часто задаваемые вопросы по математике шума Perlin от Мэтта Цукера
- Учебник Роба Фарбера, демонстрирующий генерацию и визуализацию шума Perlin на графических процессорах с поддержкой CUDA
- Обширная библиотека C ++ Джейсона Бевинса для генерации сложных, когерентных значений шума
- Реализация PHP (гитхаб)
- Подробное объяснение шума Перлина (с исходным кодом на C ++)
- Книга шейдеров Патрисио Гонсалеса Виво и Джен Лоу
- Онлайн-генератор шума Перлина