2012-01-29 8 views
9

Dobbiamo sviluppare una scena di scorrimento/zoom in OpenGL ES su Android, molto simile a un livello in Angry Birds ma più simile a un livello in World Of Goo. Più simile a quest'ultimo dato che il mondo non consisterà di strati ripetuti come mostrato in Angry Birds ma di una grande immagine. Poiché la scena ha bisogno di scorrere/ingrandire e quindi molto non sarà visibile, mi chiedevo il modo più efficiente per implementare il rendering, concentrandomi solo sull'ambiente (cioè non sugli oggetti all'interno del mondo ma sui livelli di sfondo).Scorrimento/zoom di una scena in OpenGL e suddivisione

Useremo una proiezione ortogonale.

Il primo che viene in mente è la creazione di un rettangolo di 4 vertici di grandi dimensioni a dimensione mondiale, che ha la trama di sfondo mappata ad esso, e lo converte/ridimensiona usando glTranslatef/glScalef. Tuttavia, mi stavo chiedendo se l'area non visibile al di fuori dei limiti dello schermo sia ancora resa da OpenGL in quanto non viene abbattuta (si perderebbe l'area visibile e ci sono solo 4 vertici). Pertanto, sarebbe più efficiente suddividere questo rettangolo, in modo che i rettangoli più piccoli non visibili possano essere abbattuti?

Un'altra opzione sarebbe la creazione di un rettangolo a 4 vertici che riempirebbe lo schermo, quindi spostare lo sfondo regolando le sue coordinate di trama. Tuttavia, suppongo che si verifichino problemi nella costruzione di mondi più grandi, considerando il limite delle dimensioni della trama. Sembra una buona implementazione per sfondi ripetuti come ha AngryBirds.

Forse c'è un altro modo ..?

Se qualcuno ha un'idea di come potrebbe essere fatto in AngryBirds/World of Goo, si prega di condividere come mi piacerebbe sentire. Sembra che abbiano implementato un sistema che consente al mondo di essere spostato e ingrandito molto (WorldOfGoo = MOLTO) senza intoppi.

+0

In realtà penso che lo scopo del culling sia di inviare meno vertici alla pipeline grafica. Se si suddivide troppo il rettangolo, si invieranno altri vertici. In generale, la GPU dovrebbe sapere bene di ritagliare i prmitive: fa parte dell'elaborazione. – Jake

risposta

2

Questa è probabilmente la soluzione migliore per implementation.

Nella mia esperienza, mantenendo una grande consistenza in memoria è molto costoso su Android. Avrei ottenuto un bel po 'di eccezioni OutOfMemoryError per la texture dello sfondo prima di passare alla piastrellatura.

Penso che il maggiore collo di bottiglia di rendering sarebbe con velocità di trasferimento della memoria e velocità di riempimento invece di qualsiasi calcolo grafico.

Edit: Partenza 53:28 di questo presentation da Google I/O 2009.

+1

Ne sei sicuro? Per esempio. il secondo paragrafo della 10.040 delle FAQ OpenGL (http://www.opengl.org/resources/faq/technical/clipping.htm) si apre con "Quando un primitivo giace parzialmente fuori dalla finestra, spesso attraversa il limite del volume della vista. OpenGL deve ritagliare qualsiasi primitiva che attraversa il limite del volume della vista. " – Tommy

+0

Non sicuro, ora lo fai apparire. Non ho mai fatto affidamento su OpenGL per fare clipping. Farò una modifica. – Jasoneer

+0

Ma questo significherebbe un sacco di rilegature. Quelle sono una delle operazioni più costose in OpenGL giusto? –

0

Si potrebbe dividere il rettangolo di sfondo in rettangoli più piccoli, in modo che OpenGL rende solo i rettangoli visibili. Non avrai un rettangolo con un asino grande caricato ma trame rettangoli più piccoli con trame più piccole che potresti caricare/scaricare, a seconda di cosa è visibile sullo schermo ...

0

Afaik non ci sarebbe stato alcun calo delle prestazioni dovuto a grandi aree che vengono rese fuori schermo, suddivisione e abbattimento viene normalmente fatto solo per ridurre il conteggio dei vertici, ma in questo caso si aggiungerebbe ad esso.

Che mettendo da parte per il momento; dal modo in cui hai formulato la domanda non sono sicuro se hai una grande trama di sfondo o una piccola ripetizione. Se è grande, dovrai comunque suddividerlo a causa delle limitazioni della dimensione della trama, quindi la domanda è discutibile! Se è piccolo, suggerirei il secondo metodo, montare un quad sullo schermo e spostare lo sfondo modificando le coordinate della trama.

Mi sento come se mi fosse sfuggito qualcosa, però, perché non sono sicuro del motivo per cui hai menzionato il problema della limitazione delle dimensioni della trama quando si parla del metodo di coordinate della trama e non del grande quad. Sicuramente per entrambi questo non è un problema per ripetere le texture come si può utilizzare la modalità involucro tessitura GL_REPEAT ...

Ma per entrambi si è un problema per un unico grande consistenza a meno che non suddividere, il che renderebbe la coordinata della texture modo tattico più complicato del necessario. In questo caso, la suddivisione della mesh lungo le suddivisioni della trama sarebbe la migliore e l'eliminazione delle sezioni fuori schermo. Decidere quali parti da eliminare dovrebbero essere banali con questa tecnica.

Cheers.

Problemi correlati