O Android usa a API OpenGL ES (GLES) para renderizar gráficos. Para criar contextos GLES e fornecer um sistema de janelas para renderizações GLES, o Android usa a biblioteca EGL . As chamadas GLES renderizam polígonos texturizados, enquanto as chamadas EGL colocam renderizações nas telas.
Antes de desenhar com GLES, você precisa criar um contexto GL. No EGL, isso significa criar um EGLContext e um EGLsurface. As operações GLES se aplicam ao contexto atual, que é acessado por meio do armazenamento local de thread em vez de ser passado como um argumento. O código de renderização deve ser executado em um thread GLES atual, não no thread da interface do usuário.
EGLSuperfícies
O EGLsurface pode ser um buffer fora da tela alocado pelo EGL, chamado de pbuffer ou uma janela alocada pelo sistema operacional. Chamar a função eglCreateWindowSurface()
cria superfícies de janela EGL. eglCreateWindowSurface()
recebe um objeto de janela como argumento, que no Android é uma superfície. Uma superfície é o lado produtor de um BufferQueue. Os consumidores , que são SurfaceView, SurfaceTexture, TextureView ou ImageReader, criam superfícies. Quando você chama eglCreateWindowSurface()
, o EGL cria um novo objeto EGLSurface e o conecta à interface do produtor do BufferQueue do objeto de janela. A partir desse ponto, a renderização para esse EGLsurface resulta em um buffer sendo desenfileirado, renderizado e enfileirado para uso pelo consumidor.
O EGL não fornece chamadas de bloqueio/desbloqueio. Emita comandos de desenho e chame eglSwapBuffers()
para enviar o quadro atual. O nome do método vem da troca tradicional de buffers frontais e traseiros, mas a implementação real pode ser diferente.
Apenas um EGLSurface pode ser associado a uma superfície por vez (você pode ter apenas um produtor conectado a um BufferQueue), mas se você destruir o EGLSurface ele se desconecta do BufferQueue e permite que outra coisa se conecte.
Um determinado thread pode alternar entre vários EGLsurfaces alterando o que é atual . Um EGLsurface deve ser atual em apenas um thread por vez.
EGL não é outro aspecto de uma superfície (como SurfaceHolder). EGLsurface é um conceito relacionado, mas independente. Você pode desenhar em um EGLsurface que não é suportado por uma superfície e pode usar uma superfície sem EGL. O EGLsurface apenas fornece ao GLES um lugar para desenhar.
Consulte o Documento de definição de compatibilidade do Android para requisitos de OpenGL ES e EGL.
UMAJanela Ativa
A classe de superfície pública é implementada na linguagem de programação Java. O equivalente em C/C++ é a classe ANativeWindow, semi-exposta pelo Android NDK . Você pode obter o ANativeWindow de uma superfície com a chamada ANativeWindow_fromSurface()
. Assim como seu primo em linguagem Java, você pode bloqueá-lo, renderizar em software e desbloquear e postar. O tipo básico de janela nativa é o lado produtor de um BufferQueue.
Para criar uma superfície de janela EGL a partir do código nativo, passe uma instância de EGLNativeWindowType para eglCreateWindowSurface()
. EGLNativeWindowType é sinônimo de ANativeWindow, então você pode converter um para o outro.