Pour le calcul réel de la déformation, cela peut devenir très compliqué, pourquoi ne commencez- vous pas ici? .
Je vais maintenant parler de la façon dont vous pouvez appliquer cela, en supposant que vous avez déjà les calculs nécessaires pour réduire vos déformations.
2 façons:
1) Chaque cadre, visitez chaque sommet du modèle de cylindre et décalez-le d'une manière ou d'une autre.
2) Décalez les sommets dans le vertex shader lors du rendu. OpenGL ES 2.0 prend en charge les vertex shaders. Vous avez donc de la chance, en quelque sorte.
Voulez-vous déformer uniquement l'objet tel qu'il apparaît à l'écran , ou voulez-vous déformer l'objet de sorte que chaque objet du jeu sache qu'il a été déformé?
Si vous déformez l'objet dans le vertex shader, cela ne se produit qu'immédiatement avant l'affichage / la pixellisation , donc cela signifie qu'aucun des objets du jeu ne connaîtra la déformation . C'est très bien si vous faites simplement un économiseur d'écran, ou si les déformations sont si petites qu'elles n'ont aucun impact sur la forme collidable de l'objet.
Lorsque vous déformez la géométrie dans le vertex shader, les sommets d'origine du modèle ne bougent pas (ils semblent se déplacer uniquement ).
Déformation dans le vertex shader
Non déformé:
Déformé
Ceci est du chapitre 6 du tutoriel cg , (programme # 14).
Le code shader pour produire cette déformation est quelque chose comme
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
Comme vous pouvez le voir, cela se produit juste avant l'affichage (le vertex shader se produit sur le GPU), donc le code CPU n'a pratiquement aucun moyen d'accéder à la position du vertex transformé (il existe des moyens d'envoyer des données du GPU au CPU (principalement via des textures) mais nous n'y ira pas).