При каждом следующем прохождении цикла частота увеличивается вдвое, а амплитуда вдвое уменьшается. В зеленом компоненте текстуры шума будут сохраняться целые значения из диапазона [0, 64], в синем компоненте - целые значения из диапазона [0, 32], а в компоненте прозрачности - целые значения из диапазона [0, 16]. Изображения, приведенные на рис. 12.5, сформированы отдельно из каждого из этих каналов, после того как значения были приведены к нужному диапазону интенсивности (целые числа в диапазоне [0, 255] или числа с плавающей запятой в диапазоне [0, 1]).
После вычисления значений для текстуры шума их следует занести в текстурный модуль с помощью кода, приведенного в листинге 12.2. Текстурный модуль сначала выбирается, а потом связывается с ранее созданной ЗБ-текстурой. Для параметров края задан плавный переход во всех трех измерениях, и поэтому функция шума всегда будет возвращать правильные значения вне зависимости от переданного входного параметра. Однако следует заботиться о том, чтобы повторения фрагментов текстуры не были заметны. Следующие две строчки устанавливают для текстуры линейный режим фильтрования, так как по умолчанию текстура является и множественной, и линейной, а множественность здесь не нужна. (Использование множественной текстуры в некоторых случаях оправдано, но здесь масштабирование будет выполняться внутри шейдера шума, и простой текстуры будет достаточно.) После установки всех параметров текстуру можно загружать в текстурный модуль функцией glTex!mage3D.
12.3. Выбор метода создания шума Листинг 12.2. Функция для создания трехмерной текстуры шума
void init3DNoiseTexture() {
glGenTexturesC1. &noise3DTexName):
gl Act i veTexture ( GL JTXTURE6 ) : glBindTexture(GL_TEXTURE_3D. noise3DTexName); glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_WRAP_S. GL_REPEAT): glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_WRAP_T. GL_REPEAT); glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_WRAP_R. GL_REPEAT) : glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_MAG_FILTER. GL_LINEAR): glTexParameterf(GL_TEXTURE_3D. GL_TEXTURE_MIN_FILTTR. GL_LINEAR):