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?
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?
Réponses:
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:
Pour spécifier cette face sans index, vous devez spécifier les sommets
A, B, D, A, D, C
. Deux sommets (A
etD
) 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
,C
etD
) 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
L'utilisation d'indices sert trois objectifs principaux:
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.
la source
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.
la source