Я пытаюсь реализовать шум Перлина в механизме рендеринга, у которого есть некоторые ограничения, и я не знаю, как генерировать градиенты для каждого угла данной ячейки.
Основным ограничением является то, что у меня естьнет генератора случайных чисел, который мог бы вернуть тот же самый результат для данного входа (что означает отсутствие доступного начального числа).Другое ограничение заключается в том, что я не могу создать какую-либо справочную таблицу (как предложено здесь ), поскольку механизм рендеринга не поддерживает массивы.
Я понимаю, что мне нужно создать функцию, которая должна возвращать четырепсевдослучайные градиенты для заданного векторного индекса.Моей первой попыткой было использовать эту функцию, которую я получил здесь , что дает в моем псевдо RSL языке, который я использую:
float randomf (vector vec) {
float t = sin(vec . vector(12.9898, 78.233, 43.47865)) * 43758.5453123;
return t - floor(t);
}
Я мог бы вызвать эту функцию дважды для каждого градиента с некоторымивариации для создания вектора градиента, который я мог бы затем нормализовать, но я чувствую, что есть лучшее решение, которое потребовало бы меньшего количества вычислений.
Я нашел решение здесь , но даже Иниго Квилез утверждает, что, безусловно, естьлучше хэш-функция.Вот функция 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)) );
}
В общем, я хотел бы найти ресурсы из любого поля, которые могли бы дать мне некоторые рекомендации о том, как создавать псевдослучайные хеш-функции.Из того, что я понимаю, эти функции обычно строятся после многих испытаний, подстраивая параметры по одному, пока результат не удовлетворителен.Даже если я понимаю, что должна делать функция, я не знаю, что является хорошей отправной точкой.
Спасибо за вашу помощь.Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.