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

13

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

Этот FAQ по математике в Perlin дает формулу:

Floop(x,y,z)=(tz)F(x,y,z)+zF(x,y,zt)t

сделать функцию шума петлей в направлении z . Он также упоминает , что расширение этого, чтобы петли в 2 -х измерениях будет принимать 4 оценки F и к петле в 3 -х измерениях будет принимать 8 оценок F .FzFF

Я понимаю, что это дает бесшовное соединение между плитками, которое не только непрерывно, но и непрерывно дифференцируемо, но я интуитивно ожидаю, что это произойдет, если функция шума будет просто оценена один раз с уменьшением точек сетки по модулю требуемого размера плитки. Если функция шума только когда-либо основана на непосредственно окружающих точках сетки (4 для 2D-шума, 8 для 3D-шума), то, конечно, просто используя крайние левые точки сетки, когда точка для вычисления проходит мимо правого края плитки, даст такое же качество шума, как между любыми другими точками сетки?

Так как я видел этот подход с несколькими вычислениями в нескольких местах, я предполагаю, что он должен иметь некоторое преимущество, но я изо всех сил пытаюсь увидеть недостаток, просто оборачивая точки сетки обратно в начало, когда они становятся слишком большими. Что мне не хватает?

Trichoplax
источник

Ответы:

19

К сожалению, люди обычно рекомендуют это. Смешивание между двумя (или четырьмя и т. Д.) Переведенными копиями шумовой функции таким способом является довольно плохой идеей. Это не только дорого, но и не дает правильных результатов!

Шум Перлина Смешанный шум Перлина

Слева немного шума Перлина. Справа два экземпляра шума Перлина, сложенные и смешанные слева направо.

Разница довольно тонкая, но вы можете видеть, что второе изображение имеет более низкий контраст в вертикальном столбце, идущем по середине. Вот где это 50% -ное смешение между двумя разными экземплярами шумовой функции. Такая смесь не похожа на оригинальную шумовую функцию: она просто выглядит как грязный беспорядок.

ОК, так что это не совсем , что плохо , просто глядя на сырой шум ... но если вы после этого делать какие - либо нелинейные преобразования на изображение, контраст неоднородный может вызвать проблемы. Например, вот те изображения, пороговые на 60%. (Например, подумайте о создании островов в океане.)

Пороговый шум Перлина Порошковый смешанный шум Перлина

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

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

Однако с несколькими октавами шума это не всегда так просто. Если относительный масштаб между октавами (иначе говоря, «лакунарность») не является целым или простым рациональным числом, то вы не сможете найти удобную точку разбиения, где совпадают все сетки октав. Вы можете расположить каждую октаву независимо друг от друга, но общий шум в этом случае будет невозможно.

Натан Рид
источник
4
Изображения бок о бок действительно помогают понять интуитивно понятное объяснение. Я собираюсь учесть это для моих собственных ответов.
Трихоплакс