(3)Opengl ES 環境搭建

2021-09-05 00:26:27 字數 3163 閱讀 1967

在android開發中使用opengl es進行圖形、影象繪製,需要一系列的配置才可以進行,而且,在opengl es開發中,需要明白以下幾點:

1)opengl es繪製是居於狀態的,通過eglcontext進行狀態管理;

2)opengl es是和當前執行緒相關的,乙個eglcontext物件只能關聯到乙個執行緒;

3)如果需要繪製到螢幕上,需要關聯螢幕的su***ce;

首先我們看下在android中進行opengl es開發有幾種方式。

使用glsu***ceview,只需要實現glsu***ceview.render介面,我們就可以在ondrawframe裡使用opengl es繪製圖形、影象,opengl es相關的環境由glsu***ceview自動為我們建立,我們只負責繪製就可以。

另外glsu***ceview是繼承於su***ceview的,因此,其內部實現就是單獨開啟乙個執行緒來進行繪製,最終提交到su***ceview的su***ce進行顯示。

這種方式需要對opengl es進行配置,自己建立環境,管理繪製執行緒,雖然麻煩,但是其定製的自由度很高,最終呈現的su***ce也不僅僅是su***ceview來實現,還可以呈現在textureview上等,非常靈活,這也是本節我們重點介紹的。

首先,大家先看看下圖,其描述了乙個標準的egl程式需要做的準備工作有那些。

從上圖我們總結一下,使用egl需要的步驟以及使用中需要注意的問題。

經過上述步驟後,opengl es的繪製環境已經準備好了,現在可以進行繪製了,上面我們說過,opengl es是居於狀態管理的,而上圖中的第四步建立的eglcontext就是管理繪製狀態的,而這個eglcontext是通過eglmakecurrent來把其設定到當前執行緒的tls中,這樣,每次呼叫opengl es相關api時,會通過執行緒的tls來獲取到eglcontext物件,進而獲取到當前我們需要操作的物件(比如當前設定的紋理物件),所以,如果當前執行緒沒有關聯任何eglcontext,是不能操作繪製相關的api的,這就是為什麼opengl es是執行緒相關的,而且在不共享的情況下不能跨執行緒操作opengl es的道理(關於怎麼樣在多執行緒共享opengl es的物件,後續章節會講)。

下面總結下opengl es繪製環境準備階段需要注意如下幾點:

1)一定要設定使用opengl es版本號(否則系統不知道我們用哪個版本);

2)內容放置的su***ce有兩種:裝置表面和離屏渲染;

3)一定要把eglcontext關聯到當前執行緒,其實,就是把eglcontext物件設定到當前執行緒的tls;

4)opengl es繪製是基於狀態的(狀態儲存在eglcontext);

int eglgetdisplay(int display_id);

一般取值egl_default_display,獲取預設顯示裝置

egl顯示裝置號,預設顯示裝置一般是0;

獲取預設的顯示裝置,通常情況下返回0(0號裝置);

eglboolean eglinitialize(egldisplay dpy, eglint *major, eglint*minor);

dpy:通過eglgetdisplay獲取的顯示裝置號;

major:egl的主版本號;

minor:egl的副版本號;

成功返回true;否則false;

初始化顯示裝置,獲取系統中 egl 的實現版本號,注意這是egl的版本號,不是opengl es的版本;

eglboolean eglchooseconfig(egldisplay dpy,const eglint *attrib_list, eglconfig *configs, eglint config_size,eglint * num_config);

dpy:通過eglgetdisplay獲取的顯示裝置號;

attrib_list:屬性引數列表,使用其來選中符合的config;

configs:配置引數;

config_size:配置引數的大小;

num_config:配置引數的個數

成功返回true;否則false;

使用指定的顯示引數配置顯示裝置,比如顏色模式等,其中attr_list是以egl_none結束的引數陣列;

glapi eglcontext apientry eglcreatecontext(egldisplay dpy, eglconfig config, eglcontext share_list, const eglint *attrib_list ) ;

dpy:通過eglgetdisplay獲取的顯示裝置號;

config:配置引數;

attrib_list:屬性引數列表

eglcontext ,儲存繪製狀態;

建立opengl es顯示上下文,操作以及狀態都會記錄在此上下文中。

glapi eglboolean apientry eglmakecurrent(egldisplaydpy, eglsu***ce draw,  eglsu***ce read,eglcontext ctx);

dpy:通過eglgetdisplay獲取的顯示裝置號;

draw:繪製的su***ce;

read:讀取的su***ce;

ctx:eglcreatecontext建立的上下文;

成功返回true;否則false;

把eglcontext關聯到當前執行緒,這裡其實就是設定到當前執行緒的tls中,這樣,我們執行opengl es相關操作的時候,就會從當前執行緒取出eglcontext,這就是為什麼一定要呼叫這個函式的原因。

好了,到這裡就把怎麼樣搭建opengl es繪製的環境講完了,注意,上面介紹的egl介面是native層的介面描述,android層是經過封裝的,會有點差別,但是大體一致,主要是引數型別的轉換等,另外還有一些函式沒有介紹,比如查詢配置引數、建立視窗相關su***ce的api,後續實際專案會具體介紹。

關於opengl es準備工作已經完成,下一節,開始我們真正的opengl es的實際專案吧。

opengles開發環境搭建

1,vs中建立解決方案,解決方案下新增專案 將 d3dcompiler 43.dll,d3dcompiler 46.dll,freeimage.dll,libegl.dll,libglesv2.dll新增到解決方案的debug或者release目錄 注意是解決方案的debug或release目錄 2...

go 3 環境搭建 GoLand環境搭建

ide安裝就是平常的傻瓜式安裝,這裡就不多說了。1 雙擊執行安裝完的goland,選擇建立專案,並關聯goroot 會自動關聯 2 在專案上點選右鍵,按圖選擇,如下,給檔案命乙個名字,如 test 3 在檔案中寫入如下 4 在檔案上右鍵,選擇 run go build test.go,就可以看到控制...

OpenGL ES 3 紋理基礎

1 讀取檔案 將儲存的檔案讀取到記憶體 方法很多 inputstream is this.getresources openrawresource path bitmap bitmaptmp try finally catch ioexception e 2 載入紋理 將記憶體影象資料上傳到視訊記憶...