float intensity = ( noisevec[0] + noisevec[l] + noisevec[2] + noisevec[3]) * 1.5:
vec3 color = mix(SkyColor. CloudColor. intensity) * Lightlntensity:
gl_FragColor = vec4 (color, 1.0):
}
13.4. Интерполяция ключевых кадров
Рассмотрим еще один интересный эффект анимации - постепенный переход между двумя объектами. Его можно применять также для перехода от одного эффекта к другому за определенное количество кадров. Вместо того чтобы выполнять в приложении сложные вычисления перехода между объектами, можно делать это автоматически с помощью шейдера.
Этим способом можно задавать переход либо между разными формами объекта, либо между цветами, текстурами, процедурными рисунками и т. д. Все, что для этого нужно, - создать шейдер, который будет получать значение времени (или смены кадров). В некоторых случаях бывает достаточно линейного перехода. А для получения эффекта колебаний приложение должно вычислять коэффициент интерполяции с помощью функции сплайна, чтобы избежать прерывистости анимации. (Можно, конечно, делать эти вычисления и в шейдере, но лучше, чтобы приложение выполняло вычисления один раз для каждого кадра, чем для каждой вершины или каждого фрагмента, как было бы в шейдере.)
Через дополнительные атрибуты вершин можно передавать в шейдер координаты точек не одного, а двух объектов. Координаты первого объекта будут передаваться как обычно (gl Vertex, gl Col or, gl Normal и т. д.). А координаты второго объекта будут передаваться через дополнительные атрибуты вершин 0, 1, 2 и т. д. Приложение может также передавать через uniform-переменную коэффициент сглаживания, а вершинный шейдер использует его для вычисления среднего значения из двух наборов параметров вершин. Вычисленные координаты вершины в дальнейшем передаются для преобразования, а вычисленная средняя нормаль используется при вычислении освещения.
Чтобы переход выглядел реалистично, нужно выбрать правильное количество ключевых кадров, а также промежуточных точек на переходе между объектами. В [8, с. 64-65] этот принцип описывается как «распределение интервалов времени» (тайминг); принципы его работы объясняются так: «Пусть заданы два ключевых кадра рисунка головы, в первом голова повернута к правому плечу, а во втором - к левому и подбородок слегка приподнят. Можно создать множество разных эффектов, зависящих только от количества промежуточных кадров. Каждый дополнительный кадр придает движению новое значение.
Нет промежуточных кадров |
Персонаж ударили с огромной силой, и у него чуть не оторвалась голова |
Один промежуточный кадр |
Персонаж ударили кирпичом, скалкой или сковородкой |
Два промежуточных кадра |
У персонажа нервный тик, мышечный спазм или судорога |
Три промежуточных кадра |
Персонаж уклоняется от кирпича, скалки, сковородки |
Четыре промежуточных кадра |
Персонаж дает резкий приказ («Начинай!») |
Пять промежуточных кадров |
Жест персонажа более дружественный («Поторопись!») |
Шесть промежуточных кадров |
Персонаж видит хорошенькую девушку или спортивную машину, о которой мечтает |
Семь промежуточных кадров |
Персонаж рассматривает какой-либо предмет |
Восемь промежуточных кадров |
Персонаж ищет ореховую скорлупку на кухонной полке |
Девять промежуточных кадров |
Персонаж вдумчиво оценивает какой-либо предмет |
Десять промежуточных кадров |
У персонажа при повороте головы растягивается больная мышца |
varying float Lightlntensity: varying vec2 TexCoord: