Как и в случае одномерных функций шума, сложение различных частот иногда дает более интересные изображения (рис. 12.6).
Первое изображение (см. рис. 12.6) точно такое же, как первое изображение предыдущего рисунка (см. рис. 12.5). Второе изображение - это сумма первого изображения и половины второго изображения предыдущего рисунка, сдвинутого таким образом, что средняя интенсивность равна 0. Получается, что в некоторых областях интенсивность усиливается, а в некоторых - уменьшается.
На третьем изображении к первым двум октавам добавлена третья, а на четвертом - четвертая октава. Четвертое изображение уже немного похоже на облака.
Рис. 12.6, Сложенный шум 1, 2, 3 и 4 октав (контраст усилен)
12.1.2. Шум большей размерности Трехмерные и четырехмерные функции шума - очевидные расширения одномерных и двухмерных функций. Довольно сложно показать в книге изображение трехмерного шума, но можно представить себе, что двухмерные изображения (см. рис. 12.5) - это срезы трехмерных функций шума. Между соседними срезами всегда будет плавный переход изображения.
Зачастую шум большей размерности используется для того, чтобы плавно менять во времени значения шума меньшей размерности. Например, одномерный шум можно использовать для внесения неровностей в линию, а двухмерный шум -для анимации (от кадра к кадру расположение неровностей плавно меняется). Точно так же двухмерная функция шума используется для рисования облаков, а трехмерная - для анимации изображения облаков. Используя четырехмерную функцию шума, можно создавать трехмерные объекты (например, планеты), а четвертое измерение применять для равномерного изменения объектов.
12.1.3. Шум в шейдерах OpenGL
Существует три способа использования шума в шейдере OpenGL.
1. Использование встроенной функции noi se языка шейдеров OpenGL.
2. Создание собственной функции шума на языке шейдеров OpenGL.
3. Хранение предварительно вычисленной функции шума в текстурной карте. К сожалению, на время написания этой книги существует только одна доступная реализация языка шейдеров OpenGL, и в ней нет ни встроенной функции noi se, ни возможности реализации определенных разработчиком функций. Но шум является важным аспектом компьютерной графики, так что в приведенных примерах будут использовать третий способ, а именно сохранение функции шума в текстурной карте.
12.2. Текстуры шума Возможности программируемости в языке шейдеров OpenGL открывают совершенно новые возможности использования текстурной памяти. Можно заранее
’вычислить функцию шума и сохранить ее в одномерной, двухмерной или трех--мерной текстурной карте. Эта текстурная карта (или карты) затем читается из шейдера. Так как текстуры могут содержать до 4 компонентов, можно использовать одну текстурную карту для хранения четырех октав шума или четырех совершенно отдельных функций шума.
В листинге 12.1 приведена функция на языке С, которая создает трехмерную текстуру шума. Эта функция создает текстуру RGBA, причем первая октава шума .сохраняется в красном компоненте текстуры, вторая - в зеленом компоненте, третья - в синем компоненте, а четвертая - в компоненте прозрачности. Каждая октава отличается от предыдущей вдвое большей частотой и половинной амплитудой.