V. Tutoriel 3. Animation de personnages (skinning) sur GPU▲
Ce tutoriel montre comment réaliser du skinning sur le GPU en utilisant le vertex du pipeline programmable pour soulager le CPU. Nous utilisons Assimp pour importer le modèle animé. Un modèle animé est composé d'un maillage lié à un squelette articulé. Le squelette est composé d'une hiérarchie d'os où chaque os est représenté par une matrice de transformation. Chaque position de vertex est affectée par N os. Les indices des os influencés, ainsi que leur poids respectif, sont stockés dans les attributs du vertex. Dans le vertex shader, nous calculons la position finale du vertex en additionnant les combinaisons des différentes contributions des os. Par exemple : un vertex 'vert' est influencé par l'os 'bone0' avec le poids 'weight0' et l'os 'bone1' avec le poids 'weight1'. La position finale de 'vert' est calculée comme suit :
vert.finalpos =
weight0 *
(bone0.matrix *
vert.pos) +
weight1 *
(bone1.matrix *
vert.pos);
V-A. Code de la procédure▲
Dans le vertex shader, nous trouvons les matrices de transformation des os influencés pour le vertex actuel avec leur poids respectif comme suit :
// skinningMatrix contient les matrices de transformation de tous les os. bones.x/y/z/w contient les indices des os qui affectent le vertex
vec4
p0 =
skinningMatrix[ int
(
bones.x) ] *
position;
vec4
p1 =
skinningMatrix[ int
(
bones.y) ] *
position;
vec4
p2 =
skinningMatrix[ int
(
bones.z) ] *
position;
vec4
p3 =
skinningMatrix[ int
(
bones.w) ] *
position;
La position finale du vertex est la somme des quatre vertices, chacun multiplié par le poids de l'os (la somme des poids d'un os doit être égale à 1) :
// Position interpolée
vec4
interpolatedPosition =
p0 *
weights.x +
p1 *
weights.y +
p2 *
weights.z +
p3 *
weights.w;