À quoi servent les indices dans le rendu 3D?

11

Supposons que vous créiez un cube 3D dans OpenGL. Vous implémentez les données de sommet nécessaires pour l'objet (cube). Quel serait l'intérêt d'utiliser des indices?

v

 void CreateCube()
        {
            const Vertex VERTICES[8] =
            {
                { { -.5f, -.5f,  .5f, 1 }, { 0, 0, 1, 1 } },
                { { -.5f,  .5f,  .5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f,  .5f, 1 }, { 0, 1, 0, 1 } },
                { {  .5f, -.5f,  .5f, 1 }, { 1, 1, 0, 1 } },
                { { -.5f, -.5f, -.5f, 1 }, { 1, 1, 1, 1 } },
                { { -.5f,  .5f, -.5f, 1 }, { 1, 0, 0, 1 } },
                { {  .5f,  .5f, -.5f, 1 }, { 1, 0, 1, 1 } },
                { {  .5f, -.5f, -.5f, 1 }, { 0, 0, 1, 1 } }
            };

            const GLuint INDICES[36] =
            {
                0,2,1,  0,3,2,
                4,3,0,  4,7,3,
                4,1,5,  4,0,1,
                3,6,2,  3,7,6,
                1,6,5,  1,2,6,
                7,5,6,  7,4,5
            };

    //....

    glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);

Dans l'exemple ci-dessus, un cube est créé avec les sommets nécessaires dans l'espace mondial. Quelle est la pertinence pour les indices?

Sad CRUD Developer
la source
1
Dans de nombreux endroits, vous verrez des gens les appeler des visages. Et c'est ce qu'ils sont. Chaque face est généralement composée de 3 sommets, pour former un triangle. Par conséquent, chacun des 3 indices correspond à un triangle dans le maillage final. Ils sont appelés indices car ils sont principalement des décalages de l'emplacement des informations de sommet réelles dans le tableau de sommets. C'est tout ce que vous devez savoir sur les indices, je suppose :)
Grimshaw

Réponses:

24

Des indices existent pour réduire l'empreinte mémoire requise pour représenter un modèle 3D, de la même manière que les palettes de couleurs peuvent être utilisées pour réduire l'empreinte mémoire d'une image 2D.

L'indexation vous permet d'éviter de répéter une définition complète d'un sommet si vous devez dupliquer les données de ce sommet, comme vous devez généralement le faire pour un modèle complexe.

Les API 3D modernes sont rendues à l'aide de triangles; chaque face d'un cube nécessite deux triangles:

A--B 
|\ |   This cube face has two triangles:
| \|   ABD and ADC.
C--D

Pour spécifier cette face sans index, vous devez spécifier les sommets A, B, D, A, D, C. Deux sommets ( Aet D) sont répétés dans le tampon de vertex.

Cependant, avec des indices, vous pouvez avoir un tampon de sommet ne contenant que les sommets requis ( A, B, Cet D) et six indices: 0, 1, 3, 0, 3, 2. Étant donné que les indices sont généralement beaucoup plus petits que les sommets et que de nombreux sommets se répètent généralement dans les modèles pratiques, cela peut représenter un gain d'espace important.

Notez que certains sommets ne partageront que des attributs partiels. Par exemple, lors du rendu d'un cube avec un mappage de texture, on veut généralement des coordonnées de texture uniques par face, vous aurez donc plusieurs sommets avec la même position et des coordonnées de texture différentes. Ce nombre de doublons est acceptable et nécessaire; c'est lorsque vous dupliquez un ensemble entier d'attributs de sommet que vous commencez à voir les avantages de l'indexation.

Si en effet tous vos sommets de maillage sont distincts à 100%, les indices ne présentent aucun avantage (en fait, vous utiliseriez plus d'espace dans la consommation du tampon d'index redondant). Cependant, cela ne se produit pas toujours.


la source
1
Doit-il plutôt être 0,1,3, 0,1,2?
Sad CRUD Developer
0, 1, 3, 0, 3, 2 en fait, merci (basé sur A = 0, B = 1, C = 2, D = 3). J'ai mis à jour la réponse.
il convient peut-être de mentionner que, sur un maillage triangulaire, le nombre moyen de triangles adjacents à un sommet est de 6.
Arne
7

L'utilisation d'indices sert trois objectifs principaux:

  • Réduction des besoins en mémoire en permettant de supprimer les sommets en double du maillage d'origine.
  • Réduire les calculs de vertex shader en ne permettant de transformer les sommets en double qu'une seule fois.
  • Concaténation des primitives vous permettant ainsi de réduire les appels de tirage.

Parmi ceux-ci, le premier est évident car vous pouvez le mesurer directement dans votre propre code: si un maillage avait, par exemple, 50k sommets mais si 30k d'entre eux étaient des doublons, alors vous avez une économie de mémoire.

Les deuxième et troisième ne sont pas si évidents - vous devez déjà avoir pris la décision d'utiliser des indices, et vous devez profiler votre code et isoler les performances "avant" et "après" afin d'en obtenir une mesure.

Pour le second, le matériel est capable de mettre en cache le résultat des sommets récemment transformés. Si le même sommet que celui qui a été récemment transformé apparaît, la version mise en cache peut être utilisée au lieu de devoir recommencer les calculs. Le matériel utilise l'index pour les identifier, donc les indices sont absolument nécessaires pour obtenir ce comportement.

Pour le troisième, chaque appel de tirage que vous effectuez a une surcharge de processeur, quelle que soit la quantité de travail GPU à effectuer. Si tout le reste est égal, dessiner un maillage de 50k en 1 appel de tirage sera beaucoup plus rapide que le dessiner en appels de tirage de 10k. Mais si votre maillage est composé de plusieurs bandes, ou (pire encore) d'une combinaison de bandes et de ventilateurs, vous ne pouvez pas le faire en un seul appel sans (1) utiliser des indices ou (2) introduire des triangles dégénérés. Mais comme les indices sont beaucoup plus petits que les sommets, l'utilisation d'indices est préférable dans le cas général.

Maximus Minimus
la source
0

Les indices indiquent quels groupes de trois sommets forment ensemble les faces du cube. Les trois sommets du triangle ne sont pas tous des faces du triangle.

Vous pouvez utiliser chaque sommet exactement une fois et répéter plusieurs fois ceux qui sont utilisés dans plus d'un triangle, mais cela signifierait des transformations de sommet supplémentaires. Avec les indices, vous ne transformez les sommets qu'une seule fois et les utilisez autant de fois que nécessaire.

ggambett
la source
Quand tu veux dire triangle ??
Sad CRUD Developer
Le matériel graphique moderne rend tout sous forme de triangles.
1
Si vous voulez vraiment comprendre ce qui se passe, procurez-vous du papier millimétré, dessinez les sommets 3D et tracez des lignes entre les sommets spécifiés par INDICES.
ggambett