Comment l'animation est-elle gérée dans OpenGL non immédiat?

8

Je suis novice en OpenGL moderne. Je suis à l'aise avec la méthodologie OpenGL immédiate, mais je n'ai jamais utilisé sérieusement les VBO. Ma question concerne l'animation. En mode immédiat, pour réaliser une animation, il vous suffit de diffuser différentes positions de sommets (interpolées à partir d'images clés) dans l'espace objet.

Comment cela est-il réalisé dans OpenGL non immédiat? De toute évidence, le téléchargement de données VBO fraîches pour chaque image va certainement monopoliser le bus graphique. Je n'ai trouvé aucune littérature sur la manière moderne de le faire. En y réfléchissant, je suis arrivé à plusieurs options:

  • Attributs: animation comme offset 3D. Pour chaque image, un attribut de décalage différent (éventuellement interpolé) est transmis pour chaque sommet, appliqué au même sommet pour chaque image clé.
  • Indices: stocker des images clés en tant que sommets absolus et y accéder par indexation, en utilisant un ensemble différent de sommets pour chaque image clé Je trouve cette approche impossible, car vous ne pouvez pas accéder aux images clés adjacentes et ne pouvez donc pas interpoler entre elles. Cela semble également être une mauvaise idée pour l'animation procédurale.
  • Texture: cela peut être très extensible mais sonne comme une bonne solution pour moi. Encore une fois, l'animation est considérée comme un décalage xyz pour chaque sommet. Chaque image clé peut être stockée dans une texture 1D où la dimension correspond à vertexID.Si je ne me trompe pas, dans OpenGL 4.0, vous pouvez accéder aux textures de n'importe quel shader, vous pouvez donc lire cette texture à partir du vertex shader et appliquer chaque transformation de vertex. Une texture 2D peut contenir plusieurs images. Vous effectuez toujours une interpolation (et si l'interpolation fonctionne pour les textures en dehors du fragment shader, dont je ne suis pas sûr, vous pouvez interpoler linéairement gratuitement!) Cela pourrait être appliqué à des systèmes d'animation plus complexes comme l'animation osseuse sans trop d'effort.

Suis-je trop réfléchir à cela? Quelqu'un peut-il nous éclairer?

kaoD
la source

Réponses:

5

Je n'ai trouvé aucune littérature sur la manière moderne de le faire.

C'est généralement parce que la «manière moderne» d'avoir une animation de personnage est d'utiliser la pesée des os squelettiques, pas le mélange des sommets.

Cependant, si vous insistez pour faire une animation basée sur un mélange de sommets, vous pouvez. Le moyen le plus simple consiste à simplement envoyer les deux images clés à fusionner en tant qu'attributs. Vous disposez de données de position pour toutes les différentes images clés; utilisez simplement glVertexAttribPointer(ou glVertexPointersi vous insistez) pour choisir des images clés spécifiques. Étant donné que chaque image clé doit avoir ses données de position stockées dans le même ordre (pour les positions correspondantes), elles peuvent utiliser la même liste d'index pour le rendu.

Le shader obtient deux attributs de "position", un pour l'image clé devant l'heure actuelle et un pour l'image clé après. Vous passeriez également un uniforme qui spécifie la quantité de mélange à faire entre eux. Vous calculez la nouvelle position comme un mélange entre les deux images clés, puis effectuez les transformations habituelles à partir de là.

Nicol Bolas
la source
Avez-vous des livres ou des articles recommandés à lire pour commencer à apprendre à écrire du code pour gérer la pesée osseuse squelettique?
michael.bartnett
Je cherchais "comment déplacer les sommets" et non comment faire l'animation réelle. Eh bien, ce n'est pas si différent avec la pondération osseuse squelettique, après tout, cela se résume à des sommets se déplaçant, que ce soit précalculé (mélange de vertex) ou pondéré à la volée. Les attributs sont-ils la seule voie à suivre? L'approche basée sur la texture n'est-elle pas encore faisable et plus rapide que de faire circuler beaucoup de données pour chaque sommet à chaque image? (au moins à la fois les images clés par os et le facteur de fusion) Une texture peut toujours coder la rotation de l'os et la recherche de texture est beaucoup plus rapide que de transmettre des attributs.
kaoD
Aussi: "Étant donné que chaque image clé doit avoir ses données de position stockées [...], elles peuvent utiliser la même liste d'index pour le rendu." N'est-ce pas impossible? Comment puis-je accéder à deux indices pour interpoler entre? Le vertex shader n'est-il pas inconscient les uns des autres et encore plus des autres indices?
kaoD
@kaoD: Impossible? N'est-ce pas ce que vous faites actuellement pour calculer la nouvelle position du sommet? Pour chaque position dans chaque tableau d'images clés, vous les mélangez et les écrivez dans OpenGL. Tout ce que je dis, c'est que vous fournissez ces tableaux d'images clés à OpenGL et laissez le shader faire le mélange. Quant aux recherches de texture, dans la hiérarchie des "choses rapides dans les shaders", les recherches de texture sont généralement en bas . Les attributs sont, plus ou moins libres .
Nicol Bolas
@NicolBolas: bon de savoir que la recherche de texture est plus lente que je ne le pensais. Ce que je veux dire avec impossible, c'est que, si je ne me trompe pas, chaque sommet ne peut que "se voir" dans le shader, et ne peut donc pas indexer d'autres sommets ou accéder à d'autres tableaux (images clés). Ce que je comprends de votre réponse est que je dois passer ces deux positions d'images clés en tant qu'attributs pour chaque sommet, avec un facteur de mélange uniforme, mais je n'aurais alors aucun tableau de sommets, n'est-ce pas? Bien que je viens de réaliser que vous pouvez utiliser l'image-clé actuelle comme tableau de sommets et l'image suivante comme tableau d'attributs, c'est ce que vous vouliez dire?
kaoD