Почему все алгоритмы Simplex Noise имеют таблицу Permutation & Gradient?

Я пытался внедрить Simplex Noise уже около месяца, и я понимаю идею работы с Simplices, чтобы уменьшить количество необходимых вычислений, а также обеспечить безопасную мощность на стороне градиента. Однако реализация этого на любом языке кажется невыполнимой миссией.

В каждом, каждом, каждом коде, который я нахожу, ресурсе, который я читаю, везде код, кажется, имеет таблицы G и P. Из некоторого поиска в Google и расспросов я узнал, что это таблица Permutation и Gradients. Что они делают? Зачем они нам нужны?

Моя текущая мысль заключается в том, что таблица перестановок просто содержит случайные значения, поэтому их не нужно вычислять во время выполнения.

Примеры:


person Jeroen    schedule 14.09.2013    source источник


Ответы (2)


Путаница между симплексом, шумом перлина и их гибридом очень распространена в Интернете на данный момент. Самая известная и цитируемая статья, которую я знаю, — это Стефана Густавсона. В нем г-н Густавсон говорит следующее

Я буду использовать гибридный подход для ясности, используя метод градиентного хеширования из классического шума, но симплексную сетку и прямое суммирование шумовых вкладов симплексного шума.

Таким образом, в результате получается не симплексный шум и не шум Перлина, а скорее смешанный или гибридный алгоритм шума, который имеет некоторые черты обоих».

Шум Перлина — это классический шум, и он использует предопределенные (сгенерированные каким-то образом) векторы градиента и таблицу перестановок (которые содержат индексы таблицы градиентов). Таким образом, чтобы получить градиент из координаты (x, y, z), вы применяете какую-то хэш-функцию, классический шум Перлина просто использует модуль, а затем вы берете индекс из таблицы перестановок, которая, в свою очередь, дает вам другой индекс, который вы используете для захвата градиента со стола. Использование операции по модулю в качестве хэш-функции мгновенно дает повторяющийся характер шума Перлина.

Таблица перестановок выглядит примерно так; [0, 1, 2, ..., sizeof(gradient_table) - 1].

Симплексный шум запатентован (по крайней мере, для генерации текстур в 3D и выше), и его алгоритм описан здесь. . Симплексный шум использует два уникальных изобретения, чтобы отличить его от шума Перлина.

1) Нет таблицы градиентов и таблиц перестановок. Вместо этого градиенты генерируются «на лету» с помощью алгоритма битовой манипуляции.

2) Вместо координатной сетки, состоящей из квадрата (в 2D), она состоит из простейшей геометрической формы, который замостил плоскость. В 2D это треугольник, в 3D тетраэдр. Эта координатная сетка уменьшает видимые артефакты сетки.

Есть также некоторые незначительные, но все же очень важные особенности симплексного шума, которые делают его гораздо более элегантным алгоритмом. Например, внутренние продукты не создаются, поскольку все вклады вершин вносятся с использованием сферического ядра. Даже преобразование между простой координатной сеткой и декартовой (или нормальной) оптимизировано до одного умножения, что делает преобразование очень дешевым.

В качестве беззастенчивой саморекламы я предоставлю ссылку на мой репозиторий функции шума, в котором я пытаюсь реализовать все максимально правильно. Цель состоит в том, чтобы предоставить какую-то стандартную кросс-платформенную реализацию множества шумовых функций.

person Entalpi    schedule 26.04.2017

По сути да, таблица P используется для выбора случайного градиента из таблицы G. Однако важно, чтобы это повторялось. То есть в случае с 3D для данной тройки (i,j,k) вам нужно всегда иметь возможность создавать один и тот же «случайный» градиент. Это то, что делает шумовую функцию когерентной. Таким образом, весь смысл формулы, в которой выполняется несколько поисков в таблице P, заключается в том, что результат выглядит случайным, но детерминированным для заданного ввода.

Если бы вас не беспокоила производительность, вы могли бы так же легко использовать (i,j,k) для заполнения генератора псевдослучайных чисел, а затем использовать его для выбора градиента из таблицы G.

person Cosmologicon    schedule 19.09.2013
comment
Таким образом, значение перестановки теоретически определяет индекс вашей таблицы градиентов? - person Jeroen; 19.09.2013