Sto implementando in Android e C++ nativo un disegno di scena per Android utilizzando egl 1.1
. Attualmente utilizza Android glSurfaceView
- che mi consente di disegnare su un buffer posteriore che viene visualizzato alla fine di "onDrawFrame" - quando vengono scambiati il buffer posteriore e il buffer anteriore.Preservazione del contenuto del buffer di ritorno dopo eglSwapBuffers
Il mio problema è questo - Devo essere in grado di visualizzare il buffer posteriore e continuare a scrivere come se non lo avessi scambiato. La ragione di questa richiesta è che la scena è molto grande, e la creazione di ogni frame non è possibile, né è in attesa della fine del disegno - poiché l'utente dovrà attendere troppo a lungo.
In altre parole: ho bisogno di costruire la scena in modo incrementale. A un certo punto durante il rendering, decido che è ora e chiamo eglSwapBuffers
che visualizza il contenuto disegnato dal buffer posteriore, ma quando continuo a scrivere ovviamente scrivo al "buffer precedente" che è fuori sync .. (non contenente le cose che ho disegnato finora).
Per quanto vedo la mia unica opzione è copiare il back buffer prima di scambiare. pseudo:
- Draw per eseguire il tampone
- Copia Torna Buffer a temperatura Buffer
- Swap
- Copia del buffer temporaneo al (nuovo) torna tampone
- Draw più cose da eseguire buffer
- E così via ...
La mia domanda - C'è un modo per fare passi 2,4?
- È
glCopyPixels
utile in questo caso? esempio? - È
glBlitFramebuffer
?
O mi sto avvicinando a questo tutto sbagliato?
cose ho già fatto:
- ho provato a installare
EGL_SWAP_BEHAVIOR
-EGL_BUFFER_PRESERVED
ma sembra solo a lavorare su alcuni dispositivi (come descritto nella khronos notes):
Alcune superfici consentono applicazioni per controllare se il contenuto del buffer di colore è conservato o meno
- Re-rendering della scena in ogni fotogramma - non possibile. Ho letto molte volte che questo è raccomandato.
Grazie per la risposta. Ti piacerebbe elaborare un po '? Quale metodo dovrei usare per i passi 1,2? Sono molto nuovo nell'usare gl (trasferire codice cross platform in Android .. - cercando di trovare un'alternativa al "presenteRenderbuffer" di ios) –
@DrorFichman: Forse [questa pagina wiki GL] (http://www.opengl.org/wiki/Framebuffer_Object) può aiutarti. Spiega le basi degli FBO (e questo vale anche per GLES, è solo un po 'più limitato lì). Quindi, quando il programma si avvia, si crea un FBO, si allega un renderbuffer o una trama come buffer dei colori. Forse hai anche bisogno di un buffer di profondità. Per il passaggio 1, leghi solo l'FBO e tutto il rendering verrà eseguito su di esso. Per il passaggio 2, si utilizza 'glBlitFramebuffer', oppure, se si è associata una texture e non un renderbuffer, si esegue il rendering di un quadrante a schermo intero con tale texture applicata. – derhass