OpenGL ES EGL eglSwapBuffer

目錄

零基礎 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 的配置屬性

EGLContextOpenGL ES 圖形上下文

二. EGL 繪製流程簡介

  1. 獲取 EGL Display 對象:eglGetDisplay
  2. 初始化與 EGLDisplay 之間的連接:eglInitialize
  3. 獲取 EGLConfig 對象:eglChooseConfig / eglGetConfigs
  4. 創建 EGLContext 實例:eglCreateContext
  5. 創建 EGLSurface 實例:eglCreateWindowSurface / eglCreatePbufferSurface
  6. 連接 EGLContext 和 EGLSurface 上下文 eglMakeCurrent
  7. 使用 OpenGL ES API 繪製圖形:gl_*
  8. 切換 front buffer 和 back buffer 顯示:eglSwapBuffer
  9. 斷開並釋放與 EGLSurface 關聯的 EGLContext 對象:eglRelease
  10. 刪除 EGLSurface 對象
  11. 刪除 EGLContext 對象
  12. 終止與 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);

六.猜你喜歡

  1. OpenGL ES 簡介
  2. OpenGL ES 版本介紹
  3. OpenGL ES 2.0 和 3.0 區別
  4. OpenGL ES 名詞解釋(一)
  5. OpenGL ES 名詞解釋(二)
  6. OpenGL ES GLSL 着色器使用過程
  7. OpenGL ES EGL 簡介
  8. OpenGL ES EGL 名詞解釋
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig
  13. OpenGL ES EGL eglGetError
  14. OpenGL ES EGL eglCreateContext
  15. OpenGL ES EGL eglCreateWindowSurface
  16. OpenGL ES EGL eglCreatePbufferSurface
  17. OpenGL ES EGL eglMakeCurrent
  18. OpenGL ES EGL eglSwapBuffer

本文由博客 - 猿說編程 猿說編程 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章