亚洲欧洲日产韩国不卡/手机看片1024久久精品你懂的/魔镜号亚洲一区二区三区在线/一本久中文视频播放

找手機游戲就上融易行 專業手游媒體門戶網站!

游戲更新 | 安卓游戲 | 蘋果游戲 | 推薦游戲 | 軟件更新 | 文章更新 | 熱門文章 | 推薦文章

OpenGL ES 2.0 知識串講二---EGL詳解

時間:2024-11-28 11:09:16    編輯:azu

OpenGL ES 2.0 知識串講二---EGL詳解

回顧上節:我們已經初步了解了OpenGL ES、EGL和GLSL的關系,EGL作為橋梁,負責與手機設備交互并獲取繪圖緩沖。

EGL API概覽:EGL由34個功能豐富的API構成,其中7個專門與手機設備交互,獲取關鍵配置信息,比如支持的buffer格式;16個用于生成表面和上下文,確保顯示在屏幕上;另有1個用于指定OpenGL ES版本并建立聯系。

具體細節:在獲取配置時,EGL會考慮手機硬件的差異,以確保兼容性;生成的表面通常包括Color、Depth和Stencil buffer,這些是圖形繪制的核心組件;而context則承載著OpenGL ES的運行狀態。EGL支持創建多個表面和上下文,但每個都需對應特定的OpenGL ES版本,以保持一致性友攜滑。

指定OpenGL ES版好臘本在EGL中至關重要,如1.1、2.0(增加了可編程模塊)、3.0/3.1等。EGL還提供了6個API,用于管理紋理和多線程高級功能,例如紋理貼圖。在繪制緩沖的生成中,EGL雖支持多線程,但格式選擇有限?;AAPI和進階功能將在后續章節深入探討。

OpenGL ES 2.0 知識串講二---EGL詳解

EGLGetError是個關鍵助手,它接收無輸入,返回執行中的錯誤代碼,涵蓋15種可能的錯誤狀態。連續調用它可清除錯誤標記,確保代碼的穩定運行。

EGLGetDisplay則是獲取操作系統提供的Display handle,輸入參數是display_id,用于后續與系統的交互。

EGL的優勢在于跨平臺兼容性:不同的display_id代表著操作系統和屏幕類型,如默認屏幕或物理屏幕。通過eglInitialize,我們可以指定display和EGL版本(如1.4,major 1,minor 4),返回初始化結果(EGL_TRUE或EGL_FALSE),并用eglGetError檢測初始化是否成功。已初始化的display允許在多個線程中重置版本,無需單獨初始化。

要獲取display支持的配置信息,eglGetConfigs是必不可少的,它接收display、配置信息的存儲指針、期望獲取的配置數量和實際匹配數量。

EGLBoolean eglInitialize(EGLDisplay dpy, EGLint* major, EGLint* minor); —— 初始化display并指定EGL版本。

EGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig* configs, EGLint config_size, EGLint* num_config); —— 獲取display支持的配置信息,根據需求進行篩選。

簡化參數說明:

函數eglChooseConfig看似五個輸入,實則三個核心參數:display、需求配置數組和配置數量,通過返回值EGL_TRUE或EGL_FALSE來指示匹配或不匹配。它根據需求從display中挑選出合適的配置,這些需求以鍵值對的形式表達,如EGL_RED_SIZE、EGL_STENCIL_SIZE。

忽略Config屬性值為EGL_DONT_CARE的匹配。如果傳入NULL或EGL_NONE,系統將選擇默認配置,并按標準順序排列。默認處理未定義屬性,如EGL_RED_SIZE設為0。eglBindAPI設置當前線程的繪圖API,支持OpenGL ES、OpenGL和OpenVG,選EGL_OPENGL_ES_API適用于移動設備。

創建EGLSurface

EGLDisplay: 指定display

EGLConfig: 配置信息,通常選擇第一個匹配的

窗口句柄(native window handle): 平臺特定的參數

額外屬性(EGL_RENDER_BUFFER): 設定繪制目標

成功創建的EGLSurface返回表面handle,失敗則返回EGL_NO_SURFACE,錯誤可能包括不匹配的隱禪配置、非法窗口句柄或內存分配失敗。

EGLContext的生成與綁定

EGLContext eglCreateContext根據需求創建渲染上下文,與表面配合使用,保存OpenGL ES狀態。通過指定版本,如1.x、2.x或3.x,創建成功返回handle,失敗則返回EGL_NO_CONTEXT,錯誤代碼揭示了原因,如不支持的API、配置不匹配或上下文不兼容。

OpenGL ES 2.0 知識串講二---EGL詳解

eglMakeCurrent是關鍵步驟,它將context與繪制線程和表面綁定,允許執行繪制和讀取操作。每個native窗口對應一個rendering context,且同一線程只能綁定一個API的context。

在EGL庫中,可以創建多個surface和context,但每個context必須與特定的API相關聯。當遇到surface或context損壞時,務必注意可能引發的未定義行為。使用完畢后,通過eglTerminate釋放資源,此時surface和context將變為invalid,再次使用將導致錯誤。

OpenGL ES視口與緩沖交換

視口定義了繪制buffer在屏幕上的顯示區域。當通過eglMakeCurrent綁定context時,它會獲取窗口尺寸作為初始視口。通過EGLSwapBuffers將color buffer顯示到屏幕上,這個操作需要EGLDisplay和EGLSurface作為參數,成功返回EGL_TRUE,否則返回EGL_FALSE。

EGLSwapBuffers

- 參數:EGLDisplay, EGLSurface

- 功能:將surface內容顯示到屏幕上,僅顯示color buffer

- 返回:EGL_TRUE 成功,EGL_FALSE 失敗

EGLTerminate用于釋放EGLDisplay的資源,包括surface和context,后續使用這些對象將引發錯誤。這個操作一旦完成,display的狀態將更新為已終止。

狀態概覽

- 初始化:eglInitialize成功

- 終止:eglTerminate成功

EGL的基本API(如eglInitialize、eglTerminate、eglMakeCurrent和eglReleaseThread)即使在display終止后仍可用。EGL的常用功能包括獲取Display handle、初始化配置、處理surface和context的創建、綁定和釋放。后續章節將詳述更多高級API,如eglGetConfigAttrib、eglDestroySurface和eglDestroyContext。在ShineEngine項目中,我們通過GLSurfaceView簡化了EGL環境,不過高級API的使用還需在實際項目中進一步探索。GL API在C文件中通過target_link_libraries鏈接GLESv2庫,確保程序正常運行。這部分內容來源于王爍2017年7月9日的文章。

最新游戲

玩家評論