Связанный:
Я хотел бы генерировать мозаичный шум Перлина. Я работаю с функциями Пола Бурка PerlinNoise*()
, которые таковы:
// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
int i;
double val,sum = 0;
double p[2],scale = 1;
p[0] = x;
p[1] = y;
for (i=0;i<n;i++) {
val = noise2(p);
sum += val / scale;
scale *= alpha;
p[0] *= beta;
p[1] *= beta;
}
return(sum);
}
Используя код как:
real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test
return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;
Дает небо как
Который не является мозаичным.
Значения пикселя: 0-> 256 (ширина и высота), а пиксель (0,0) использует (x, y) = (0,0), а пиксель (256,256) использует (x, y) = (1,1)
Как я могу сделать это мозаичным?
tiles
perlin-noise
bobobobo
источник
источник
Ответы:
Есть две части, чтобы создать плавный шум fBm, подобный этому. Во-первых, вам нужно сделать функцию шума Perlin самой. Вот некоторый код Python для простой функции шума Perlin, которая работает с любым периодом до 256 (вы можете тривиально расширить его, сколько захотите, изменив первый раздел):
Шум Перлина генерируется суммированием маленьких «серфлетов», которые являются произведением случайно ориентированного градиента и разделяемой полиномиальной функции спада. Это дает положительный регион (желтый) и отрицательный регион (синий)
Сурфлеты имеют размер 2х2 и центрированы на целочисленных точках решетки, поэтому значение шума Перлина в каждой точке пространства получается путем суммирования сурфлетов в углах ячейки, которую он занимает.
Если вы сделаете направление градиента обтеканием с некоторым периодом, то сам шум будет незаметно обернутым с тем же периодом. Вот почему приведенный выше код принимает координату решетки по модулю периода, прежде чем хешировать его через таблицу перестановок.
Другим шагом является то, что при суммировании октав вы хотите масштабировать период с частотой октавы. По сути, вы хотите, чтобы каждая октава отображала все изображение только один раз, а не несколько раз:
Положите это вместе, и вы получите что-то вроде этого:
Как вы можете видеть, это действительно плавно:
С небольшим изменением цвета и отображением цветов, вот изображение облака размером 2x2:
Надеюсь это поможет!
источник
x*2**o
конвертировать в C? это:x*pow(2,o)
илиpow(x*2,o)
?x*pow(2, o)
, поскольку возведение в степень имеет более высокий приоритет, чем умножение.a
ценность? и я не уверен, как функции преобразуются в C ... я получаю прямые линии только на выходе.im.putdata(data, 128, 128)
. (Для тех, кто не знаком с Python или PIL: они означают масштаб и смещение, а не размер изображения.)Вот один довольно умный способ, который использует шум 4D Perlin.
По сути, сопоставьте координату X вашего пикселя с 2D-окружностью, а координату Y вашего пикселя - со вторым 2D-кругом, и поместите эти два круга, ортогональные друг другу в 4D-пространстве. Полученная текстура является мозаичной, не имеет явных искажений и не повторяется так, как зеркальная текстура.
Скопировать-вставить код из статьи:
источник
Ладно, я понял. Ответ заключается в том, чтобы ходить в торе в 3D-шуме, создавая из него 2D-текстуру.
Код:
Результаты:
Однажды:
И выложены плиткой:
источник
Один простой способ, который я могу придумать, состоит в том, чтобы взять вывод функции шума и отразить / перевернуть его в изображение, которое в два раза больше. Это трудно объяснить, поэтому вот изображение:
Теперь, в этом случае, совершенно очевидно, что вы делали, когда смотрите на это. Я могу думать о двух способах (возможно :-)) решить это:
Вы могли бы сделать это увеличенное изображение, а затем генерировать еще больше шума поверх него, но (и я не уверен, если это возможно) сфокусировано к середине (таким образом, края остаются прежними). Это может добавить дополнительную разницу, которая заставит ваш мозг думать, что это не просто зеркальное отображение.
(Я также не уверен, если это возможно) Вы можете попробовать поиграть со входами в функцию шума, чтобы сгенерировать исходное изображение по-другому. Вы должны будете сделать это методом проб и ошибок, но обратите внимание на функции, которые привлекают ваше внимание, когда вы их накладываете / зеркально отражаете, а затем пытаетесь заставить их не генерировать их.
Надеюсь это поможет.
источник
tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
Первая версия этого ответа на самом деле была неправильной, я обновил ее
Метод, который я успешно использовал, состоит в создании мозаичного домена . Другими словами, сделайте свою базовую
noise2()
функцию периодической. Еслиnoise2()
периодический иbeta
целочисленный, результирующий шум будет иметь тот же период, что иnoise2()
.Как мы можем сделать
noise2()
периодические? В большинстве реализаций эта функция использует какой-то решеточный шум. То есть он получает случайные числа в целочисленных координатах и интерполирует их. Например:Эта функция может быть тривиально изменена, чтобы стать периодической с целым периодом. Просто добавьте одну строку:
до расчета
v1
иv2
. Таким образом, значения в целочисленных координатах будут повторяться через каждые единицы Периода, а интерполяция гарантирует, что результирующая функция будет гладкой.Тем не менее, обратите внимание, что это работает только тогда, когда Period больше 1. Итак, чтобы фактически использовать это при создании бесшовных текстур, вам нужно будет выбрать квадрат Period x Period, а не 1x1.
источник
noise2
периодические (с коротким периодом, например, 1 единица)? Я думаю, что это то, что в конечном итоге задает вопрос. Стандартный шум Перлина является периодическим с периодом 256 на каждой оси, но вы хотите изменить шум с меньшим периодом.noise2
как предложено, вы будете получать периодические результаты, будь то сама функция периодической или нет. Потому что аргументы обертывают каждую 1 единицу.Другой альтернативой является генерация шума с использованием библиотек libnoise. Вы можете создавать шум на теоретически бесконечном пространстве, без проблем.
Посмотрите на следующее: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile
Существует также порт XNA, указанный выше: http://bigblackblock.com/tools/libnoisexna
Если вы в конечном итоге используете порт XNA, вы можете сделать что-то вроде этого:
GeneratePlanar - это функция, вызываемая для получения разделов в каждом направлении, которые будут бесшовно соединяться с остальными текстурами.
Конечно, этот метод более дорогостоящий, чем просто наличие одной текстуры, которую можно использовать на нескольких поверхностях. Если вы хотите создать несколько случайных мозаичных текстур, это может вас заинтересовать.
источник
Хотя здесь есть некоторые ответы, которые будут работать, большинство из них сложные, медленные и проблемные.
Все, что вам действительно нужно сделать, это использовать функцию периодической генерации шума. Это оно!
Отличная реализация общественного достояния, основанная на «продвинутом» алгоритме шума Perlin, может быть найдена здесь . Вам нужна функция pnoise2. Код был написан Стефаном Густавсоном, который сделал заостренный комментарий здесь именно о этой проблеме, и как другие взяли неправильный подход. Послушай Густавсона, он знает, о чем говорит.
Что касается различных сферических проекций, которые некоторые здесь предложили: они, по сути, работают (медленно), но они также создают двухмерную текстуру, которая является сплюснутой сферой, так что края будут более уплотненными, что, вероятно, приведет к нежелательному эффекту. Конечно, если вы намереваетесь проецировать 2D-текстуру на сферу, это путь, но это не то, о чем просили.
источник
Вот намного более простой способ сделать плиточный шум:
Вы используете модульную обертку для каждой шкалы шума. Они соответствуют краям области независимо от того, какую частотную шкалу вы используете. Так что вам нужно использовать только обычный 2D шум, который намного быстрее. Вот живой код WebGL, который можно найти на ShaderToy: https://www.shadertoy.com/view/4dlGW2
Три верхние функции выполняют всю работу, и fBM передается вектор х / у в диапазоне от 0,0 до 1,0.
источник
У меня были некоторые неплохие результаты, интерполированные около краев плитки (обернутые по краям), но это зависит от того, какого эффекта вы пытаетесь достичь, и точных параметров шума. Прекрасно работает с немного размытым шумом, не очень хорошо с остроконечными / мелкозернистыми.
источник
Я проверял эту ветку в поисках ответа на похожую проблему, а затем получил чистое и компактное решение от разработчика этого кода на Python для генерации фрактального шума из перлин / симплексного шума. Обновленный код представлен в этом (закрытом) выпуске и может быть возобновлен при установке градиентов для правой стороны «генератора», равных градиентам на левой стороне (и одинаковым для верхней и нижней частей), например, в
Похоже на элегантное и чистое решение, я избегаю копирования всего кода здесь (поскольку это не мое собственное решение), но оно доступно по ссылке, приведенной выше. Надеюсь, что это может быть полезно для тех, кто хочет создать мозаичное фрактальное 2d-изображение, подобное тому, которое мне было нужно, без артефактов или искажений.
источник