2010-07-04 13 views
3

J'ai cette obsession de faire des animations de personnages en temps réel basées sur des cinématiques inverses et des cibles de morphing.Comment utiliser les shaders dans OpenGL ES avec iPhone SDK

J'ai trouvé le bon chemin avec Animata, un programme d'animation open-source (basé sur FLTK, malheureusement) de type IK. 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.jpgvideo of Animata renderers

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

Je suis maintenant démarrer un projet de faire une application sur l'iPad qui repose en grande partie sur l'animation de personnages en temps réel, et feuilletant la documentation iOS j'ai découvert un extrait de code pour un « deux os shaders écorcher »

// 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; 
} 

Est-ce que quelqu'un sait comment j'utiliserais un tel extrait? Il est présenté avec très peu de contexte. Je pense que c'est ce que je dois faire pour faire l'animation sur os de la chaîne IK que je veux faire, mais sur le GPU.

Répondre

3

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 que OpenGL 1.1 est très différent d'OpenGL 2.0. Dans v2.0, le principe semble être que les tableaux de données sont fournis au GPU et aux shaders utilisés pour le rendu des détails. Ceci est différent de la v1.1 où plus est fait dans le code d'application normal avec pushmatrix/popmatrix et diverses commandes de dessin en ligne.

Une excellente série de messages de blog introduisant les dernières approches OpenGL ici: Joe's Blog: An intro to modern OpenGL

Le vertex shader je décris ci-dessus est une exécute une transformation sur un ensemble de positions de sommet. Les membres 'attribut' sont des membres par sommet et les membres 'uniformes' sont communs à tous les sommets. Pour que ce code fonctionne, vous devez insérer un tableau de positions vectorielles (les positions d'origine, je suppose), des tableaux d'articulations et de poids correspondants (les autres variables d'attribut) et ce shader repositionnerait les sommets d'entrée en fonction de leur joints attachés. Les variables uniformes se rapportent 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. En ce qui concerne le développement de l'iPhone, la meilleure chose à faire est de créer un projet de modèle OpenGL ES et de prêter attention aux deux classes de rendu différentes. L'un est pour l'OpenGL 1.1 plus linéaire et obsolète et l'autre pour OpenGL 2.0. Personnellement, je rejette le code GL1.1 étant donné qu'il s'applique principalement aux anciens appareils iPhone et que je cible l'iPad, ce n'est plus pertinent. Je peux obtenir de meilleures performances avec les shaders sur le GPU en utilisant GL2.0.

+0

Il est également intéressant de regarder OpenGL Shader Builder, inclus avec les outils de développement Apple. Notez que l'ajout d'une variable uniforme ne la fera pas apparaître comme quelque chose avec lequel vous pouvez jouer jusqu'à ce que vous ayez fait référence à cette variable dans votre code de shader (que l'on me gratte la tête depuis trop longtemps). La plupart des exemples de Joe peuvent être testés dans le Shader Builder, donc vous n'avez pas besoin d'écrire tout ce C pour comprendre les principes. –