Qual è lo scopo degli indici nel rendering 3D?


11

Supponiamo di creare un cubo 3D in OpenGL. Si implementano i dati di vertice necessari per l'oggetto (cubo). Quale sarebbe il punto di usare gli indici?

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);

Nell'esempio sopra, viene creato un cubo con i vertici necessari nello spazio mondiale. Qual è la rilevanza per gli indici?


1
In molti posti vedrai persone che li chiamano volti. Ed è quello che sono. Ogni faccia è generalmente composta da 3 vertici, per formare un triangolo. Pertanto, ogni 3 indici corrispondono a un triangolo nella mesh finale. Sono chiamati indici perché sono principalmente offset di dove si trovano le informazioni sui vertici nell'array di vertici. È tutto ciò che devi sapere sugli indici, immagino :)
Grimshaw,

Risposte:


24

Esistono degli indici per ridurre il footprint di memoria richiesto per rappresentare un modello 3D, in modo molto simile alle tavolozze di colori che possono essere utilizzate per ridurre il footprint di memoria di un'immagine 2D.

L'indicizzazione ti consente di evitare di ripetere una definizione completa di un vertice se devi duplicare i dati di quel vertice, come di solito devi fare per un modello complesso.

Le moderne API 3D vengono visualizzate utilizzando triangoli; ogni faccia di un cubo richiede due triangoli:

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

Per specificare quella faccia senza indici, è necessario specificare i vertici A, B, D, A, D, C. Due vertici ( Ae D) si ripetono nel buffer dei vertici.

Tuttavia, con indici, si può avere un vertex buffer contenente solo i vertici richiesti ( A, B, Ce D) e sei indici: 0, 1, 3, 0, 3, 2. Poiché gli indici sono generalmente molto più piccoli dei vertici e molti vertici si ripetono generalmente in modelli pratici, questo può essere un notevole risparmio di spazio.

Nota che alcuni vertici condivideranno solo attributi parziali. Ad esempio, quando si esegue il rendering di un cubo con la mappatura delle trame, si vogliono generalmente coordinate di trama uniche per faccia, quindi si avranno più vertici con la stessa posizione e coordinate di trama diverse. Tale quantità di duplicazione è accettabile e necessaria; è quando duplichi un intero set di attributi di vertici che inizieresti a vedere i vantaggi dell'indicizzazione.

Se in effetti tutti i vertici della mesh sono distinti al 100%, non vi è alcun vantaggio per gli indici (in effetti si utilizzerà più spazio nel consumo del buffer di indice ridondante). Questo non succede sempre, comunque.


1
Dovrebbe essere invece 0,1,3, 0,1,2?
Sad CRUD Developer

0, 1, 3, 0, 3, 2 in realtà, grazie (basato A = 0, B = 1, C = 2, D = 3). Ho aggiornato la risposta.

forse vale la pena ricordare che su una maglia triangolare il numero medio di triangoli adiacenti a un vertice è 6.
Arne,

7

L'uso degli indici ha tre scopi principali:

  • Riduzione dei requisiti di memoria consentendo la rimozione di vertici duplicati dalla mesh originale.
  • Riduzione dei calcoli dello shader di vertice consentendo la trasformazione di vertici duplicati una sola volta.
  • Concatenare le primitive in modo da poter ridurre le chiamate di sorteggio.

Di questi il ​​primo è ovvio perché puoi misurarlo direttamente nel tuo codice: se una mesh aveva, diciamo, 50k vertici ma se 30k di loro erano duplicati, allora hai un risparmio di memoria.

Il secondo e il terzo non sono così evidenti: è necessario aver già preso la decisione di utilizzare gli indici, e è necessario profilare il codice e isolare le prestazioni "prima" e "dopo" per ottenere una misurazione.

Per il secondo, l'hardware è in grado di memorizzare nella cache il risultato di vertici trasformati di recente. Se si presenta lo stesso vertice di quello che è stato recentemente trasformato, è possibile utilizzare la versione memorizzata nella cache anziché dover eseguire nuovamente i calcoli. L'hardware utilizza l'indice per identificarli, quindi gli indici sono assolutamente necessari per ottenere questo comportamento.

Per il terzo, ogni chiamata di disegno effettuata ha un sovraccarico della CPU indipendentemente dalla quantità di GPU necessaria. Se tutto il resto è uguale, disegnare una mesh da 50k in 1 call draw sarà molto più veloce di disegnarla in 10k call call. Ma se la tua mesh è composta da più strisce o (peggio ancora) una combinazione di strisce e ventole, non puoi farlo in una singola chiamata di disegno senza (1) usare gli indici o (2) introdurre triangoli degeneri. Ma poiché gli indici sono molto più piccoli dei vertici, l'utilizzo degli indici è preferito nel caso generale.


0

Gli indici indicano quali gruppi di tre vertici formano insieme le facce del cubo. Non tutte le serie di tre vertici del triangolo sono facce del triangolo.

È possibile utilizzare ogni vertice esattamente una volta e ripetere più volte quelli utilizzati in più di un triangolo, ma ciò significherebbe trasformazioni extra di vertici. Con gli indici trasformi i vertici una sola volta e li usi tutte le volte che ti servono.


Quando intendi triangolo ??
Sviluppatore CRUD triste il

L'hardware grafico moderno rende tutto come triangoli.

1
Se vuoi davvero capire cosa sta succedendo, procurati della carta millimetrata, disegna i vertici 3D e disegna le linee tra i vertici specificati da INDICE.
ggambett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.