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:
- Draw do tyłu bufor
- Copy Back bufor temp Buffer
- zamienionym
- Copy bufor temp do (nowej) tylnym buforze
- Draw więcej rzeczy do kopii bufor
- 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
doEGL_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.
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 ') –
@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