EGLsurfaces i OpenGL ES

Android używa interfejsu API OpenGL ES (GLES) do renderowania grafiki. Do tworzenia kontekstów GLES i dostarczania systemu okienkowego do renderowania GLES, Android używa biblioteki EGL . Wywołania GLES renderują wielokąty z teksturą, podczas gdy wywołania EGL umieszczają rendery na ekranach.

Zanim zaczniesz rysować za pomocą GLES, musisz stworzyć kontekst GL. W EGL oznacza to utworzenie EGLContext i EGLsurface. Operacje GLES dotyczą bieżącego kontekstu, do którego dostęp uzyskuje się za pośrednictwem pamięci lokalnej wątku, a nie przekazywanej jako argument. Kod renderujący powinien być wykonywany w bieżącym wątku GLES, a nie w wątku interfejsu użytkownika.

EGLPowierzchnie

EGLSurface może być buforem pozaekranowym przydzielonym przez EGL, zwanym pbuffer lub oknem przydzielonym przez system operacyjny. Wywołanie funkcji eglCreateWindowSurface() tworzy powierzchnie okien EGL. eglCreateWindowSurface() przyjmuje jako argument obiekt okna , który w systemie Android jest powierzchnią. Powierzchnia jest stroną producenta BufferQueue. Konsumenci , którymi są SurfaceView, SurfaceTexture, TextureView lub ImageReader, tworzą powierzchnie. Kiedy wywołujesz eglCreateWindowSurface() , EGL tworzy nowy obiekt EGLSurface i łączy go z interfejsem producenta BufferQueue obiektu window. Od tego momentu renderowanie do tego elementu EGLSurface powoduje, że bufor jest usuwany z kolejki, renderowany i umieszczany w kolejce do użytku przez konsumenta.

EGL nie zapewnia połączeń blokowania/odblokowywania. Wydaj polecenia rysowania, a następnie wywołaj eglSwapBuffers() , aby przesłać bieżącą ramkę. Nazwa metody pochodzi od tradycyjnej wymiany buforów przednich i tylnych, ale rzeczywista implementacja może być inna.

Tylko jeden EGLSurface może być jednocześnie powiązany z powierzchnią (możesz mieć tylko jednego producenta połączonego z BufferQueue), ale jeśli zniszczysz EGLSurface, odłączy się on od BufferQueue i pozwoli połączyć się innemu.

Dany wątek może przełączać się między wieloma EGLsurfaces, zmieniając wartość current . EGLSurface musi być aktualny tylko w jednym wątku na raz.

EGL nie jest kolejnym aspektem powierzchni (jak SurfaceHolder). EGLSurface to pokrewna, ale niezależna koncepcja. Można rysować na powierzchni EGLsurface, która nie jest poparta powierzchnią, a także można używać powierzchni bez EGL. EGLSurface po prostu zapewnia GLES miejsce do rysowania.

Zapoznaj się z dokumentem definicji zgodności z systemem Android, aby zapoznać się z wymaganiami OpenGL ES i EGL.

ANative Window

Klasa powierzchni publicznej jest zaimplementowana w języku programowania Java. Odpowiednikiem w C/C++ jest klasa ANativeWindow, częściowo eksponowana przez Android NDK . Możesz uzyskać ANativeWindow z powierzchni za pomocą ANativeWindow_fromSurface() . Podobnie jak jego kuzyn w języku Java, możesz go zablokować, renderować w oprogramowaniu oraz odblokowywać i publikować. Podstawowym natywnym typem okna jest strona producenta BufferQueue.

Aby utworzyć powierzchnię okna EGL z kodu natywnego, przekaż instancję EGLNativeWindowType do eglCreateWindowSurface() . EGLNativeWindowType jest synonimem ANativeWindow, więc możesz rzutować jeden na drugi.