Как стать автором
Обновить

Комментарии 18

исправил ошибку в задании размера массива (было 1023)
Правда ли, что в вершинах сетки значение шума всегда нулевое? Ведь при интерполяции берётся только значение, полученное из вектора, идущего из точки в эту вершину, а вектор этот для самой вершины равен нулю?
Да, в узлах всегда ноль. Более того, между узлами можно провести нулевые изолинии.
В формуле a-b должно быть
поменял (поменял полную формулу в комментарии)
// return a * (t - 1) + b * t; можно переписать с одним умножением (раскрыть скобки, взять в другие скобки):
  return a + (b - a) * t;

Вроде должно быть

  return (b + a) * t - a;
Я не буду описывать достоинства шума Перлина и область его применения, а постараюсь объяснить как он реализован.

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

Кстати, обычный пиксельный шум выглядит намного приличнее, если использовать 2 слоя: второй слой, не меняя масштаб, повернуть на 45 градусов:
image
Очень просто реализовывается:
result = Noise(x, y) + Noise((x - y)*Phi, (y + x)*Phi) - 1
где Phi = 0.70710678118

Но Перлин2д всё равно чуть быстрее и плавнее вдоль тела «червя».
получаются округлением в сторону 0 (функция floor).
floor округляет в меньшую сторону, а не в сторону нуля.
В дополнение к статье. Шум Перлина + фрактальный шум на базе Перлина на GPU: www.shadertoy.com/view/XdXGW8
Как справедливо заметили в комментариях к публикации, речь идёт вовсе не о шуме Перлина. Возможно, автор перевода и сам был не в курсе.

Автор перевёл (коряво, но перевёл а не написал) статью Perlin Noise, которая называется кто бы мог подумать — так как называется и которая попадается в выдаче google первой (до появления этих двух и статьи на вики) с достаточно подробным описанием, на которую ссылается довольно много статей в первую очередь на англоязычных ресурсах.

Ваше
если сравнить картинки

image vs image
как миниму не корректное и взято явно для «показательной непригодности варианта слева», однако если взять первую октаву другого размера например:
image
то различие не такое уж заметное.

Кроме того, назвав «обычным шумом из той самой статьи» одну октаву со сглаживанием, вы
видимо не дочитали или разнося в пух и прах не увидели что шумом названо нечто другое:
image

Поправьте, если не прав: псевдослучайные числа — это псевдослучайные вектора кто бы мог подумать в одномерном пространстве
и возможно взяты для упрощения понимания (что задумал автор можно только догадываться). И собственно способ получения этих векторов и является настройкой параметров генерации, можно получать на ходу — дабы не хранить в памяти там где это критично, можно загружать из… да хоть из текстуры это уже не важно, важен принцип.

Соответственно и принцип работы тоже варьируется.

Как итог: «та самая статья», фу какая мерзкая, была написана переведена из академического интереса, и как верно замечено в комментариях, код не достаточно эффективен, но при этом даёт представление как сгенерировать некий шум, который кто то назвал шумом перлина, однако чрезвычайно на него похож когда это надо и не похож когда это удобно О_о.

И кстати «фрактальный шум на базе Перлина»(из комментария выше), ну очень похож на то что названо шумом перлина в «той самой статье», даже больше чем у вас чего бы О_о.
как миниму не корректное и взято явно для «показательной непригодности варианта слева», однако если взять первую октаву другого размера например:
то различие не такое уж заметное.

Сравнивать «синюю» картинку с грейскейл в данном случае бессмысленное заняните. Различие между синим и серым шумом в распределении вероятностей. Распределение для шума Перлина больше смещено к нулю, в то время как «синий» шум имеет нормальное распределение. Кроме того шум Перлина не может давать максимальные или минимальные значения на протяжении 2-ух «квадратов», ибо узлы в шуме перлина дают 0. То есть ситуация, обведенная красным тут:

