Почему у симплексного шума есть * больше артефактов, чем у классического шума Perlin?

Я прочитал Stefan Gustavson превосходную статью о симплекс-шуме, в которой мне было обещано, что:

Симплексный шум не имеет заметных направленных артефактов

в отличие от "классического" шума Perlin. Я взволнованно реализовал его, чтобы выяснить, что противоположность оказалась правдой. Я вижу артефакты в классическом шуме, но я вижу, по крайней мере, столько артефактов в симплексном шуме, выровненном под углом 45 градусов к основным осям. Они особенно заметны, когда вы сопоставляете шум с шаговой функцией.

Чтобы гарантировать, что это не проблема с моей реализацией, я использовал кто-то другой вариант JavaScript. Сравните некоторые изображения:

И здесь галерея со всеми из них. В этом последнем изображении найдите границы, которые выровнены на 45 градусов по горизонтали/по вертикали. Они повсюду. Я могу выделить некоторые из них, если нужно, но они кажутся мне действительно очевидными. (И снова, я вижу их и в классическом шумовом изображении.)

EDIT: чтобы быть более количественным, я выбрал 1 миллион случайных точек, и для каждой точки я численно вычислил градиент как классического, так и симплексного шума и взял гистограмма направления градиента, проецируемого на плоскость xy. Если бы не было направленных артефактов, график был бы плоским. Но вы можете видеть, что как классический, так и симплексный шум скапливаются каждые 45 градусов.

Это проблема с алгоритмом симплекс-шума? Это что-то, что можно исправить? Или я единственный, кто считает это проблемой?

Ответ 1

Я просто прочитал газету, и я думаю, что у меня есть идея, что может вызвать артефакты. Градиенты для каждой вершины сетки псевдослучайно выбираются из довольно небольшой таблицы поиска. Как утверждает Густавсон на стр. 3:

"Хорошим выбором для 2D и выше является выбор градиентов единичной длины, но разных направлений. Для 2D, 8 или 16 градиентов, распределенных вокруг единичного круга, является хорошим выбором".

Это был метод, используемый в классическом шуме Perlin, который не, что Перлин предложил для симплексного шума в своей статье 2001, стр. 14

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

Однако, Gustavson заявляет на стр. 7:

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

Его 2D-реализация фактически использует 12 градиентов из таблицы 3D-градиента, отбрасывая координату z. В этой схеме краевые координаты используются дважды, но углы используются только один раз, что, как представляется, приводит к смещению с интервалом в 90 градусов. Но это не актуально в вашем случае, поскольку в реализации, которую вы используете, имеется только 8 градиентов, что наводит на мысль о смещении с интервалом в 45 градусов. Вероятность видимых моделей, возникающих из такой минимальной дисперсии, кажется довольно высокой. Но это будет легко адаптировать этот алгоритм для 16 градиентов, используя таблицу перестановки mod 16, которая должна значительно уменьшить направленность артефактов.

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

EDIT:

Еще один момент, который я только что понял, угловые градиенты, такие как (1,1), не имеют единичной длины, они являются sqrt (2). Первая цитата дает понять, что градиенты должны лежать на единичном круге. Это может быть еще одним источником предвзятости. Интересно, что Gustavson также использует эти не-единицы градиенты.

Ответ 2

Версия перлин-шума со значениями шума создает также некрасивые прямые линии, а версия перлина с градиентным шумом производит вещи немного более округлые, поэтому, возможно, у вас есть реализация симплексного шума, а не градиентная версия.

В противном случае интерполяционный градиент в вашем коде неверен, потому что он производит такие angular переходы между квадрантами. Это должно быть область, которая не так. в Интернете говорят, что симплексный шум не только быстрее, но и что градиенты более округлые.

Я понимаю, что это означает, что углы интерполяционных кривых являются более круглыми. Возможно, кто-то неправильно понял утверждение Кена Перлинса по этому вопросу, и что он просто сказал, что градиент содержал меньше джиттера (извините за использование неправильного описания), потому что код на самом деле не производит идеальную математическую кривую, такую как синус, если вы умножаете вместе со многими Perlin я обнаружил, что неоднородности джиттера/кривой достаточно сильны для измерения, что не относится к синусоидальным волнам и математическим функциям. чтобы вы могли исследовать в Интернете комментарии других людей о градиенте симплексного шума.

Я думаю, что есть таблица поиска градиента, которая в вашем случае, кажется, поднимается до 45 'довольно часто, в противном случае кривая оценки, которую вы используете между 2 точками, слишком далека от идеализированной синусоидальной кривой, которая могла бы привести к округлению формы и никаких прямых линий, но это вычисление менее легко, особенно на процессоре. Я думаю, что на GPU понятно, что синусный градиент быстрее, чем используемая кривая полиномиального градиента.

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

улучшен шум Perlin для GPU из scrawkblog IMG