3.2. Пределы
Можно сделать некоторое усовершенствование описанного ранее способа - передавать значение, которое в шейдере будет сравниваться с другими значениями (пределами). Одно управляющее значение и два пороговых значения позволят шейдеру рисовать объект тремя способами: одним, если управляющее значение меньше порогового значения, вторым - если управляющее значение находится между двумя пороговыми значениями, и третьим - если управляющее значение больше порогового значения.
В приведенном примере с рекламой есть одна неточность: на самом деле неоновые лампы не гаснут и не загораются сразу, это происходит постепенно. Применив описанный способ, можно усовершенствовать пример, сглаживая переход между двумя крайними состояниями. Плавный переход можно вычислять с помощью функции зтооТ-Ь^ер.
3.3. Преобразования Для хранимых или процедурных текстур самая простая анимация - сдвиг при считывании значений из текстуры. Например, если нужно изобразить облака, плывущие по небу, можно взять шейдер, описанный в разделе 12.4, и внести в него небольшие изменения. К индексу для трехмерной текстуры шума (координатам
Анимированные шейдеры
объекта) добавляется смещение, значение которого берется из uniform-переменной, а переменная обновляется из приложения с каждым новым кадром. Если нужно добиться медленного движения облаков слева направо, из х-компоненты этой uniform-переменной при смене кадров вычитается небольшое постоянное значение. Если же, допустим, облака должны двигаться быстро снизу вверх, нужно вычитать большее постоянное значение из «/-компонентов. Для получения более сложного эффекта изменяются все три координаты. Чтобы вычислить это смещение, можно использовать функцию шума, делающую движение облаков более реалистичным и не похожим на обычную прокрутку.
Шейдер облаков, измененный с учетом последних замечаний, приведен в листинге 13.1.
Листинг 13.1. Фрагментный шейдер для анимации облачного неба
varying float Lightlntensity: varying vec3 MCposition
uniform sampler3D Noise uniform vec3 SkyColor; uniform vec3 CloudColor uniform vec3 Offset: