for(int j = 0: j <= 1:
fordnt i = 0; i <- 1: i++)
d[k][j][i] - latticeNoise(ix + i. iy + j.iz + k):
xO = lerp(tx. d[0][0][0].d[0][0][l]): xl = lerp(tx. d[0][l][0].d[0][l][l]); x2 - lerp(tx. d[l][0][0].d[l][0][l]): x3 = lerp(tx. d[l][l][0].d[l][l][l]); yO = lerp(ty. xO, xl): yl - lerp(ty. x2. x3): return lerp(tz. yO. yl):
}

В листинге 14.12 представлена возможная реализация функции noi se() для трехмерного случая. У нее имеется дополнительный параметр scale, который масштабирует заданную трехмерную точку (х, у, z); он пригодится нам при создании турбулентности. Вначале масштабированная точка смещается на 1000 по х, у, z, чтобы все составляющие были положительны. (Поскольку значения на решетке все равно остаются случайными, то это смещение не изменяет статистической природы генерируемого шума.) Затем генерируются значения шума в восьми вершинах решетки, окружающих данную точку. В конечном счете для определения интерполированного значения шума используется семь вызовов функции lerp.

На рис. 14.29, а приводится график функции noise(20. х. у. 0), где черный цвет соответствует значению 0,0, а белый - 1,0. На рисунке диапазоны измененияхиу составляют от -1 до 1. В шумовом поле просматривается определенная упорядоченность, обусловленная причудами процесса генерирования случайных чисел, однако она не является чрезмерной.

Примеры графиков функций

Рис. 14.29. Примеры графиков функций: а) поЭД) (шум); 6) ШгЬ() (турбулентность)

Введение в трассировку лучей

Турбулентность

Перлином [Perlin, 161; Ebert, 59] был разработан метод генерирования шума более интересного вида, чем вышеописанный. Его идея состоит в том, чтобы смешать несколько составляющих шума: одну - медленно изменяющуюся при плавном перемещении в пространстве, вторую - изменяющуюся вдвое быстрее, третью - изменяющуюся в четыре раза быстрее и т. д. Интенсивности более быстро изменяющихся компонентов уменьшаются в геометрической прогрессии. Функция

turb(s,x,y,z) = - noise (s,x,y,z) + -noise (2s,x,y,z) + -noise (4s,x,y,z) (14.36) 2 4 8

складывает три таких компонента, каждый из которых вдвое слабее и вдвое быстрее предыдущего. Параметр s масштабирует расстояния, как это делалось в функции noiseO. Рисунок 14.30 демонстрирует колебания функции turbO (для двумерного случая). Представьте себе плоскость ху, заполненную фиксированными значениями функции noise(l, х, у, 0). На рисунке показано, как для каждой точки Р - (х, у) в теле функции turb(l, х, у, 0) смешиваются три значения шума: в точках (х, у), (2х, 2у), (Ах, Ау). В соседней точке Р' значение шума noise(l, х', у', 0) очень близко к значению noise(l, х, у, 0), однако noise(2, х', у', 0) будет существенно отличаться от noise(2, х, у, 0), а отличие noise(4, х', у', 0) от своего аналога будет еще сильнее. Свойства первого компонента шума в следующем компоненте будут проявляться в половинном размере, в следующем за ним через один - в размере одной четверти. Можно добавить в функцию turb( ) больше членов, в результате чего получим для некоторого М:


⇐ Предыдущая| |Следующая ⇒