Чтобы шейдер правильно работал, приложение должно задавать частоту и амплитуду колебаний и координаты источника освещения. Нужно также при смене кадра увеличивать uniform-переменную StartRad. Это значение будет использоваться для вычисления возмущений во фрагментном шейдере. Если увеличивать его с каждым кадром, получится движение возмущений. Приложение должно передавать координаты вершины, нормаль поверхности и текстурные координаты для каждой вершины объекта.
Вершинный шейдер для создания эффекта возмущений должен вычислять освещение на основании нормали поверхности и координат освещения. Текстурные координаты передаются без изменений. Вершинный шейдер для создания изображения Земли, описанный в разделе 10.2.2, полностью повторяет эти вычисления, так что можно использовать его.
Фрагментный шейдер для создания эффекта возмущений приведен в листинге 13.8. В него передается varying-переменная Light Intensity, вычисленная вершинным шейдером. Эта переменная будет использоваться в конце процедуры для наложения на фрагмент освещения. Uniform-переменная StartRad содержит начальную точку для вычисления возмущений в радианах, приложение увеличивает ее на единицу с каждым новым кадром, чтобы эффект возмущений был анимационным. Изображение будет двигаться быстрее, если всего лишь увеличивать эту переменную на большее значение, и медленнее, если увеличивать переменную на меньшее значение. Экспериментальным путем установлено, что наилучшее значение - 1°.
Частота и амплитуда колебаний устанавливаются приложением через uniform-переменные Freq и Ampi itude. Они определены как переменные типа vec2, и их компоненты хну можно изменять по отдельности. Во фрагментном шейдере для обозначения текстурного модуля, в котором хранится нужная текстура, определена переменная Wobbl еТех.
Анимированные шейдеры
Чтобы аппроксимация последовательности Тейлора для синуса давала более точные результаты, следует убедиться в том, что значение, для которого вычисляется синус, находится в диапазоне [-л/2, л/2]. Для упрощения в шейдере определены константы С_РIЫ), С_2РI (п), С_2Р 1_1 (1/2л) и С_Р 1_2(л/2).