2014-05-29 10 views
6

Implementuję w Androidzie i natywnym C++ rysunek sceny dla Androida za pomocą egl 1.1. Obecnie używasz Androida glSurfaceView - co pozwala mi narysować do bufora wstecznego, który jest wyświetlany na końcu "onDrawFrame" - kiedy bufor wsteczny i przedni bufor są zamieniane.Zachowywanie zawartości bufora po eglSwapBuffers

Mój problem jest następujący - Muszę być w stanie wyświetlić bufor zwrotny i kontynuować pisanie, tak jakbym nie został zamieniony. Powodem tego żądania jest to, że scena jest bardzo duża, a budowanie jej każdej klatki nie jest możliwe, ani nie czeka na koniec rysunku - ponieważ użytkownik będzie musiał czekać zbyt długo.

Innymi słowy - muszę zbudować scenę przyrostowo. W pewnym momencie renderowania decyduję, że nadszedł czas i zadzwonię pod numer eglSwapBuffers, który wyświetla narysowaną treść z tylnego bufora, ale kiedy kontynuuję pisanie, oczywiście piszę do "poprzedniego-frontowego bufora", który jest poza sync .. (nie zawiera rzeczy, które narysowałem do tej pory).

O ile widzę moją jedyną opcją jest skopiowanie bufora tylnego przed zamianą. pseudo:

  1. Draw do tyłu bufor
  2. Copy Back bufor temp Buffer
  3. zamienionym
  4. Copy bufor temp do (nowej) tylnym buforze
  5. Draw więcej rzeczy do kopii bufor
  6. I tak dalej ...

Moje pytanie - czy istnieje sposób na wykonanie kroków 2,4?

  • Czy w tym przypadku przydatne jest glCopyPixels? przykład?
  • Czy glBlitFramebuffer?

Czy zbliżam się do tego źle?

Czego już nie:

  • Próbowałem ustawienie EGL_SWAP_BEHAVIOR do EGL_BUFFER_PRESERVED ale to tylko wydaje się działać na niektórych urządzeniach (jak opisano w khronos notes):

Niektóre powierzchnie pozwalają aplikacje do kontrolowania, czy zawartość bufora kolorów zostanie zachowana, czy nie,

  • Ponowne renderowanie sceny w każdej klatce - niemożliwe. Czytałem wiele razy, że jest to zalecane.

Odpowiedz

2

Twoje ogólne podejście jest poprawne.Korzystanie z glBlitFramebuffer() może być bardziej pomocne, ponieważ glCopyPixels po prostu kopiuje jakiś podtemat bufora do pozycji ujścia w tym samym buforze.

Jednakże, można myśleć o potencjalnie lepszym podejściem, przynajmniej jeśli OES_framebuffer_object dostępne:

  1. holowniczej do tekstury i zdefiniowany przez użytkownika renderbuffer
  2. czyni tekstury do tylnego bufor/Blit renderbuffer do tylnego bufor
  3. wymiany
  4. zmiana tekstury/renderbuffer
  5. czyni strukturę do tylnego bufor/Blit renderbuffer do tyłu bufor
  6. wymiany
  7. [... i tak dalej ...]

ten sposób nie masz kopii/aktualizacji/copy/cykl SWAP z 2 egzemplarzach na ramkę, ale tylko zmiana/kopiowanie/zamień z jedną dodatkową kopią.

+0

Dziękuję za odpowiedź. Czy chciałbyś trochę rozwinąć? Jakiej metody użyć dla kroków 1,2? Jestem bardzo nowy w używaniu gl (przenoszenie kodu platformy na platformę android) - próba znalezienia alternatywy dla 'presentRenderbuffer' ios ') –

+0

@DrorFichman: Może [to GL strona wiki] (http://www.opengl.org/wiki/Framebuffer_Object) może ci pomóc. Wyjaśnia podstawy FBO (i dotyczy to również GLES, jest tam nieco bardziej ograniczony). Więc kiedy program się uruchamia, tworzysz plik FBO, załączasz bufor renderowania lub teksturę jako bufor kolorów. Może potrzebujesz również bufora głębi. W przypadku kroku 1 wystarczy powiązać usługę FBO i zostanie do niej wykonane renderowanie. W kroku 2 używasz 'glBlitFramebuffer' lub, jeśli podłączyłeś teksturę, a nie bufor renderowania, renderujesz tylko quad pełnoekranowy z zastosowaną teksturą. – derhass

Powiązane problemy