2010-05-31 5 views
5

Sto facendo un gioco 2D con OpenGL. Vorrei velocizzare il mio disegno di texture usando i VBO.Disegno trama OpenGL veloce con oggetti buffer vertice. È questo il modo di farlo?

Attualmente sto usando la modalità immediata. Sto generando le mie coordinate quando ruoto e scala una texture. Ho anche la funzionalità di arrotondare gli angoli di una trama, usando la primitiva poligono per disegnare quelli.

Stavo pensando, sarebbe più veloce realizzare un VBO con vertici per i lati della trama senza offset incluso, quindi posso quindi usare glTranslate, glScale e glRotate per spostare la posizione del disegno per la mia trama. Quindi posso usare lo stesso VBO senza modifiche per disegnare la texture ogni volta. Potrei solo cambiare il VBO quando ho bisogno di aggiungere le coordinate per gli angoli arrotondati.

è che il modo migliore per farlo? Quali cose dovrei cercare mentre lo faccio? È davvero più veloce usare GL_TRIANGLES invece di GL_QUADS nelle moderne schede grafiche?

Grazie per una risposta.

risposta

4

Per ottenere migliori prestazioni, non si dovrebbe usare il rendering modo immediato, ma invece utilizzare vertex buffer (su CPU o GPU) e disegnare utilizzando glDrawArrays ecc come metodi. Ridimensionare/ruotare le coordinate della trama modificando il moltiplicatore della matrice di texture non è un problema di prestazioni, basta impostare alcuni valori piccoli per l'intera mesh. Il collo di bottiglia più importante qui è quello di trasferire dati per vertice (come colore, posizione e coordinate della trama) alla GPU, ed è proprio questo che gli oggetti buffer vertici sulla GPU possono essere di grande aiuto.

Se la mesh che si desidera disegnare sullo schermo è statica, ovvero la si imposta una volta e non è necessario modificarla (parti di) in un secondo momento, è possibile generare le coordinate della trama per l'intera mesh, inclusi tutti angoli) solo una volta. In seguito puoi modificare le coordinate della trama per l'intera mesh usando il moltiplicatore della matrice di texture. Tuttavia, se si desidera modificare diverse parti della mesh utilizzando diverse trasformazioni, sarà necessario dividere la mesh in parti. Da quello che hai descritto, capisco che vuoi disegnare un rettangolo con angoli arrotondati che contiene un'immagine all'interno, che può essere realizzato usando una singola mesh statica (una lista di dati per vertice).

Infine, GL_QUADS sono anche abbandonata in moderni specifiche OpenGL. Non offrono comunque molte funzionalità, quindi dovresti convertire QUADS in triangoli o strisce triangolari/ventole.

+0

Grazie. Sono riuscito a far funzionare VBOS per qualche codice di linea ma non per il disegno della trama. Non ho la minima idea di come farlo. Tutto ciò che ho provato è fallito. Credo di aver bisogno di un'altra domanda. –

+0

Vedi i tuoi oggetti dove vuoi che siano? È solo la texturing corretta dei tuoi modelli? Se vedi i tuoi oggetti nella posizione corretta, tieni a mente che i valori delle coordinate di trama sono come i valori di posizione dei vertici. Inizia con qualcosa di semplice (non modificare le coordinate della trama usando glTranslate etc in modalità texture matrix), quindi cerca di estenderlo per ottenere ciò che vuoi vedere. – AdilYalcin

+0

Al momento il rendering è nel posto giusto, non viene eseguito correttamente. Non riesce per entrambi GL_QUADS e GL_TRIANGLES. Farò una nuova domanda con il mio codice VBO. L'aggiunta di informazioni sul colore al VBO è importante? "GlColor" sarà un grosso problema? Grazie per la risposta e l'aiuto. –

1

Se si desidera disegnare un poligono strutturato utilizzando VBO, è necessario creare buffer non solo per i vertici, ma anche per le coordinate della trama (una coordinata UV per vertice) e per i colori dei vertici se si desidera fare vertice illuminazione (usare invece glColor se non). Utilizzare glClientActiveTexture (GL_TEXTUREn) prima di legare la trama desiderata. Non dimenticare di utilizzare glEnableClientState() per ciascun tipo di buffer che stai utilizzando prima di emettere la chiamata di rendering.