Шум Перлина, как получить вектор из массива перестановок?
В настоящее время я пытаюсь реализовать перлин шум на HLSL в 2D. Я наблюдал, как Кен улучшил Perlin Noise, но я не понимаю, как работает преобразование массива перестановок в векторы. Я знаю, что могу получить хэш-код, как это
int g00 = p[floorX + p[floorY]],
g10 = p[floorX + 1 + p[floorY]],
g01 = p[floorX + p[floorY + 1]],
g11 = p[floorX + 1 + p[floorY + 1]];
(floorX и floorY - промежуточные координаты x,y, разделенные на 8 бит.)
отсюда, но я до сих пор не понимаю этого. Я также не понимаю, как работает метод "grad(...)" из реализации Кена. Может кто-нибудь объяснить мне, как это работает?
1 ответ
Реальная Java-реализация Кена Перлина - это действительно псевдокод для его реализации на GPU, что означает, что некоторые части (особенно та, на которой вы застряли) совершенно непроницаемы (используя некоторую теорию оптимизации).
Для удобства чтения, попробуйте справочную Java-реализацию Стефана Густавсона из Simplex Noise Demystified' (2005) в формате pdf, она гораздо более разборчива, так как была разработана частично как учебный инструмент.
Длинный набор битовых операций и условных выражений (с использованием оператора тройной короткой руки) в его функции grad() предназначен для выбора псевдослучайного единичного вектора. В частности, он должен выбирать из набора, который равномерно распределен по единичному кругу (в 2D) или сфере (аппроксимирован серединами сторон куба, в 3D) и т. Д., И делать это с равной вероятностью каждый. Если младшие 4 бита достаточно скремблированы процедурой хеширования, эти 16 вариантов могут быть быстро сопоставлены с 12 лучшими 3D-векторами (длиной sqrt2) - это то, что он делает (и, imho, почему шум Перлина редко когда-либо реализуется) к стандарту он изложен в сопроводительном документе).
В частности, он суммирует два осевых единичных вектора (x, y и z)- псевдослучайно выбранные, с псевдослучайно определенными знаками каждый.
Поскольку вам нужен 2D-шум, могу ли я предложить использовать справочную таблицу для самих градиентов, но, пожалуйста, сделайте их одинаковой длины (это выглядит немного лучше, чем ярлык, который Perlin оставил в приложении, скопированном в EveryWhere, и векторы обычно плавает уже). И вы действительно можете выбрать 8 хороших базовых градиентов (так что побитовое скремблирование работает без деформации!).