Шум Перлина: случайные градиенты из индекса ячейки
Я пытаюсь реализовать шум Perlin в механизме рендеринга, который имеет некоторые ограничения, и я не знаю, как генерировать градиенты для каждого угла данной ячейки.
Основным ограничением является то, что у меня нет генератора случайных чисел, который мог бы вернуть тот же результат для данного ввода (то есть, нет доступного начального числа). Другое ограничение заключается в том, что я не могу создать какую-либо справочную таблицу (как предлагается здесь), так как механизм рендеринга не поддерживает массивы.
Я понимаю, что мне нужно создать функцию, которая должна возвращать четыре псевдослучайных градиента для данного векторного индекса. Моя первая попытка состояла в том, чтобы использовать эту функцию, которую я получил здесь, которая дает мой псевдо RSL язык, который я использую:
float randomf (vector vec) {
float t = sin(vec . vector(12.9898, 78.233, 43.47865)) * 43758.5453123;
return t - floor(t);
}
Я мог бы вызывать эту функцию дважды для каждого градиента с некоторыми вариациями, чтобы создать вектор градиента, который затем мог бы нормализовать, но я чувствую, что есть лучшее решение, которое потребовало бы меньшего количества вычислений.
Я нашел решение здесь, но даже Inigo Quilez утверждает, что, безусловно, есть лучшая хеш-функция. Вот функция glsl:
vec2 hash( vec2 x )
{
const vec2 k = vec2( 0.3183099, 0.3678794 );
x = x*k + k.yx;
return -1.0 + 2.0*fract( 16.0 * k*fract( x.x*x.y*(x.x+x.y)) );
}
В общем, я хотел бы найти некоторые ресурсы из любой области, которые могли бы дать мне некоторые рекомендации о том, как создавать псевдослучайные хеш-функции. Из того, что я понимаю, эти функции обычно строятся после многих испытаний, изменяя параметры один за другим, пока результат не удовлетворителен. Даже если я понимаю, что должна делать функция, я не знаю, что является хорошей отправной точкой.
Спасибо за помощь. Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.