2012-10-10 16 views
7

La guida alla programmazione OpenGL ES discute che è necessario evitare i dati del vertice disallineati e fornisce un esempio di allineamento dei dati a blocchi di 4 byte.Quanto è importante l'allineamento nei dati del vertice opengl in iOS

OpenGL ES Programming Guide

Misaligned vs Aligned vertex data

Tuttavia nella maggior parte materiale demo e tutorial che ho trovato on-line non vedo qualcuno fare questo. Esempio di seguito è da un progetto demo su 71 Squared:

static const SSTexturedVertexData3D EnemyFighterVertexData[] = { 
    {/*v:*/{1.987003, -0.692074, -1.720503}, /*n:*/{0.946379, -0.165685, -0.277261}, /*t:*/{0.972816, 0.024320}}, 

E come lo faresti comunque? Aggiungi un manichino 0.0 a v and ne 2 a loro?

La mia ipotesi è che se si caricano i dati del vertice solo una volta per app, non importa molto ma se l'associazione e la riconnessione a array diversi su ciascun frame renderizzato sarebbe importante. Il mio piano è quello di combinare tutti i miei array in uno comunque, ma sono curioso.

+2

Sei sicuro che quanto sopra non sia già allineato a un limite di 4 byte? Se il codice che mostri usa GLfloats, questi sono tipi di dati a 32 bit (4 byte), quindi non importa quanti di loro ci siano, sono sempre allineati a un limite di 4 byte. La guida si riferisce a cortometraggi e altri tipi di dati. –

+0

Mi stavo chiedendo. Grazie! Dovresti metterlo come risposta, così posso segnarlo. – badweasel

+1

Potrei, ma non risponde alla domanda più fondamentale di quanto sia importante l'allineamento dei byte dei dati dei vertici per le prestazioni. Ciò potrebbe richiedere alcuni benchmark per illustrare pienamente. –

risposta

2

Generale un vertice è costituito da floats che verrà allineato, quindi non è necessario preoccuparsi troppo di questo. In effetti molti libri usano ordinariamente lo struct s per contenere i dati dei vertici, che non sono garantiti come contigui a causa del problema del padding, ma se tutto ciò che hai sono float, va bene dato che non è probabile che tu abbia il padding. Certo, alcune persone (me compreso) preferiscono usare l'STL vector da C++ ma se si è su iOS, mentre si può usare C++ si sta probabilmente utilizzando Objective-C quindi la contiguità in un modo non strutturante comporterebbe normali C array che non sono così divertente con cui lavorare.

Se si creano strutture personalizzate per conservare i dati dei vertici e altri dati per l'oggetto drawable e si utilizzano short s o altri tipi, è possibile che il padding diventi un problema. Ma se ti attacchi solo con float s, starai bene e sarai in buona compagnia dato che la maggior parte delle fonti didattiche su OpenGL lo fa.

+0

Sono iOS ma evito l'uso di strutture oggettive per qualsiasi cosa. Di solito uso "static const GLfloat Vertex []" e poi lo carico in un VBO. Stranamente, per gli sprite 2d uso effettivamente un documento Excel personalizzato per creare tutti i miei dati di vertice. Per 3d importare il file obj e salvarlo come file binario per il caricamento rapido in gioco. Sono disposto a darti il ​​segno di spunta solo per lo sforzo. Il punto di Brad Larson però nel commento alla mia domanda è che non è possibile rispondere senza test. Potrebbe essere un punto valido. – badweasel

+0

Un'altra nota .. Odio questo su StackOverflow, in cui si desidera rispondere a una domanda e si ricerca .. quindi creare la risposta solo per rendersi conto che la domanda è di un anno o due vecchi. Quindi, ovviamente, la risposta che ho usato è stata quella di Brad, che avevo già un limite di 4 byte ... un anno fa. :) – badweasel

+0

@badweasel Per curiosità, quale tecnica stai utilizzando in iOS per importare obj e quindi serializzare in binario? Stai sfruttando GLKit o un'altra libreria per la conversione o stai convertendo i dati di testo OBJ da solo? E poi con che metodo stai creando il binario? –

Problemi correlati