невозможна в шуме Перлина.
Кроме того, назвав «обычным шумом из той самой статьи» одну октаву со сглаживанием, вы
видимо не дочитали или разнося в пух и прах не увидели что шумом названо нечто другое:
А потому что вы тоже путаете шум Перлина и фрактальный шум. Когда шум Перлина используют в фрактальном шуме — то шум Перлина берут за одну октаву. Поэтому сравнение корректное.
Поправьте, если не прав: псевдослучайные числа — это псевдослучайные вектора кто бы мог подумать в одномерном пространстве
и возможно взяты для упрощения понимания (что задумал автор можно только догадываться).
Вы не правы. Для двумерного шума Перлина нужны именно двумерные вектора. Иначе это будет не шум Перлина.
Как итог: «та самая статья», фу какая мерзкая, была написана переведена из академического интереса, и как верно замечено в комментариях, код не достаточно эффективен, но при этом даёт представление как сгенерировать некий шум, который кто то назвал шумом перлина, однако чрезвычайно на него похож когда это надо и не похож когда это удобно О_о.
Все верно. В интернетах часто путают шум Перлина с фрактальным шумом (от обычного шума). В этом нет вины переводчика, переводчик переводил статью, и сделал это неплохо.
И кстати «фрактальный шум на базе Перлина»(из комментария выше), ну очень похож на то что названо шумом перлина в «той самой статье», даже больше чем у вас чего бы О_о.
У автора статьи в примерах не фрактальный шум, а именно шум перлина. Само собой он визуально различается. Еще раз, не путайте фрактальный шум, шум перлина, и просто нормальный шум.
Сначала попробую убедиться в том что все всё поняли: я прямо не называю шумом перлина ни то что описано в первой статье ни то что во второй, является оно таковым или нет.

теперь по существу:
речь про сравнение, сравните размерность сравниваемого в статье, речь идёт именно о размерности. можно было с таким же успехом взять монохромное изображение изображение 2х2 px увеличить размерность замылить его и сказать: «оно не похоже на шум перлина чего бы мы не сделали», если приведённую в моём коментарии октаву интерполировать с большим радиусом сглаживания(фактически поменять коэффициенты или способ интерполяции) то получить можно очень даже похожую картинку, а про обведённое тут никто не спорит что это не шум перлина, речь про явное различие сравниваемого

Для двумерного шума Перлина нужны именно двумерные вектора

Опять же, я не упоминал двумерный шум перлина.
Речь идёт о сравнении двумерных векторов и одномерных векторов, причём тут двумерность шума перлина?:
1. В узлах сетки — псевдослучайные вектора (двухмерные для двухмерного шума, трехмерные для трехмерного и так далее), а не псевдослучайные числа.

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

и сделал это неплохо

спасибо конечно, но к сожалению через чур злоупотребил переводчиком, и поторопившись не вычитал хорошенько, из-за чего обоснованно «получил по ушам» в комментариях.
Опять же, я не упоминал двумерный шум перлина.
Ну мы же картинки двумерные сравниваем или где?
теперь по существу:
речь про сравнение, сравните размерность сравниваемого в статье
Ну вы же фрактальный шум считали шумом Перлина комментом выше:
Кроме того, назвав «обычным шумом из той самой статьи» одну октаву со сглаживанием, вы
видимо не дочитали или разнося в пух и прах не увидели что шумом названо нечто другое: (и тут картинка фрактального шума)

чем в данном описании псевдослучайные числа отличаются от одномерных векторов, раз уж упоминаются более чем двумерные или принято только в одну сторону размерность менять?
Тем, что алгоритм шума Перлина такой и никакой иначе. В нем нужно делать dot(расстояние от узла, случайный вектор в узле). Если у нас двумерная картинка, то и «расстояние от узла» будет двумерным. И в узлах у нас должен быть двумерный вектор. А для трехмерного шума перлина нужны будут трехмерные вектора. А в вашей статье — там скаляр вне зависимости от размера.
спасибо конечно, но к сожалению через чур злоупотребил переводчиком, и поторопившись не вычитал хорошенько, из-за чего обоснованно «получил по ушам» в комментариях.
Ваша статья (хоть и с ошибкой в названии шума) — гораздо ближе лежит к практике, чем эта. Шум описанный у вас применяется чаще, т.к. он дешевле и проще реализуется. Однако знать разницу между нормальным шумом и шумом Перлина все таки полезно.

Дополнение:
После обновления статьи добавились картинки «червячков». Не совсем удачные, имхо. Эту
image
картинку стоило бы увеличить с бикубической интерполяцией, чтобы не было сильно выраженной «квадратности». Тогда на этой картинке тоже были бы «червячки», но! на этой картинке кроме червячков стали бы образовываться острова, у червячков были бы утолщения. К сожалению инструмента под рукой сейчас нет, чтобы создать такую картинку.
Вот:

Здесь сырые пиксели увеличены с бикубической интерполяцией. Действительно наблюдаются черви, но с утолщениями и проседаниями.
А синяя картинка это уже не просто сырые пиксели, там была интерполяция (линейная) + блюр по ближайшим соседям судя по тексту (думаю, можно заменить блюр кубическим затуханием кривой, результат будет тот же, вот здесь такая интерполяция).
Исправил статью с учетом ваших замечаний.
Спасибо. Жаль вашей публикации не было раньше.
На момент появления того перевода пришлось использовать именно близкое к тому решение.
Для интересующихся процедурной графикой обязательна к прочтению книга «Texturing and Modeling: A Procedural Approach».
В ней первый шум назван «Value noise» а шум Перлина — «Gradient noise».
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации