Ich implementiere in Android und nativem C++ eine Szenenzeichnung für Android mit egl 1.1
. Derzeit mit Android glSurfaceView
- die mir erlaubt, zu einem Back-Buffer, der am Ende von "onDrawFrame" angezeigt wird - wenn der Back-Buffer und der Front-Buffer vertauscht sind.Pufferinhalt nach eglSwapBuffers speichern
Mein Problem ist das - Ich muss in der Lage sein, den Backbuffer anzuzeigen und weiterschreiben, als ob ich nicht getauscht habe. Der Grund für diese Nachfrage ist, dass die Szene sehr groß ist, und es ist nicht möglich jeden Frame zu bauen, auch nicht auf das Ende der Zeichnung zu warten - da der Benutzer zu lange warten muss.
Mit anderen Worten - ich muss die Szene inkrementell bauen. Zu einem bestimmten Zeitpunkt während des Renderings, ich entscheide, es ist Zeit und ich rufe , die den gezeichneten Inhalt aus dem Backbuffer anzeigt, aber wenn ich weiter schreibe, schreibe ich offensichtlich in den 'ehemaligen-Front-Puffer', der out ist Sync .. (ohne die Dinge, die ich bisher gezeichnet habe).
Soweit ich sehe, ist meine einzige Option, den Backbuffer vor dem Swappen zu kopieren. pseudo:
- Draw
- Kopieren Back Buffer auf Temp Buffer
- Swap
- Copy Temp Puffer (der neue) zurück Puffer
- mehr Dinge Draw-Back-Puffer sichern Puffer
- Und so weiter ...
Meine Frage - Gibt es eine Möglichkeit, Schritte 2,4 zu tun?
- Ist
glCopyPixels
nützlich in diesem Fall? Beispiel? - Ist
glBlitFramebuffer
?
Oder nähere ich mich dem alles falsch?
Dinge, die ich tat schon:
- ich
EGL_SWAP_BEHAVIOR
-EGL_BUFFER_PRESERVED
versucht Einstellung, aber es scheint nur auf bestimmten Geräten zu arbeiten (wie im khronos notes beschrieben):
Einige Oberflächen erlauben Anwendungen zur Kontrolle, ob der Farbpufferinhalt erhalten bleibt
- Die Szene in jedem Bild neu rendern - nicht möglich. Ich habe oft gelesen, dass dies empfohlen wird.
Vielen Dank für die Antwort. Würdest du etwas näher darauf eingehen? Welche Methode sollte ich für die Schritte 1,2 verwenden? Ich bin sehr neu in der Verwendung von gl (Portierung plattformübergreifender Code zu Android .. - versuchen, eine Alternative zu IOS 'presentRenderbuffer' zu finden) –
@DrorFichman: Vielleicht [diese GL Wiki-Seite] (http://www.opengl.org/wiki/Framebuffer_Object) kann dir helfen. Es erklärt die Grundlagen von FBOs (und das gilt auch für GLES, es ist nur ein bisschen begrenzter dort). Wenn Sie also Ihr Programm starten, erstellen Sie einen FBO, hängen Sie einen Render-Puffer oder eine Textur als Farbpuffer an. Vielleicht brauchst du auch einen Tiefenpuffer. Für Schritt 1 binden Sie einfach den FBO, und das Rendering wird ausgeführt. Für Schritt 2 verwenden Sie entweder 'glBlitFramebuffer', oder wenn Sie eine Textur und keinen Render-Puffer anfügen, rendern Sie nur einen Vollbildschirm-Vierer mit dieser angewendeten Textur. – derhass