2014-05-29 11 views
6

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:

  1. Draw per eseguire il tampone
  2. Copia Torna Buffer a temperatura Buffer
  3. Swap
  4. Copia del buffer temporaneo al (nuovo) torna tampone
  5. Draw più cose da eseguire buffer
  6. 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.

risposta

2

L'approccio generale è corretto.È probabile che l'utilizzo di glBlitFramebuffer() sia più utile, poiché glCopyPixels copia semplicemente un sub-rettangolo del buffer in posizione anale nello stesso buffer.

Tuttavia, posso pensare a un approccio potenzialmente migliore, almeno se OES_framebuffer_object è disponibile:

  1. pareggio per texture o una texture definita dall'utente renderbuffer
  2. rendere a buffer retro/blit renderbuffer su BACK tampone
  3. scambio
  4. aggiornamento trama/renderbuffer
  5. renda struttura a BACK tampone/blit renderbuffer al buffer retro
  6. di swap
  7. [... e così via ...]

In questo modo non si dispone di un/aggiornamento/copia/ciclo di swap copia con 2 copie per fotogramma, ma solo aggiornamento/copia/scambia con una singola copia in più.

+0

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) –

+0

@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

Problemi correlati