目錄
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 轉場
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 函數
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GPUImage 使用
零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES GLSL 編程
一. EGL 前言
EGLNativeDisplayType – 系統顯示類型,標識你所開發設備的物理屏幕,DX/OPenGL ES/Metal/Vulkan….
EGLNativeWindowType – 系統窗口,渲染顯示的窗口句柄
EGLDisplay – 關聯 EGLNativeDisplayType 系統物理屏幕的通用數據類型,是平臺上 WGL / GLX / AGL 的等價物
EGLSurface – 渲染區域,相當於 OpenGL ES 繪圖的畫布 (一塊內存空間),用戶想繪製的信息首先都要先繪製到 EGLSurface 上,然後通過 EGLDisplay 顯示
EGLConfig – 對 EGLSurface 的 EGL 配置,可以理解爲繪製目標 framebuffer 的配置屬性
EGLContext – OpenGL ES 圖形上下文
二. EGL 繪製流程簡介
- 獲取 EGL Display 對象:eglGetDisplay
- 初始化與 EGLDisplay 之間的連接:eglInitialize
- 獲取 EGLConfig 對象:eglChooseConfig / eglGetConfigs
- 創建 EGLContext 實例:eglCreateContext
- 創建 EGLSurface 實例:eglCreateWindowSurface / eglCreatePbufferSurface
- 連接 EGLContext 和 EGLSurface 上下文 eglMakeCurrent
- 使用 OpenGL ES API 繪製圖形:gl_*
- 切換 front buffer 和 back buffer 顯示:eglSwapBuffer
- 斷開並釋放與 EGLSurface 關聯的 EGLContext 對象:eglRelease
- 刪除 EGLSurface 對象
- 刪除 EGLContext 對象
- 終止與 EGLDisplay 之間的連接
三.eglSwapBuffer 函數簡介
前面有介紹:
EGLDisplay – 關聯 EGLNativeDisplayType 系統物理屏幕的通用數據類型,是平臺上 WGL / GLX / AGL 的等價物
EGLSurface – 渲染區域,相當於 OpenGL ES 繪圖的畫布 (一塊內存空間),用戶想繪製的信息首先都要先繪製到 EGLSurface 上,然後通過 EGLDisplay 顯示
EGLSurface 作爲內存中的畫布(不可見),EGLDisplay 作爲顯示器輸出顯示(可見)**,而 eglSwapBuffer 作用就是把內存 EGLSurface** **中畫布中的數據交換到 EGLDisplay ,輸出到屏幕顯示繪製的內容**
/*描述:把內存 EGLSurface 中畫布中的數據交換到 EGLDisplay ,輸出到屏幕顯示繪製的內容
*參數:
* display:指定顯示的連接
* surface:EGL 繪圖表面
*
*返回值:成功是返回 EGL_TRUE,失敗時返回 EGL_FALSE
*/
EGLBoolean eglSwapBuffers(EGLDisplay display,
EGLSurface surface);
四.關於多個 EGLContext
某些情況下,我們想創建、使用多個 EGLContext ,對於這種情況,需要注意以下幾個情況:
- 不能在 2 個線程裏綁定同一個
EGLContext
。 - 不能在 2 個不同的線程裏,綁定相同的 EGLSurface 到 2 個不同的
EGLContext
上。 - 在 2 個不同的線程裏,綁定 2 個不同 EGLSurface 到 2 個
EGLContext
上,取決於使用的 GPU 的具體實現,可能成功,也可能失敗。
五.共享 EGLContext
共享 EGLContext 這種方式在加載階段很有用。由於上傳數據到 GPU(尤其是紋理數據(textures))這類操作很重,如果想要維持幀率穩定,應該在另一個線程進行上傳。
然而,對於上面多個 EGLContext 的 3 種情況的限制,必須在第一個 EGLContext 之外,創建第二個 EGLContext ,這個 EGLContext 將使用第一個 EGLContext 使用的內部狀態信息。這兩個 Context 即共享 Context 上下文。
需要注意的是:這**兩個 EGLContext 共享的只是內部狀態信息,它們兩個並不共享調用緩存(每個 EGLContext** 各自擁有一個調用緩存)。
創建第二個 EGLContext 的方法:
/*描述:創建 OpenGL ES 上下文 EGLContext
*參數:
* display:指定顯示的連接
* config:配置 EGLConfig
* share_context:允許其它 EGLContext 共享數據,使用 EGL_NO_CONTEXT 表示不共享
* attribList:指定操作的屬性列表,只能接受一個屬性 EGL_CONTEXT_CLIENT_VERSION(設置 OpenGL ES 版本)
*
*返回值:成功時返回新創建的 EGLContext,失敗時返回 EGL_NO_CONTEXT
*/
EGLContext eglCreateContext(
EGLDisplay display,
EGLConfig config,
EGLContext share_context,
EGLint const * attrib_list);
注意:第三個參數
share_context
是最重要的,它就是第一個 Context ,表示共享上下文
在第二個線程,不進行任何的繪製,只進行上傳數據到 GPU 的操作。所以,給第二個 Context 的 Surface 應該是一個像素緩衝 (pixel buffer) Surface。
/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:OpenGL ES EGL eglCreatePbufferSurface
//@Time:2022/08/04 07:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累!
/******************************************************************************************/
EGLSurface eglCreatePbufferSurface(
EGLDisplay display,
EGLConfig config,
EGLint const * attrib_list);
六.猜你喜歡
- OpenGL ES 簡介
- OpenGL ES 版本介紹
- OpenGL ES 2.0 和 3.0 區別
- OpenGL ES 名詞解釋(一)
- OpenGL ES 名詞解釋(二)
- OpenGL ES GLSL 着色器使用過程
- OpenGL ES EGL 簡介
- OpenGL ES EGL 名詞解釋
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
- OpenGL ES EGL eglCreateWindowSurface
- OpenGL ES EGL eglCreatePbufferSurface
- OpenGL ES EGL eglMakeCurrent
- OpenGL ES EGL eglSwapBuffer
本文由博客 - 猿說編程 猿說編程 發佈!