2013-02-26 14 views
12

Attualmente sono nuovo nel regno di OpenGL ES 2.0 e vorrei capire il più possibile riguardo a binding, buffer, shader, ecc.OpenGL - perché GL_ELEMENT_ARRAY_BUFFER per gli indici?

A partire da ora, sto solo cercando di capire le differenze tra GL_ELEMENT_ARRAY_BUFFER e GL_ARRAY_BUFFER e quando utilizzare ciascuno dei preset selezionati.

La mia attuale comprensione mi porta a credere che lo GL_ELEMENT_ARRAY_BUFFER sia specifico per gli indici per detti triangoli mentre l'altro è per tutto il resto.

Qualcuno potrebbe spiegare perché e se questo è corretto? Come viene gestito lo GL_ELEMENT_ARRAY_BUFFER in modo diverso?

risposta

19

GL_ELEMENT_ARRAY_BUFFER viene utilizzato per indicare che il buffer che si sta presentando contiene gli indici di ciascun elemento nel buffer "altro" (GL_ARRAY_BUFFER).

Così, come un esempio molto semplice con i vertici (no altri dati), se si dispone di un buffer di indice:

{0, 1, 2} {0, 2, 3}

e il buffer di dati contiene:

{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}}

Quindi, quando chiami glDrawElements, è in grado di individuare i vertici 0, 1 & 2 per il primo triangolo, quindi 0, 2, 3 per il secondo (ovvero: fondamentalmente un quadrato).

Questo diventa più utile quando si hanno modelli più complicati con molti vertici & volti - poiché molti dei volti condividono gli stessi vertici (quindi non è necessario "inviare nuovamente" gli stessi dati).

Nota: L'esempio precedente mostra solo i vertici: è possibile inserire tutti i dati desiderati (colori vertici, normali, coordinate texture, ecc.).

+0

Questa è la comprensione che ho imparato a conoscere. L'unica vera domanda che ho è perché la parola ELEMENT nel tag del buffer? Questo è quello che mi butta via ogni volta perché ... è solo un ARRAY. Non lo definirei un array elementale. – TheCodingArt

+1

Personalmente il termine "elemento" in questo nome per me significa che è una matrice di riferimenti "elemento" - poiché il buffer di dati può contenere dati arbitrari - ma ogni raggruppamento di dati (vertice + normale + colore + coord tex) può essere fondamentalmente definito un "elemento". – goatherder

+0

Bene, l'array di elementi contiene solo l'ordine dell'array che contiene gli elementi ... questa è l'unica ragione logica a cui riesco a pensare, il che non ha senso per me. Perché GL_ARRAY_BUFFER non ha chiamato il buffer degli elementi se contiene gli elementi? Ecco dove sono un po 'perso lol. – TheCodingArt

10

Questo ha principalmente ragioni storiche. Quando non c'erano VBO, i puntatori specificati con glVertexPointer e simili non erano "associati" ad un oggetto OpenGL di alcun tipo. Quando i VBO sono stati introdotti, questo comportamento è stato trasferito nella semantica dei VBO, che richiedeva un diverso target di buffer per indici e attributi.

Con l'introduzione di attributi di vertici generici è stata aggiunta una funzionalità di associazione.

Oggi è soprattutto un suggerimento per l'implementazione di OpenGL sapere, in che modo verranno indirizzati i dati, per ottimizzare il flusso di dati di conseguenza. Ma funziona anche come un promemoria mentale per il programmatore, ciò che viene attualmente trattato.