Смекни!
smekni.com

на тему: Скелетная анимация с использованием шейдеров. Информационные Системы и технологии. 230201. 65 Работу (стр. 2 из 2)

Анимация персонажей.

Для анимации персонажей наиболее часто используется скелетная анимация. Для представления движения живых существ, таких как человека, животного или насекомого, удобно хранить взаимосвязи между подвижными частями данного персонажа, например, голова крепится к шее, ступня к ноге и т.д. Движение любой части можно задать как движение отдельной кости. В большинстве случаев скелетную анимацию для персонажей можно оптимизировать. [1]

Преимущества скелетной анимации.

В чем преимущества подхода реализации деформации в виде скелетной анимации? Во-первых, это относительно малое количество данных, требуемое для хранения анимации, например, если сравнивать с морфингом. Выигрыш из иерархии также в том, что для задания какой-то анимации нет необходимости задавать и хранить анимацию для каждой кости. То есть, например, если мы сгибаем руку в локте, не нужно описывать движение кисти руки. Кроме того, использование скелета делает более очевидной задачу использования ключей для анимации и последующую интерполяцию между ними, либо линейную, либо сплайновую. При этом, частоту появления ключевых кадров можно значительно уменьшить: в линейном случае можно провести оптимизацию на незначительных изгибах кривой движения, а в сплайновом - задаётся аниматором.

Во-вторых, поскольку скелет представляет собой некую иерархию костей, то имеется возможность использовать инверсную кинематику.

Иногда предоставляется возможность применять одну и ту же анимацию для похожих моделей с одинаковой структурой. Например, ясно, что если у нас есть анимация ходьбы для какого-нибудь мальчика, то мы не можем применить эту анимацию к животному, например, к собаке, однако модель девочки может использовать ту же самую анимацию для своей ходьбы. То же самое можно распространить и на "уровни детализации" и на замещение некоторой части полигональной модели, например, если у вас есть некий герой, который меняет одежду, то не нужно для каждого обмундирования иметь свою отдельную анимацию, достаточно аниматорам создать соответствующую привязку вершин к нужным костям скелета.

Кроме того, к преимуществам можно отнести эффективное использование скелетной анимации, описанное ниже. [1]

Эффективное использование скелетной анимации.

Здесь мы рассмотрим один из типов соединений между костями, также называемые связями или суставами, которые часто можно использовать в построении скелета. Называются такие связи шарнирами (revolute joint). В шарнирных соединениях конечная точка одной кости вращается вокруг какой-то статической точки, обычно конечной точки родительской кости. Приятной особенностью такой связи является то, что для перемещения каждой кости в новую позицию задаётся только вращение. Отсюда следует, что для анимации необходимо хранить только информацию о вращении.

Итак, можно предоставить простой способ представления скелета. Имеется иерархия костей. Каждая кость имеет локальный набор информации - длину и вращение. Вращение обычно задаётся кватернионом.

По договорённости, каждая кость выровнена по оси X. Конечная точка кости находится на оси X и смещена по ней на длину кости. Относительная матрица вращения вычисляется из локального значения вращения текущей кости, а перемещение является сдвигом на длину родительской кости по X-координате в локальной системе координат родителя.

Использование шарнирных соединений ведёт к более низким затратам на хранение анимации. [1]

Шейдеры

Нынешнее графическое железо предоставляет пользователю возможность замены некоторых частей графического конвейера шейдером. Шейдер — это специальная программа, которая использует определенные программируемые регистры видеокарты для создания различных графических эффектов. Более новые видео-карты обеспечивают расширенные возможности программируемости шейдеров: огромное количество инструкций, динамическое ветвление и т.д. [2]

Шейдер - это программа для процессора графической карты (GPU), выполняющая специфические задачи, заменяя соответствующие блоки FFP.Есть два типа таких программ (шейдеров):

Вершинный шейдер (в OpenGL - вершинная программа) - это программа для вершинного процессора, обрабатывающая вершинные данные.

Пиксельный шейдер (в OpenGL - фрагментная программа) - это программа для фрагментного процессора, обрабатывающая данные фрагмента, такие как: степень затуманивания, текстурные координаты, глубина и прочее.

Программы можно писать на асм-подобных языках или на шейдерных языках высокого уровня, например: HLSL, GLSL или Cg. Синтаксис шейдерной программы очень похож на синтаксис языка C. [4]

Шейдер (англ. Shader) — это программа для одной из ступеней графического конвейера, используемая в трёхмерной графике для определения окончательных параметров объекта или изображения. Она может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затенение, смещение поверхности и эффекты пост-обработки.

Есть два вида видеокарт - с индексом MX и FX, так вот МХ шейдеры не поддерживает, а FX да. Образно говоря, в играх, особенно с быстро меняющимся сюжетом, например, автогонки, без шейдеров задний план постоянно как бы прорисовывается, с шейдерами задний план висит постоянно, увеличивается как бы глубина изображения. И чем больше шейдеров поддерживает видеокарта, тем приятнее глубина резкости изображения дальнего плана. Некоторые навороченные игрушки с движком такого плана, где надо поддерживать дальний план местности, вообще не запускаются или запускаются с ужасно искаженной графикой без поддержки шейдеров. [3]

Использование вершинных шейдеров для ускорения расчётов

