Se hai solo bisogno di normali per faccia e se i tuoi texcoords per una faccia sono rigorosamente 0/0, 0/1, 1/0, 1/1 (o simili per adattarsi al tuo layout), puoi costruire un cubo con 8 verts e 30 (striscia con riavvio) o 36 (elenco) indici. Recupera le normali e i texcoords usando una ricerca di array costante basata su SV_VertexID nel tuo vertex shader.
Ciò significa che non è nemmeno necessario includere texcoords o normali nel buffer dei vertici, il che consentirà di risparmiare ancora di più la memoria.
Andando oltre, potresti ancora andare fino a 24 verts per cubo ma usare anche l'istanziamento. Ogni cubo avrebbe una dimensione fissa nel buffer dei vertici (1x1x1) e avresti un fattore di scala e una posizione (supponendo che i cubi non ruotino, una matrice se lo fanno) come dati per istanza. Nel caso non rotante hai un costo una tantum di 24 verts, ma ogni cubo ha solo bisogno di 6 float per specificare completamente. Nel caso rotante stai guardando 16 float, ma anche questo è un notevole risparmio (in questo caso è più probabile che il collo di bottiglia sul lato CPU sulle trasformazioni della matrice - per il caso non rotante che costruisce una matrice al volo in il tuo shader di vertice - anche se è fatto per vertice, è così stupidamente veloce che non devi nemmeno preoccupartene).
Per trame faccia a faccia, basta usare un array di trame. È necessario assicurarsi che ciascuna di tali trame nell'array abbia le stesse dimensioni, ovviamente, e sarà comunque necessario interrompere il batch corrente se l'array stesso deve cambiare, ma per il resto farà bene il lavoro. Aggiungi un terzo texcoord alla definizione del vertice che definisce la porzione di array da utilizzare per ciascuna faccia.
Non hai bisogno di un GS con questo, e dovrebbe funzionare più velocemente dell'uso di uno poiché avere lo stadio shader della geometria abilitato imporrà un sovraccarico aggiuntivo di per sé.
Ho un codice di riferimento nel mio motore che disegna solo un sacco di cubi usando questo metodo e posso facilmente mordere oltre 300.000 cubi pur cancellando 60 fps, su una GPU relativamente di fascia bassa e senza fare nient'altro per ottimizzare il processo . Devo ammettere che non li sto illuminando né testurando, ma ho abilitato il blending alfa, l'abbattimento del backface disabilitato e, nel complesso, si equilibra con la mia parte "non fare altro per ottimizzare", quindi dovrebbe darti un'idea ragionevole del tipo di palla da baseball che puoi colpire con questo metodo.