Шум Перлина: случайные градиенты из индекса ячейки - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь реализовать шум Перлина в механизме рендеринга, у которого есть некоторые ограничения, и я не знаю, как генерировать градиенты для каждого угла данной ячейки.

Основным ограничением является то, что у меня естьнет генератора случайных чисел, который мог бы вернуть тот же самый результат для данного входа (что означает отсутствие доступного начального числа).Другое ограничение заключается в том, что я не могу создать какую-либо справочную таблицу (как предложено здесь ), поскольку механизм рендеринга не поддерживает массивы.

Я понимаю, что мне нужно создать функцию, которая должна возвращать четырепсевдослучайные градиенты для заданного векторного индекса.Моей первой попыткой было использовать эту функцию, которую я получил здесь , что дает в моем псевдо 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)) );
}

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

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

...