一個沉浸感十足的游戲,其場景中的全局光照效果一定功不可沒。 動態漫反射全局光照(DDGI)帶來的光影變化,是細膩延展的視覺語言,讓場景中每種顏色都有了“五彩斑斕”的詮釋,場景佈局光影,物體關係立顯,環境溫度降臨,拓展了畫面信息傳達的層次,點睛之筆。 直接光渲染 VS 動態漫反射全局光照 細膩的光照視 ...
本項目為
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 共用上下文實現多線程渲染 - 掘金。