2012-02-13 8 views
5

In iOS 5, sono state introdotte le cache Texture OpenGL per fornire una via diretta dai dati video della videocamera a OpenGL senza la necessità di copiare i buffer. C'è stata una breve introduzione alle cache delle texture in session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011.Utilizzo di cache texture OpenGL anziché glReadPixels per ottenere dati di texture

Ho trovato un interessante article che abusa ulteriormente questo concetto alla fine e aggira una chiamata a glReadPixels semplicemente bloccando la trama e quindi accedendo direttamente al buffer.

glReadPixels è molto lento a causa del renderer basato su tile che viene utilizzato in iPad 2 (anche quando si utilizzano solo texture 1x1). Tuttavia, il metodo descritto sembra elaborare più rapidamente di glReadPixels.

Il metodo proposto nell'articolo è valido e può essere utilizzato per aumentare le applicazioni che si basano su glReadPixels?

Poiché OpenGL elabora i dati grafici in parallelo alla CPU, come deve essere la chiamata CVPixelBufferLockBaseAddress quando il rendering viene eseguito senza parlare con OpenGL?

risposta

4

descrivo un mezzo per fare questo in this answer, in base al suddetto articolo-linked e ChromaKey campione di Apple dalla WWDC 2011. Dato che Apple ha utilizzato questo in uno dei loro campioni, e che io non ho sentito nulla contrastare questo dai loro ingegneri di OpenGL ES, credo che questo sia un uso valido delle cache di texture. Funziona su tutti i dispositivi compatibili iOS 5.x che ho provato e funziona altrettanto bene in iOS 5.0 e 5.1. È molto, molto più veloce di glReadPixels().

Per quanto riguarda il momento in cui bloccare l'indirizzo di base del buffer di pixel, dovresti essere in grado di utilizzare glFlush() o simile per bloccare finché tutti i dati non sono stati sottoposti al rendering sulla trama del tuo FBO. Questo sembra funzionare per la codifica di 30 filmati FPS 1080p che ho fatto con gli FBO con texture.