Этот шейдер был разработан для того, чтобы воспроизвести двухмерные колебательные эффекты, показанные в некоторых демонстрационных программах реального времени на веб-сайте http://www.scene.org. Автор этих программ, Антонио Тихада из компании 3Dlabs, хотел создать нечто подобное с помощью языка шейдеров OpenGL.

Для создания возмущений, вносимых фрагментным шейдером в текстурные координаты перед доступом к текстуре, используется функция синуса. Размеры и частота возмущений контролируются с помощью uniform-переменных, устанавливаемых приложением. В данном случае точность вычисления функции синуса не имеет особого значения, а сама функция синуса на время написания шейдера еще не была реализована, поэтому Антонио применил первые два члена последовательности Тейлора для синуса. Фрагментный шейдер был бы проще, если бы Антонио использовал встроенную функцию sin, но способ с последовательностью демонстрирует применение численных методов в шейдерах. (Сложно сказать, будет ли использование первых двух членов последовательности Тейлора работать быстрее встроенной функции sin. Возможно, это зависит от производителя аппаратного обеспечения, а именно от реализации функции sin.)

Чтобы шейдер правильно работал, приложение должно задавать частоту и амплитуду колебаний и координаты источника освещения. Нужно также при смене кадра увеличивать uniform-переменную StartRad. Это значение будет использоваться для вычисления возмущений во фрагментном шейдере. Если увеличивать его с каждым кадром, получится движение возмущений. Приложение должно передавать координаты вершины, нормаль поверхности и текстурные координаты для каждой вершины объекта.

Вершинный шейдер для создания эффекта возмущений должен вычислять освещение на основании нормали поверхности и координат освещения. Текстурные координаты передаются без изменений. Вершинный шейдер для создания изображения Земли, описанный в разделе 10.2.2, полностью повторяет эти вычисления, так что можно использовать его.

Фрагментный шейдер для создания эффекта возмущений приведен в листинге 13.8. В него передается varying-переменная Lightlntensity, вычисленная вершинным шейдером. Эта переменная будет использоваться в конце процедуры для наложения на фрагмент освещения. Uniform-переменная StartRad содержит начальную точку для вычисления возмущений в радианах, приложение увеличивает ее на единицу с каждым новым кадром, чтобы эффект возмущений был анимационным. Изображение будет двигаться быстрее, если всего лишь увеличивать эту переменную на большее значение, и медленнее, если увеличивать переменную на меньшее значение. Экспериментальным путем установлено, что наилучшее значение - 1°.

Частота и амплитуда колебаний устанавливаются приложением через uniform-переменные Freq и Amp! itude. Они определены как переменные типа vec2, и их компоненты х и у можно изменять по отдельности. Во фрагментном шейдере для обозначения текстурного модуля, в котором хранится нужная текстура, определена переменная WobbleTex.

Чтобы аппроксимация последовательности Тейлора для синуса давала более точные результаты, следует убедиться в том, что значение, для которого вычисляется синус, находится в диапазоне [-л/2, п/2]. Для упрощения в шейдере определены константы С_Р1(я), С_2РКп), С_2Р1_К1/2я) и С_Р1_2(я/2).


⇐ вернуться назад | | далее ⇒