2013-02-26 10 views
6

Mam wieloplatformową bazę kodową (iOS i Android), która używa standardowej konfiguracji renderowania do tekstury. Każda ramka (po zainicjowaniu), następująca sekwencja zdarzeń:Renderowanie do tekstury i synchronizacja

  1. glBindFramebuffer z bufora ramki z przystawką struktura barw
  2. renderowania kilka rzeczy
  3. *
  4. glBindFramebuffer domyślnego bufora ramki (0 w Androidzie zazwyczaj 2 iOS)
  5. glBindTexture tekstury, które było przyłączenie kolor pierwszego bufora ramki
  6. przy użyciu tego związany tekstury

Na iOS i niektórych urządzeniach z systemem Android (w tym na emulatorze) działa to poprawnie i zgodnie z oczekiwaniami. Na innych urządzeniach (obecnie siedzących przed wersją Samsung Galaxy Note 4.0.4), renderowanie drugiej fazy, które wykorzystuje teksturę, wygląda "skocznie". Inne animacje nadal działają z szybkością 60 fps na tym samym ekranie, co "bity"; mój wniosek jest taki, że zmiany w strukturze docelowej nie zawsze są widoczne w drugim przebiegu renderowania.

Aby przetestować tę teorię, wstawię glFinish() w kroku oznaczonym * powyżej. Na wszystkich urządzeniach ma to teraz prawidłowe działanie. Co ciekawe, glFlush() NIE naprawia problemu. Ale glFinish() jest drogi i nie widziałem żadnej dokumentacji sugerującej, że powinno to być konieczne.

Oto moje pytanie: co należy zrobić po zakończeniu renderowania do tekstury, aby upewnić się, że ostatnio rysowana tekstura jest dostępna w późniejszych wersjach renderowania?

+1

Nie brzmi to jak rozsądne zachowanie OpenGL. Nie jestem ekspertem od ES, ale jestem pewien, że ES (przynajmniej według specyfikacji) nie zmienia tego podstawowego zachowania synchronizacji. Nie można polegać na niczym, jeśli to nie wytrzyma, na przykład polegając na zakończeniu zapisywania buforów przed renderowaniem. Nie ma innych jawnych mechanizmów synchronizacji dla tych operacji, więc kolejka poleceń musi być poprawnie synchronizowana sekwencyjnie. –

+0

I przyjmuję, że nikt inny tego nie zauważył? Oczywiście, może być oczywiście urządzenie/build, ale nie jest to zabawne. – addaon

Odpowiedz

3

Kod, który opisujesz, powinien być w porządku.

Dopóki używasz pojedynczego kontekstu i nie włączasz żadnych rozszerzeń, które rozluźniają zachowanie synchronizacji (takie jak EXT_map_buffer_range), każde polecenie musi być wyświetlane tak, jakby było wykonywane w dokładnie takiej samej kolejności, jak podano w API oraz w używaniu API renderujesz teksturę przed odczytaniem z niego.

Biorąc pod uwagę, że prawdopodobnie napotykasz błędy sterownika na tych urządzeniach. Czy możesz wymienić, które urządzenia napotykają problem? Prawdopodobnie znajdziesz typowy sprzęt lub sterowniki.

Powiązane problemy