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;


