Почему симплексный шум имеет * больше * артефактов, чем классический шум Перлина?
Я прочитал отличную статью Стефана Густавсона о симплексном шуме, в которой мне было обещано, что:
Симплексный шум не имеет заметных направленных артефактов
в отличие от "классического" шума Перлина. Я взволнованно реализовал это, чтобы узнать, что обратное оказалось правдой. Я вижу артефакты в классическом шуме, но я вижу как минимум столько же артефактов в симплексном шуме, выровненных под углом 45 градусов к основным осям. Они особенно заметны, когда вы отображаете шум в пошаговую функцию.
Чтобы не было проблем с моей реализацией, я использовал чужую реализацию JavaScript. Сравните некоторые изображения:
- Классический шум против простого шума
- Классический шаг шума против шага симплексного шума
И вот галерея со всеми из них. В этом последнем изображении ищите границы, которые выровнены под углом 45 градусов от горизонтали / вертикали. Они повсюду. Я могу выделить некоторые из них, если это необходимо, но они кажутся мне действительно очевидными. (И снова, я вижу их также в классическом изображении шума.)
РЕДАКТИРОВАТЬ: Чтобы быть более количественным, я выбрал 1 миллион случайных точек, и для каждой точки я численно вычислил градиент как классического, так и симплексного шума, и взял гистограмму направления градиента, спроецированного на плоскость xy. Если бы не было направленных артефактов, график был бы плоским. Но вы можете видеть, что как классические, так и симплексные шумовые пики каждые 45 градусов.
Это проблема с алгоритмом симплексного шума? Это то, что можно исправить? Или я единственный, кто видит в этом проблему?
2 ответа
Я только что прочитал газету и думаю, что у меня есть представление о том, что может быть причиной артефактов. Градиенты для каждой вершины сетки выбираются псевдослучайно из довольно маленькой справочной таблицы. Как говорит Густавсон на странице 3:
"Хороший выбор для 2D и выше - это выбрать градиенты единичной длины, но в разных направлениях. Для 2D, 8 или 16 градиентов, распределенных по окружности, это хороший выбор".
Именно этот метод использовался в классическом шуме Перлина, который Перлин предложил не для симплексного шума в своей статье 2001 года, стр. 14:
"Вместо того, чтобы использовать схему поиска в таблице для вычисления индекса псевдослучайного градиента в каждой окружающей вершине, новый метод использует схему управления битами, которая использует только очень небольшое количество аппаратных элементов".
Однако Густавсон утверждает на странице 7:
"Я буду использовать гибридный подход для ясности, используя метод градиентного хэша от классического шума, но симплексную сетку и прямое суммирование вкладов шума симплексного шума. Это на самом деле более быстрый метод в программном обеспечении".
Его двумерная реализация фактически использует 12 градиентов из трехмерной таблицы градиентов, отбрасывая координату z. В этой схеме координаты ребер используются по два раза каждый, но углы используются только один раз, что, по-видимому, приводит к смещению с интервалами в 90 градусов. Но это не относится к вашему случаю, потому что используемая реализация имеет только 8 градиентов, что наводит на мысль о смещении с интервалами в 45 градусов. Вероятность появления видимых паттернов из такой минимальной дисперсии кажется довольно высокой. Но должно быть легко адаптировать этот алгоритм для 16 градиентов, используя таблицу перестановок модов 16, которая должна помочь значительно уменьшить направленные артефакты.
В конечном счете, я думаю, что в одной октаве любой градиентной шумовой функции всегда будут присутствовать некоторые видимые закономерности, просто потому, что они ограничены по полосе, так как узкий диапазон частот будет стремиться выровнять возмущения к сетке. Будучи треугольной сеткой, симплексный шум, вероятно, будет демонстрировать некоторое смещение с интервалами в 60 градусов, даже если градиенты были действительно случайными. Ну, это только предположение, но дело в том, что эти шумовые функции действительно предназначены для объединения на разных частотах, что имеет тенденцию разбивать любые паттерны, которые вы можете увидеть в одной октаве.
РЕДАКТИРОВАТЬ:
Еще один момент, который я только что осознал, угловые градиенты, такие как (1,1), не имеют единичную длину, они представляют собой sqrt(2). Первая цитата проясняет, что градиенты должны лежать на единичной окружности. Это может быть еще одним источником предвзятости. Интересно, что Густавсон также использует эти неединичные градиенты.
Версия перлин-шума со значениями шума создает также некрасивые прямые линии, а версия перлина с градиентным шумом производит вещи немного более округлые, так что, возможно, у вас есть реализация симплексного шума, а не градиентная версия.
В противном случае интерполяционный градиент в вашем коде неверен, потому что он производит такие угловые переходы между квадрантами. Это должно быть область, которая не так. в Интернете говорят, что симплексный шум не только быстрее, но и что градиенты более округлые.
Я понимаю, что это означает, что углы интерполяционных кривых являются более круглыми. Возможно, кто-то неправильно понял утверждение Кена Перлинса по этому вопросу, и что он просто сказал, что градиент содержал меньше джиттера (извините за использование неправильного описания), потому что код на самом деле не производит идеальную математическую кривую, такую как синус, если вы умножив множество Perlin вместе, я обнаружил, что неоднородности джиттера / кривой достаточно сильны для измерения, что не относится к синусоидальным и математическим функциям. так что вы можете исследовать онлайн комментарии других людей о градиенте симплексного шума.
Я думаю, что есть таблица поиска градиента, которая в вашем случае, кажется, поднимается до 45'довольно часто, в противном случае кривая оценки, которую вы используете между 2 точками, слишком далека от идеализированной синусоидальной кривой, которая могла бы привести к округлению фигуры и никаких прямых линий, но это не так просто, особенно на CPU. Что касается графического процессора, я считаю логичным, что синусный градиент быстрее, чем используемая кривая полиномиального градиента.
Вы также проверяли, что делают турбулентные и мультифрактальные версии вашего симплекса? В любом случае каждая из них содержит около 5 строк, выражающих работу шумовых функций и каждый раз возвращающих совершенно разные результаты.
улучшен шум Perlin для графических процессоров из scrawkblog http://i40.tinypic.com/2py6oba.jpg