class Noise{ public:
NoiseO // a constructor // конструктор
{
int i:
index = new unsigned char[256];
for(i - 0; i < 256: i++) index[i] = i: // fill array with indices // заполняем массив индексами
14.8. Наложение текстуры на поверхности
ford = 0; i < 256: i++)
// shuffle it // перемешиваем его {
int which - randO % 256: // choose random place in array // выбираем случайное место в массиве
unsigned char tmp = index[which]:
// swap them
// переставляем их
index[which] - index[i]; index[i] = tmp:
}
noiseTable = new float[256]; for(i - 0: i < 256: i++) noiseTable[i] - rand()/32767.99:
}
// end of constructor // конец конструктора
float noise(float x. float y, float z); float noise(float scale. Point3& p): float turbulence(float s. Point3& p): float marble(float x, float y. float z): float marble(float strength,Point3& p):
private:
float* noiseTable: // array of noise values // массив значений шума
unsigned char * index; // pseudo random indices // псевдослучайные индексы
float mySplineCfloat x): // used for marble // используется для мрамора
float TatticeNoiseCint i. int j. int k)
{
// return noise value on an integer lattice // возвращаем значение шума на целочисленной решетке #define PERM(x) index[(x) & 255]
#define INDEXOx, iy. iz) PERM( (ix) + PERM((iy) + PERM(iz)) ) return noiseTable[IMDEX(i.j.k)]:
}
}:
Наибольший интерес представляет метод данного класса marbleO, возвращающий координатно-за-висимое значение яркости в пределах от нуля до единицы, которое имитирует прожилки темного и светлого камня в мраморе. Позднее мы детально разработаем этот метод. Он будет использован на начальной стадии трассировки лучей для создания зеленоватого мрамора путем конструирования объекта noise с помощью команды
Noise п:
// create and construct a noise objec;
// создаем и конструируем объект класса noise
Введение в трассировку лучей
и последующего вычисления значения функции 1ехгд1ге(л:, у, г) в любой точке (х, у, г) простым вызовом оператора п.тагЫе(х, у. г): В свою очередь метод тагЫеО использует методы noise() и т,игЬи1епсе(), которые мы вкратце опишем, а также «вспомогательную» функцию 1аШсе№ше(). Конструктор класса создает и заполняет массивы пхтеТаЫеП и 1пс1ех[]. Случайные значения, помещаемые в массив гктеТаЫеП, создаются с помощью стандартной С-функции галсЮ, которая масштабирует эти значения в диапазон от 0,0 до 1,0. Массив 1поех[] вначале загружается числами от 0 до 255 в порядке возрастания, а затем «перемешивается» посредством поочередной перестановки каждого элемента с каким-либо другим случайно выбранным элементом.