В первой части фрагментного шейдера вычисляется коэффициент возмущения для направления х. Необходимо, чтобы коэффициент возмущений зависел от s- и ^-компонентов текстурных координат. Для этого вычисляется локальная переменная rad, которая линейно зависит от значений svit. (Похожее, но немного другое выражение будет вычислять коэффициент возмущения для направления у во второй половине шейдера.) К результату добавляется значение StartRad. И наконец, по х-компоненту Freq результат масштабируется.

Значение rad будет увеличиваться с увеличением StartRad, а частота возмущений увеличивается с ростом коэффициента масштабирования Freq. х. Коэффициент масштабирования должен увеличиваться при увеличении размера текстуры на экране, чтобы видимая частота возмущений не зависела от масштаба. Можно представлять uniform-переменную Freq как шкалу Рихтера для возмущений. Если ее значение будет равно 0, то возмущений вообще не будет. Значение 1,0 вызовет легкое покачивание, 2,0 - тряску, 4,0 - биение, а 8,0 - эффект, похожий на землетрясение.

Следующие семь строк кода приводят значение rad к диапазону [-я/2, я/2]. После этого можно вычислять sin (rad) с помощью первых двух членов последовательности Тейлора для синуса, это всего лишь выражение х - д^/З!. Результат вычисления умножается на .r-компонент переменной Ampl itude. Значение вычисленного синуса будет находиться в диапазоне [-1, 1]. Если просто прибавить это значение к текстурной координате как коэффициент возмущения, координата сильно изменится. Но в данном случае нужно колебание, а не эффект взрыва, поэтому вычисленное значение синуса умножается на 0,05, в результате чего получаются возмущения небольшого размера. Увеличивая этот коэффициент, можно задавать возмущения большего размера, а уменьшая - меньшего размера. Представить себе действие коэффициента можно так: он определяет, как далеко «уходит» текстурная координата от первоначального значения. Значение коэффициента 0,05 означает, что текстурная координата изменится не больше, чем на ±0,05.

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

После вычисления коэффициентов возмущения можно обращаться к текстуре. Для получения окончательного цвета фрагмента значение цвета, полученное из текстурной карты, умножается на Lightlntensity. Несколько кадров из такой анимации приведены на цветном рис. 21. Эти кадры показывают, как шейдер ра ботает с неподвижным логотипом. Этот эффект интересно применять также на поверхности воды, лавы, тины или даже шкуре животного или чудовища.

Листинг 13.8. Фрагментный шейдер для создания эффекта возмущений

// Константы

const float C_PI = 3.1415;

const float C_2PI =2.0* C_PI:

const float С 2PI I = 1.0 / (2.0 * С PI):

const float C_PI_2 = C_PI / 2.0:


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