Чтобы это сделать, в приложении устанавливается значение uniform-переменной, которое показывает текущее состояние объекта. Приложение должно вовремя обновлять эту переменную; например, для того чтобы неоновая реклама была 3 секунды включена и одну секунду выключена, приложение должно записать в переменную значение «включено», через 3 секунды записать «выключено», еще через одну секунду записать «включено» и т. д. В промежутках нужно всего лишь постоянно перерисовывать изображение. Разделение рендеринга и эффекта анимации делает приложение более простым, его легче поддерживать и легче вносить в него изменения.
3.2. Пределы
Можно сделать некоторое усовершенствование описанного ранее способа - передавать значение, которое в шейдере будет сравниваться с другими значениями (пределами). Одно управляющее значение и два пороговых значения позволят шейдеру рисовать объект тремя способами: одним, если управляющее значение меньше порогового значения, вторым - если управляющее значение находится между двумя пороговыми значениями, и третьим - если управляющее значение больше порогового значения.
В приведенном примере с рекламой есть одна неточность: на самом деле неоновые лампы не гаснут и не загораются сразу, это происходит постепенно. Применив описанный способ, можно усовершенствовать пример, сглаживая переход между двумя крайними состояниями. Плавный переход можно вычислять с помощью функции smoothstep.
3.3. Преобразования
Для хранимых или процедурных текстур самая простая анимация - сдвиг при считывании значений из текстуры. Например, если нужно изобразить облака, плывущие по небу, можно взять шейдер, описанный в разделе 12.4, и внести в него небольшие изменения. К индексу для трехмерной текстуры шума (координатам объекта) добавляется смещение, значение которого берется из uniform-переменной, а переменная обновляется из приложения с каждым новым кадром. Если нужно добиться медленного движения облаков слева направо, из х-компоненты этой uniform-переменной при смене кадров вычитается небольшое постоянное значение. Если же, допустим, облака должны двигаться быстро снизу вверх, нужно вычитать большее постоянное значение из ^-компонентов. Для получения более сложного эффекта изменяются все три координаты. Чтобы вычислить это смещение, можно использовать функцию шума, делающую движение облаков более реалистичным и не похожим на обычную прокрутку.
Шейдер облаков, измененный с учетом последних замечаний, приведен в листинге 13.1.
Листинг 13.1. Фрагментный шейдер для анимации облачного неба
varying float Lightlntensity: varying vec3 MCposition:
uniform sampler3D Noise:
uniform vec3 SkyColor; // (0.0. 0.0. 0,8)
uniform vec3 CloudColor: // (0.8, 0.8. 0,8)
uniform vec3 Offset: // обновляется приложением для каждого кадра
void main (void)
{
vec4 noisevec = texture3D(Noise, MCposition + Offset):