sto avendo la seguente situazione:Cosa superficie da utilizzare per eglMakeCurrent per il contesto che rende solo in FBO
In un cross-platform libreria di rendering per iOS e Android (scritti in C (++)), ho due thread che hanno entrambi bisogno del proprio EGLContext: Il thread A è il thread principale; rende alla finestra. Il thread B è un thread generatore, che esegue vari calcoli e restituisce i risultati in trame che vengono successivamente utilizzate dalla filettatura A.
Poiché non è possibile utilizzare EGL su iOS, la libreria utilizza i puntatori di funzione Obj statici.- C funziona per creare un nuovo contesto e impostarlo corrente. Questo funziona già, Creo contesto del filo A utilizzando
EAGLContext *contextA = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
Il contesto del filo B viene creata usando
EAGLContext *contextB = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2 sharegroup:[contextA sharegroup]];
posso quindi impostare una delle due correnti:
[EAGLContext setCurrentContext:context];
Per utilizzare la stessa logica (i puntatori di funzione passati alla libreria) su Android, voglio farlo nel lato C dei bind JNI, questa volta utilizzando EGL reale anziché EAGL di Apple. Posso facilmente creare contextA usando WindowSurface e la finestra nativa, posso creare contextB e passare contextA al parametro shareContext della chiamata eglCreateContext.
Ma quando voglio rendere corrente contestoB, devo passare una superficie alla chiamata eglMakeCurrent, e sto cercando di capire che tipo di superficie passare lì.
- non posso usare il WindowSurface io uso per Contexta come spec dice nella sezione 3.7 che "al più un contesto per ogni API client supportato può essere corrente in un particolare filo in un dato momento, e al massimo un contesto può essere legato a una particolare superficie in un dato momento. "
- Non riesco a specificare EGL_NO_SURFACE, perché ciò comporterebbe un errore EGL_BAD_MATCH nella chiamata eglMakeCurrent.
- Sembra che potrei usare una superficie PBuffer, ma esita perché dovrei specificare la larghezza e l'altezza quando creo una tale superficie, e il thread B potrebbe voler creare trame di dimensioni diverse. In aggiunta a ciò, lo "OpenGL ES 2.0 Programming Guide" di Munshi, Ginsburg e Shreiner afferma nella sezione 3.8 che "I Pbuffer sono spesso usati per generare mappe di texture. Se tutto quello che vuoi è renderizzare su una texture, ti consigliamo di usare oggetti framebuffer [.. .] invece di pbuffers perché sono più efficienti", che è esattamente quello che voglio fare in filo B.
non capisco cosa Munshi, Ginsurg e Shreiner dire con quella frase, come sarebbe un framebuffer oggetto essere una sostituzione di una superficie pbuffer? Cosa succede se creo una superficie pbuffer molto piccola (ad esempio 1x1px) per rendere corrente il contesto - posso quindi eseguire il rendering in FBO arbitrariamente grandi? Ci sono altre possibilità di cui non sono ancora a conoscenza?
Grazie mille per il vostro aiuto!
Potrebbe spiegare come è possibile creare un SurfaceTexture fuori dallo schermo senza alcun punto di vista? So che è una domanda ampia, ma bastano pochi suggerimenti. –
In sostanza, si utilizza il nuovo operatore, in questo modo: mSurfaceTexture = new SurfaceTexture (1); mSurfaceTexture.setDefaultBufferSize (miMaxWidth, miMaxHeight); – ClayMontgomery
Può essere fatto da codice nativo? Ho provato a usare SurfaceTexture (inclusa l'intestazione da framework/native/include/gui/SurfaceTexture.h) ma ottengo ancora un errore di compilazione: la dichiarazione di SurfaceTexture non può essere trovata in questo ambito. –