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:


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