Шум Перлина: случайные градиенты из индекса ячейки

Я пытаюсь реализовать шум 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)) );
}

В общем, я хотел бы найти некоторые ресурсы из любой области, которые могли бы дать мне некоторые рекомендации о том, как создавать псевдослучайные хеш-функции. Из того, что я понимаю, эти функции обычно строятся после многих испытаний, изменяя параметры один за другим, пока результат не удовлетворителен. Даже если я понимаю, что должна делать функция, я не знаю, что является хорошей отправной точкой.

Спасибо за помощь. Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.

0 ответов

Другие вопросы по тегам