Suresh, la potenza della limitazione di 2 è stata incorporata in OpenGL negli (molto) primi giorni della grafica computerizzata (prima dell'accelerazione hardware accessibile), ed è stata eseguita per motivi di prestazioni. Il codice di rendering di basso livello ottiene un notevole incremento delle prestazioni quando può essere hardcoded per le texture power-of-two. Anche nelle moderne GPU, le trame POT sono più veloci delle trame NPOT, ma la differenza di velocità è molto più piccola di un tempo (sebbene possa essere ancora visibile su molti dispositivi ES).
GuyNoir, quello che dovresti fare è costruire un atlante di texture. Ho appena risolto questo problema io stesso lo scorso fine settimana per il mio gioco Android. Ho creato una classe chiamata TextureAtlas e il suo costruttore chiama glTexImage2D() per creare una trama grande di qualsiasi dimensione che scelgo (passando null per i valori dei pixel). Quindi posso chiamare add (id, bitmap), che chiama glTexSubImage2D(), ripetutamente per impacchettare le immagini più piccole. La classe TextureAtlas tiene traccia dello spazio utilizzato e libero all'interno della trama più grande e i rettangoli in cui è memorizzata ogni bitmap. Quindi il codice di rendering può chiamare get (id) per ottenere il rettangolo per un'immagine all'interno dell'atlante (che può quindi convertire in texture coordinate).
Nota a margine n. 1: Scegliere il modo migliore per imballare in varie dimensioni di trama NON è un compito banale. Ho scelto di iniziare con la logica semplice nella classe TextureAtlas (pensa macchina da scrivere + ritorno a capo + avanzamento riga) e assicurati di caricare le immagini nel miglior modo possibile per sfruttare questa logica. Nel mio caso, era quello di iniziare con le più piccole immagini quadrate e lavorare fino alle immagini quadrate medie. Quindi carico qualsiasi immagine corta + larga, forza un CR + LF e poi carica qualsiasi immagine alta + magra. Per ultimo, carico le immagini quadrate più grandi.
Nota a margine n. 2: Se sono necessari più atlanti di trama, provare a raggruppare le immagini all'interno di ciascuna che verrà renderizzata insieme per ridurre al minimo il numero di volte che è necessario cambiare le trame (che può uccidere le prestazioni). Ad esempio, nel mio gioco Android ho inserito tutti gli elementi statici della scheda di gioco in un unico atlante e tutti i fotogrammi di vari effetti di animazione in un secondo atlante. In questo modo posso associare l'atlante n. 1 e disegnare tutto sul tabellone, quindi posso associare l'atlante n. 2 e disegnare tutti gli effetti speciali su di esso. Due texture selezionate per frame sono molto efficienti.
Nota a margine n. 3: Se è necessario ripetere/eseguire il mirroring delle trame, è necessario inserire le proprie trame e ridimensionarle (non aggiungere pixel neri per riempire i bordi).
fonte
2010-12-01 22:17:40
potenza di due! = Quadrato. 32x64 è potenza di due, non quadrata, 13x13 è quadrata, non potenza di due. – Bahbar
Buon punto. Tuttavia, in entrambi i casi deve essere non potere di due. – GuyNoir