轉(zhuǎn)載 https://blog.csdn.net/weixin_35127779/article/details/86540173
一彼念、相關(guān)概念:
1.OpenGL是一套繪圖函數(shù)的標準风科,OpenGL ES是OpenGL中針對嵌入式系統(tǒng)的一套函數(shù)子集莲兢。
2.EGL:通俗上講巩掺,OpenGL是一個操作[GPU]的API偏序,它通過驅(qū)動向GPU發(fā)送相關(guān)指令,控制圖形渲染管線狀態(tài)機的運行狀態(tài)胖替。但OpenGL需要本地視窗系統(tǒng)進行交互研儒,這就需要一個中間控制層,最好與平臺無關(guān)独令。EGL——因此被獨立的設(shè)計出來端朵,它作為OpenGL ES和本地窗口的橋梁。 EGL 是 OpenGL ES(嵌入式)和本地 平臺視窗系統(tǒng)之間的接口燃箭。
3.GLUT:是基本的窗口界面冲呢,是獨立于gl和glu的,如果不喜歡用glut可以用MFC和Win32窗口等代替招狸,但是glut是跨平臺的敬拓,這就保證了我們編出的程序是跨平臺的邻薯,如果用MFC或者Win32只能在windows操作系統(tǒng)上使用。選擇OpenGL的一個很大原因就是因為它的跨平臺性乘凸,所以我們可以盡量的使用glut庫厕诡。
3.glut
二、EGL使用流程
1.標準 EGL 數(shù)據(jù)類型如下所示:
EGLBoolean ——EGL_TRUE =1, EGL_FALSE=0
EGLint ——int 數(shù)據(jù)類型
EGLDisplay ——系統(tǒng)顯示 ID 或句柄营勤,可以理解為一個前端的顯示窗口
EGLConfig ——Surface的EGL配置灵嫌,可以理解為繪制目標framebuffer的配置屬性
EGLSurface ——系統(tǒng)窗口或 frame buffer 句柄 ,可以理解為一個后端的渲染目標窗口葛作。
EGLContext ——OpenGL ES 圖形上下文寿羞,它代表了OpenGL[狀態(tài)機] 如果沒有它,OpenGL指令就沒有執(zhí)行的環(huán)境进鸠。
下面幾個類型比較復雜稠曼,通過例子可以更深入的理解。這里要說明的是這幾個類型在不同平臺其實現(xiàn)是不同的客年,EGL只提供抽象標準霞幅。
NativeDisplayType——本地系統(tǒng)顯示類型,標識你所開發(fā)設(shè)備的物理屏幕
NativeWindowType ——本地系統(tǒng)窗口緩存類型量瓜,標識系統(tǒng)窗口
NativePixmapType ——本地系統(tǒng) frame buffer司恳,可以作為 Framebuffer 的系統(tǒng)圖像(內(nèi)存)數(shù)據(jù)類型,該類型只用于離屏渲染.
2 OpenGL ES的初始化過程(EGL初始化)如下圖所示意:
Display → Config → Surface
↑
Context
↑
Application → OpenGL Command
2.1. 獲取Display绍傲。
獲得Display要調(diào)用 eglGetDisplay扔傅,參數(shù)一般為 EGL_DEFAULT_DISPLAY 。
EGLboolean eglGetDisplay(NativeDisplay dpy)
2.2. 初始化egl烫饼。
調(diào)用 eglInitialize猎塞,該函數(shù)會進行一些內(nèi)部初始化工作,并傳回EGL版本號(major.minor)杠纵。
EGLboolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
2.3. 選擇Config荠耽。
Config實際指的是FrameBuffer的參數(shù),
一般用 eglChooseConfig 其中attr_list是以EGL_NONE結(jié)束的參數(shù)數(shù)組比藻,通常以id,value依次存放铝量,對于個別標識性的屬性可以只有 id,沒有value银亲。
EGLboolean eglChooseConfig(EGLDisplay dpy, const EGLint * attr_list, EGLConfig * config, EGLint config_size, EGLint *num_config)
另一個辦法是用 eglGetConfigs 來獲得所有config慢叨。
EGLboolean eglGetConfigs(EGLDisplay dpy, EGLConfig * config, EGLint config_size, EGLint *num_config)
這兩個函數(shù)都會返回不多于config_size個Config,結(jié)果保存在config[]中务蝠,系統(tǒng)的總Config個數(shù)保存 在num_config中拍谐。
可以利用eglGetConfig()中間兩個參數(shù)為0來查詢系統(tǒng)支持的Config總個數(shù)。
Config有眾多的Attribute,這些Attribute決定FrameBuffer的格式和能力轩拨,通過 eglGetConfigAttrib () 來讀取力穗,但不能修改。
2.4 構(gòu)造Surface气嫁。
Surface實際上就是一個FrameBuffer当窗,也就是渲染目的地,通過 eglCreateWindowSurface 來創(chuàng)建一個可實際顯示的Surface寸宵。
EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig confg, NativeWindow win, EGLint *cfg_attr)
系統(tǒng)通常還支持另外兩種Surface:PixmapSurface和PBufferSurface崖面,這兩種都不是可顯示的Surface,PixmapSurface是保存在系統(tǒng)內(nèi)存中的位圖梯影,PBuffer則是保存在顯存中的幀巫员。
對于這兩種surfaceAndroid系統(tǒng)中,支持PBufferSurface甲棍。
Surface也有一些attribute简识,基本上都可以故名思意,
EGL_HEIGHT EGL_WIDTH EGL_LARGEST_PBUFFER EGL_TEXTURE_FORMAT EGL_TEXTURE_TARGET EGL_MIPMAP_TEXTURE EGL_MIPMAP_LEVEL感猛,
通過eglSurfaceAttrib()設(shè)置七扰、eglQuerySurface()讀取。
2.5 創(chuàng)建Context陪白。
OpenGL ES的pipeline從程序的角度看就是一個狀態(tài)機颈走,有當前的顏色、紋理坐標咱士、變換矩陣立由、絢染模式等一大堆狀態(tài),這些狀態(tài)作用于OpenGL 程序提交的頂點坐標等圖元從而形成幀緩沖內(nèi)的像素序厉。在OpenGL的編程接口中锐膜,Context就代表這個狀態(tài)機,OpenGL API程序的主要工作就是向Context提供圖元弛房、設(shè)置狀態(tài)道盏,偶爾也從Context里獲取一些信息。
可以用
EGLContext eglCreateContext(EGLDisplay dpy, EGLSurface write, EGLSurface read, EGLContext * share_list)
來創(chuàng)建一個Context庭再。
2.6EGL變量之間的綁定
boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context)
該接口將申請到的display捞奕,draw(surface)和 context進行了綁定牺堰。也就是說拄轻,在context下的OpenGLAPI指令將draw(surface)作為其渲染最終目的地。而display作為draw(surface)的前端顯示伟葫。調(diào)用后恨搓,當前線程使用的EGLContex為context。
2.7. 繪制。
應用程序通過OpenGL API進行繪制斧抱,一幀完成之后常拓,調(diào)用 eglSwapBuffers 來顯示。
eglSwapBuffers(EGLDisplay dpy, EGLContext ctx)