2012-03-25 17 views
11

Are glTexImage2D e glTexSubImage2D gli unici modi per passare un buffer di pixel a una trama?Aggiornamento di una trama in OpenGL con glTexImage2D

Al momento che uso in una funzione di impostazione glTexImage2D passando null come tampone, e poi sul loop rendering che chiamano glTexSubImage2D con i nuovi dati del buffer di ogni iterazione.

Ma sapendo che la trama non cambierà nessuna proprietà come le dimensioni, esiste un modo più efficiente per passare i dati effettivi dei pixel alla trama di rendering?

risposta

23

Nella moderna OpenGL ci sono 4 metodi diversi per modificare texture 2D:

1) glTexImage2D - la più lenta, ricreando strutture dati interne.

2) glTexSubImage2D - un po 'più veloce, ma non può modificare i parametri (dimensioni, formato pixel) dell'immagine.

3) Render-to-texture con FBO - aggiornamento texture interamente su GPU, molto veloce. Fare riferimento a questa risposta per ulteriori dettagli: https://stackoverflow.com/a/10702468/1065190

4) Oggetto buffer di pixel PBO - per upload veloci da CPU a GPU, non supportato (ancora) su OpenGL ES.

+0

Vedo che l'FBO sarebbe l'opzione migliore, ma, le mie trame devono utilizzare il parametro GL_LUMINANCE e ho appena scoperto che l'FBO non supporta tale. È quindi l'unica opzione per usare glTexSubImage2D? – PerracoLabs

+0

Usi desktop OpenGL o OpenGL ES? –

+0

utilizzando OpenGL ES su Android. La ragione per usare GL_LUMINANCE è che devo passare i dati YUV420sp in uno shader, lì per fare 2 chiamate a glTexSubImage2D per passare 2 piani, uno per Y e un altro per UV. e quindi devo usare GL_LUMINANCE. l'opzione di convertire YUV in RGB prima di passare i dati allo shader non è un'opzione per ragioni di velocità. – PerracoLabs

Problemi correlati