Поскольку производители драйверов графических процессоров обычно не пытаются реализовать их noiseX
в GLSL, я ищу набор служебных функций «швейцарский армейский нож для графической рандомизации» , предпочтительно оптимизированный для использования в шейдерах графических процессоров. Я предпочитаю GLSL, но код, который мне подойдет для любого языка, вполне подходит для его самостоятельного перевода в GLSL.
В частности, я бы ожидал:
a) Псевдослучайные функции - N-мерное, равномерное распределение по [-1,1] или более [0,1], рассчитанное из M-мерного начального числа (в идеале - любое значение, но я в порядке с ограниченным начальным числом) скажем, 0..1 для равномерного распределения результатов). Что-то вроде:
float random (T seed);
vec2 random2 (T seed);
vec3 random3 (T seed);
vec4 random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.
б) Непрерывный шум, такой как шум Perlin - опять же, N-мерное, + - равномерное распределение, с ограниченным набором значений и, ну, хорошо выглядящий (некоторые параметры для настройки внешнего вида, такие как уровни Perlin, также могут быть полезны). Я ожидал бы подписи как:
float noise (T coord, TT seed);
vec2 noise2 (T coord, TT seed);
// ...
Я не очень разбираюсь в теории генерации случайных чисел, так что я бы с большим удовольствием принялся за готовое решение , но я также был бы признателен за ответы типа «вот очень хороший, эффективный 1D rand (), и позвольте мне объяснить Вы, как сделать хороший N-мерный rand () поверх него ... " .
vec2 co
? это диапазон? семена?co.xy
используется, а неco
?Мне приходит в голову, что вы можете использовать простую целочисленную хеш-функцию и вставить результат в мантиссу с плавающей точкой. IIRC спецификация GLSL гарантирует 32-разрядные целые числа без знака и двоичное представление IEEE32, поэтому оно должно быть идеально переносимым.
Я дал это попробовать только сейчас. Результат очень хороший: он выглядит точно как статический при каждом входе, который я пробовал, никаких видимых шаблонов вообще. Напротив, популярный фрагмент кода sin / fract имеет довольно четко выраженные диагональные линии на моем графическом процессоре при тех же входных данных.
Недостатком является то, что требуется GLSL v3.30. И хотя это кажется достаточно быстрым, я не эмпирически оценил его производительность. AMD Shader Analyzer требует 13,33 пикселей на такт для версии vec2 на HD5870. Контраст с 16 пикселями за такт для фрагмента sin / fract. Так что, конечно, немного медленнее.
Вот моя реализация. Я оставил это в различных сочетаниях идеи, чтобы было проще получать ваши собственные функции.
Скриншот:
Я проверил скриншот в программе для редактирования изображений. Имеется 256 цветов, а среднее значение составляет 127, что означает, что распределение является равномерным и охватывает ожидаемый диапазон.
источник
Нет, не с 2005 года. Просто люди настаивают на скачивании старой версии. Версия, указанная в указанной вами ссылке, использует только 8-битные 2D-текстуры.
Новая версия Ian McEwan из Ashima и меня не использует текстуру, но работает на половине скорости на типичных настольных платформах с большой пропускной способностью текстур. На мобильных платформах безтекстурная версия может быть быстрее, потому что текстурирование часто является существенным узким местом.
Наш активно поддерживаемый исходный репозиторий:
https://github.com/ashima/webgl-noise
Коллекция как текстурных, так и текстурных версий шума здесь (с использованием только 2D текстур):
http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip
Если у вас есть какие-либо конкретные вопросы, напишите мне напрямую (мой адрес электронной почты можно найти в
classicnoise*.glsl
источниках).источник
glBindTexture(GL_TEXTURE_1D, *texID);
и т. Д. Неясно, что вы подразумеваете под «ссылкой, которую вы указали», поскольку цитируете мой ответ но этот ответ не связан с вашей реализацией. Я обновлю свой ответ, чтобы уточнить, о чем я говорю, и отразить новую информацию, которую вы предоставили. Характеризация людей как «настойчивых» при загрузке старой версии - это искажение, которое не заслуживает вашего внимания.Золотой шум
Смотрите Золотой шум в вашем браузере прямо сейчас!
Эта функция улучшила случайное распределение по текущей функции в ответе @appas от 9 сентября 2017 года:
Функция @appas также неполная, учитывая, что начальное число не поставляется (уф не является начальным значением - одинаковое для каждого кадра) и не работает с чипсетами низкой точности. Gold Noise по умолчанию работает с низкой точностью (намного быстрее).
источник
Существует также хорошая реализация, описанная здесь McEwan и @StefanGustavson, которая выглядит как шум Перлина, но «не требует какой-либо настройки, то есть не текстуры или унифицированных массивов. Просто добавьте ее в исходный код вашего шейдера и вызывайте ее где угодно».
Это очень удобно, особенно если учесть, что более ранняя реализация Густавсона, на которую ссылается @dep, использует 1D текстуру, которая не поддерживается в GLSL ES (шейдерный язык WebGL).
источник
Используйте это:
Не используйте это:
Вы можете найти объяснение в разделе Улучшения канонического однострочного GLSL rand () для OpenGL ES 2.0
источник
mod
приближении числа пи?Только что нашел эту версию 3D шума для GPU, якобы она является самой быстрой из доступных:
источник
Прямая, зубчатая версия 1d Perlin, по сути случайный зигзаг.
Я также нашел 1-2-3-4d перлин-шум на владельце шейдерного сайта Inigo Quilez Perlin, а также вороной и т. Д., У него есть полные быстрые реализации и коды для них.
источник
hash: В настоящее время существует webGL2.0, поэтому целые числа доступны в (w) GLSL. -> для качественного переносимого хеша (при той же цене, что и уродливые хеш-плавающие) мы теперь можем использовать «серьезные» методы хеширования. IQ реализовал некоторые в https://www.shadertoy.com/view/XlXcW4 (и больше)
Например:
источник
Ниже приведен пример добавления белого шума к отображаемой текстуре. Решение состоит в том, чтобы использовать две текстуры: оригинальный и чистый белый шум, как этот: вики белый шум
Общий фрагмент содержит параметр uNoiseFactor, который обновляется при каждом рендеринге основным приложением:
источник
Я перевел одну из Java-реализаций Кена Перлина в GLSL и использовал ее в нескольких проектах на ShaderToy.
Ниже приведена интерпретация GLSL, которую я сделал:
Я перевел это из Приложения B из Главы 2 Аппаратуры Шума Кена Перлина в этом источнике:
https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf
Вот публичный оттенок, который я сделал для Shader Toy, который использует опубликованную функцию шума:
https://www.shadertoy.com/view/3slXzM
Некоторые другие хорошие источники, которые я нашел по теме шума во время моего исследования, включают:
https://thebookofshaders.com/11/
https://mzucker.github.io/html/perlin-noise-math-faq.html
https://rmarcus.info/blog/2018/03/04/perlin-noise.html
http://flafla2.github.io/2014/08/09/perlinnoise.html
https://mrl.nyu.edu/~perlin/noise/
https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf
https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html
Я настоятельно рекомендую книгу шейдеров, поскольку она не только дает отличное интерактивное объяснение шума, но и другие концепции шейдеров.
РЕДАКТИРОВАТЬ:
Может быть в состоянии оптимизировать переведенный код с помощью некоторых аппаратно-ускоренных функций, доступных в GLSL. Обновлю этот пост, если я в конечном итоге сделаю это.
источник