Некоторые функции выполняются на процессоре видеокарты (GPU) особенно быстро. Например, к таким функциям относится умножение вектора на матрицу. Практически все расчёты, связанные со скелетной анимацией, можно перенести с CPU на GPU. Но здесь важно учитывать следующий эффект: если переусердствовать нагружением видеокарты различными шейдерами, то может возникнуть ситуация, при которой CPU простаивает в ожидании перегруженного шейдерными задачами GPU.

Современные видеокарты могут хранить 3D модели прямо в своей памяти. Отрисовка модели из памяти видеокарты происходит существенно быстрее, так как не тратится время на вызовы glTexCoord2f, glVertex3f и подобных функций, требующих времени на копирование данных из одной памяти (CPU) в другую (GPU). Осуществить ускоренную работу видеокарты позволяют Vertex Buffer Objects (VBOs).

В данной версии имеет место многократная трансформация повторяющихся вершин. Работа над устранением этой проблемы может дать ощутимый прирост скорости. [5]

Совместное использование VBO и шейдеров

Максимальный прирост производительности дают VBO с полностью статическими моделями: модели один раз загружаются в память видеокарты сразу после запуска программы. Под воздействием шейдеров статическая модель "оживает" непосредственно внутри видеокарты. В таком случае у нас есть два источника прироста производительности: VBO в режиме вывода статических моделей и быстрое перемножение вершин на матрицы трансформации костей внутри шейдера. [5]

Вершинный шейдер.

//

// GLSL vertex shader for skeletal animation

//

#define N 100

#define EPS 0.001

uniform vec4 boneQuat [N];

uniform vec4 bonePos [N];

//

// Quaternion multiplication

//

vec4 quatMul ( in vec4 q1, in vec4 q2 )

{

vec3 im = q1.w * q2.xyz + q1.xyz * q2.w + cross ( q1.xyz, q2.xyz );

vec4 dt = q1 * q2;

float re = dot ( dt, vec4 ( -1.0, -1.0, -1.0, 1.0 ) );

return vec4 ( im, re );

}

//

// vector rotation via quaternion

//

vec4 quatRotate ( in vec3 p, in vec4 q )

{

vec4 temp = quatMul ( q, vec4 ( p, 0.0 ) );

return quatMul ( temp, vec4 ( -q.x, -q.y, -q.z, q.w ) );

}

vec3 boneTransf ( int index, vec3 pos )

{

return bonePos [index].xyz + quatRotate ( pos, boneQuat [index] ).xyz;

}

void main ()

{

vec4 weights = gl_MultiTexCoord3; // weights for 4 bones

vec3 pos = vec3 ( 0.0 );

int index;

if ( weights.x > EPS ) // process 1st bone

{ // get 1st bone index

index = int ( gl_MultiTexCoord4.w );

pos += weights.x * boneTransf ( index, gl_MultiTexCoord4.xyz );

}

if ( weights.y > EPS ) // process 2nd bone

{ // get 2nd bone index

index = int ( gl_MultiTexCoord5.w );

pos += weights.y * boneTransf ( index, gl_MultiTexCoord5.xyz );

}

if ( weights.z > EPS ) // process 3rd bone

{ // get 3rd bone index

index = int ( gl_MultiTexCoord6.w );

pos += weights.z * boneTransf ( index, gl_MultiTexCoord6.xyz );

}

if ( weights.w > EPS ) // process 4th bone

{ // get 4th bone index

index = int ( gl_MultiTexCoord7.w );

pos += weights.w * boneTransf ( index, gl_MultiTexCoord7.xyz );

}

gl_Position = gl_ModelViewProjectionMatrix * vec4 ( pos, 1.0 );

gl_TexCoord [0] = gl_MultiTexCoord0;

} [7]

Заключение.

Совместное использование VBO и шейдеров позволяет увеличить FPS в несколько раз. Возможные источники прироста производительности таковы:

Благодаря функции glInterleavedArrays и выбору текстуры внутри шейдера отрисовка модели осуществляется за один вызов glDrawArrays.

Данные о вершинах и креплении к скелету 3D модели загружаются в память видеокарты только один раз после старта программы.

Высокая скорость GPU при перемножении вершин модели на матрицы костей.

При использовании VBO все необходимые шейдеру данные уже находятся в памяти видеокарты и отсутствует потеря времени на ожидание передачи данных от CPU. [5]

Шейдеры предоставляют программисту мощное средство для реализации сложных трехмерных эффектов, postprocessing-эффектов и увеличения общего быстродействия. Хотя качественное использование шейдеров – сложная задача, требующая наличия у программиста множества дополнительных знаний, преимущества использования шейдеров заметно превышают недостатки. [6, c 13]

Список литературы.

1. С.Ваткин – «Скелетная анимация: Введение» http://wat.gamedev.ru/articles/SkelAnim1

2. Иннокентий, Paronator – «Программирование шейдеров на HLSL» http://www.gamedev.ru/code/articles/HLSL

3. А. Кутеминский – «Что такое шейдеры?»

http://webotvet.ru/articles/opredelenie-sheyderi.html

4. Ю.Кремечуг – «Уроки для программистов – Шейдеры»

http://www.elite-games.ru/art/program/jurlesson8.shtml

5. «Оптимизация скелетной анимации (vbo+шейдеры)»

http://gcreat.ucoz.ru/forum/49-132-1

6. А. Сморкалов – «OpenGL. Шейдеры»

7. А.В. Борешоф – «Основы скелетной анимации»

http://steps3d.narod.ru/tutorials/skeletal-animation-tutorial.html