3 votes

Comment utiliser les shaders dans OpenGL ES avec l'iPhone SDK

J'ai cette obsession de faire des animations de personnages en temps réel basées sur la cinématique inverse et les cibles morphologiques.

J'ai fait un bon bout de chemin avec Animata, un programme d'animation de type chaîne IK à code source ouvert (basé sur FLTK, malheureusement). J'ai même porté leur code de rendu sur une variété de plateformes (Java / Processing et iPhone). alt video http://ats.vimeo.com/612/732/61273232_100.jpg vidéo des moteurs de rendu Animata

Cependant, je n'ai jamais été convaincu que leur code soit particulièrement optimisé et il semble qu'il faille beaucoup de simulation sur le CPU pour rendre chaque image, ce qui me semble un peu inutile.

Je suis en train de lancer un projet de création d'une application pour l'iPad qui repose en grande partie sur l'animation de personnages en temps réel, et en feuilletant la documentation iOS, j'ai découvert un extrait de code pour un "two bone skinning shader".

// A vertex shader that efficiently implements two bone skinning.

attribute vec4 a_position;
attribute float a_joint1, a_joint2;
attribute float a_weight1, a_weight2;

uniform mat4 u_skinningMatrix[JOINT_COUNT];
uniform mat4 u_modelViewProjectionMatrix;

void main(void)
{
    vec4 p0 = u_skinningMatrix[int(a_joint1)] * a_position;
    vec4 p1 = u_skinningMatrix[int(a_joint2)] * a_position;
    vec4 p = p0 * a_weight1 + p1 * a_weight2;
    gl_Position = u_modelViewProjectionMatrix * p;
}

Quelqu'un sait-il comment utiliser un tel extrait ? Il est présenté avec très peu de contexte. Je pense que c'est ce que je dois faire pour réaliser l'animation osseuse de la chaîne IK que je veux faire, mais sur le GPU.

3voto

Michael Forrest Points 769

J'ai fait beaucoup de recherches et j'ai maintenant l'impression de presque comprendre de quoi il s'agit.

La première leçon importante que j'ai apprise est qu'OpenGL 1.1 est très différent d'OpenGL 2.0. Dans la v2.0, le principe semble être que les tableaux de données sont transmis au GPU et que les shaders sont utilisés pour le rendu des détails. Ceci est différent de la v1.1 où plus de choses sont faites dans le code d'application normal avec pushmatrix/popmatrix et diverses commandes de dessin en ligne.

Une excellente série d'articles de blog présentant les dernières approches d'OpenGL est disponible ici : Le blog de Joe : Une introduction à l'OpenGL moderne

Le vertex shader que je décris ci-dessus exécute une transformation sur un ensemble de positions de vertex. Les membres 'attributs' sont par sommet et les membres 'uniformes' sont communs à tous les sommets.

Pour faire fonctionner ce code, il faudrait introduire un tableau de positions vectorielles (les positions d'origine, je suppose), les tableaux correspondants d'articulations et de poids (les autres variables d'attribut) et ce shader repositionnerait les sommets d'entrée en fonction de leurs articulations.

Les variables uniformes concernent d'abord l'image de texture fournie, et la matrice de projection qui, je pense, a quelque chose à voir avec la transformation du système de coordonnées du monde en quelque chose de plus approprié aux exigences particulières.

Pour en revenir au développement de l'iPhone, la meilleure chose à faire est de créer un projet modèle OpenGL ES et de prêter attention aux deux classes de rendu différentes. L'une est destinée à la norme OpenGL 1.1, plus linéaire et dépassée, et l'autre à la norme OpenGL 2.0. Personnellement, je jette le code GL1.1 étant donné qu'il s'applique principalement aux anciens appareils iPhone et que depuis que je vise l'iPad, il n'est plus pertinent. Je peux obtenir de meilleures performances avec les shaders sur le GPU en utilisant GL2.0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X