本專案為
SurfaceView和TextureView封裝了 EGL 環境管理以及 Render 執行緒,可以和GLSurfaceView一樣使用 OpenGLES 進行渲染,并嘗試使用 OpenGLES 繪制了一個三角形驗證正確性,
GitHub:https://github.com/carverZhong/AndroidEGL.
一、EGL 原理
EGL 是 OpenGL ES 和本地視窗系統(Native Window System)之間的通信介面,它的主要作用如下:
- 與設備的原生視窗系統通信,
- 查詢繪圖表面的可用型別和配置,
- 創建繪圖表面,
- 在OpenGL ES 和其他圖形渲染API之間同步渲染,
- 管理紋理貼圖等渲染資源,
EGL 的架構圖如下:

-
Display 是對實際顯示設備的抽象,代碼中對應
EGLDisplay, -
Surface 是對用來存盤影像的記憶體區域 FrameBuffer 的抽象,包括 Color Buffer, Stencil Buffer ,Depth Buffer,代碼中對應
EGLSurface, -
Context存盤 OpenGL ES 繪圖的一些狀態資訊,代碼中對應
EGLContext,
二、EGL 實踐
1.EGL 環境創建
EGL 環境創建主要是操作 EGLDisplay、EGLSurface 和 EGLContext,一般步驟如下:
-
使用
eglGetDisplay(EGL_DEFAULT_DISPLAY)獲取 EGLDisplay,并呼叫eglInitialize方法執行初始化,建立起與本地視窗系統的連接, -
呼叫
eglChooseConfig方法,確定渲染表面的配置資訊, -
創建
EGLContext:eglCreateContext, -
使用
ANativeWindow創建EGLSurface, -
系結背景關系:
eglMakeCurrent(eglDisplay_, eglSurface_, eglSurface_, eglContext_) -
交換緩沖:
eglSwapBuffers(eglDisplay_, eglSurface_),執行后即可看到渲染的內容, -
退出時需要釋放EGL環境,
2.代碼實作
實作思路:在Java層封裝了NativeRenderer類,用于處理與Native層的互動以及兼容SurfaceView和TextureView,并使用了一個HandlerThread來做渲染執行緒,借助Choreographer將每幀的回呼傳遞到了Native,實作類似于View.onDraw方法,
從SurfaceView和TextureView獲取的 Surface 非常重要,從 Surface 獲取 ANativeWindow 才能完成這兩個 View 與 EGL 環境的系結,具體參考:EGLSurface 和 OpenGL ES,
EGLHelper 參考了 GLSurfaceView.EglHelper 的實作,完成了 EGL 環境創建,
參考檔案:OpenGL ES 共享背景關系實作多執行緒渲染 - 掘金,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/509166.html
標籤:其他
上一篇:Android EGL 實踐
