OpenGL ES (OpenGL for Embedded Systems) 是以手持和嵌入式為目標(biāo)的高級3D圖形應(yīng)用程序編程接?(API)。OpenGL ES 是目前智能?機中占據(jù)統(tǒng)治地位的圖形API。支持的平臺: iOS、Android、Windows等。
OpenGL ES渲染流程

圖片來源于網(wǎng)絡(luò)
OpenGL ES允許應(yīng)用程序利用底層圖形處理器的強?功能。iOS設(shè)備上的GPU可以執(zhí)?復(fù)雜的2D和3D繪圖,以及最終圖像中每個像素的復(fù)雜著?計算。
OpenGL ES的渲染
OpebGL ES的渲染主要分為兩部分:CPU和GPU。
CPU
- App代碼通過OpenGL ES API,會調(diào)度OpenGL ES Framework;
- 通過OpenGL ES client 調(diào)度 OpenGL ES server,將頂點數(shù)據(jù)等傳遞到GPU;
GPU
- 做一些圖形硬件的處理,例如光柵化、顯示等;
OpenGL ES圖形渲染管線

圖片來源于網(wǎng)絡(luò)

圖片來源于網(wǎng)絡(luò)
- Application:提供圖元裝配頂點信息,圖片信息
- Vertex(頂點著色器):處理頂點、圖形變換(旋轉(zhuǎn)、縮放、平移)
- Geometry(圖元裝配):圖元裝配 + 裁剪(超出屏幕部分被裁剪)
- Fragment(片元著色器):紋理處理 + 霧化處理
- Framebuffer Operation(幀緩沖區(qū)):透明度混合、模板、深度測試;最后在混合,這些操作都是在即將顯示時,在幀緩沖區(qū)中完成的動作。
頂點著色器
就是處理頂點的著色器程序。

圖片來源于網(wǎng)絡(luò)
輸入
- 通過attribute通道輸入頂點數(shù)據(jù),提供每個頂點的數(shù)據(jù)
- 通過uniform通道輸入統(tǒng)一變量,即頂點/片元著色器中使用的不變的數(shù)據(jù)
- 采樣器:表示頂點著色器使用紋理的特殊統(tǒng)一變量類型
輸出
經(jīng)過處理的最終頂點數(shù)據(jù),有2種。
- gl_Position:GLSL 的內(nèi)建變量,是將處理后的最終頂點數(shù)據(jù)賦值給它
- gl_PointSize:指點的尺寸,即可以在頂點著色器中修改每個點的大小,使用率較低
頂點著色器處理的業(yè)務(wù)
?于執(zhí)行自定義計算,實施新的變換、照明或者傳統(tǒng)的固定功能所不允許的基于頂點的效果
- 矩陣變換位置
- 計算光照公式生成逐頂點顏色
- 生成/變換紋理坐標(biāo)
圖元裝配
圖元(Primitive)::點、線、三?形
圖元裝配: 將頂點數(shù)據(jù)計算成?個圖元。在這個階段會執(zhí)行裁剪、透視分割和Viewport變換操作。
光柵化
將圖元轉(zhuǎn)化為一組二維片段的過程,主要是由于屏幕是2D的,所以轉(zhuǎn)換的像素點也是二維的。
片元著色器/片段著色器

圖片來源于網(wǎng)絡(luò)
輸入
- 由頂點著色器橋接傳遞過來的紋理坐標(biāo)等
- 通過uniform通道輸入統(tǒng)一變量,即頂點/片元著色器中使用的不變的數(shù)據(jù)
- 采樣器:表示頂點著色器使用紋理的特殊統(tǒng)一變量類型,例如紋理就是通過采樣器傳遞
輸出
某個像素點經(jīng)過片元著色器處理后的結(jié)果
片元著色器業(yè)務(wù)
?于圖片/視頻/圖形中每個像素的顏色填充。(比如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏?填充進?修改)
- 計算顏色
- 獲取紋理值
- 往像素點中填充顏色值(紋理值/顏色值)
逐片段操作
這個過程都是GPU內(nèi)部處理的,開發(fā)者并不需要關(guān)心,將處理好的數(shù)據(jù)存儲到幀緩存區(qū),最后讀取幀緩存區(qū)將圖形顯示到屏幕上。
EGL(Embedded Graphics Library)
- OpenGL ES 命令需要渲染上下?和繪制表面才能完成圖形圖像的繪制;
- 渲染上下?: 存儲相關(guān)OpenGL ES狀態(tài),是一個狀態(tài)機;
- 繪制表面:?于繪制圖元的表面,需要指定渲染的緩存區(qū),例如顏?緩、深度和模板;
- OpenGL ES API 并沒有提供如何創(chuàng)建渲染上下文或者上下文如何連接到原生窗口系統(tǒng);
-
EGL是Khronos渲染API(如OpenGL ES) 和原?窗?系統(tǒng)之間的接?。 唯?支持 OpenGL ES 卻不支持EGL的平臺是iOS. Apple 提供?己的EGL API的iOS實現(xiàn),稱為EAGL- 因為每個窗?系統(tǒng)都有不同的定義,所以EGL提供基本的不透明類型 — EGLDisplay, 這個類型封裝了所有系統(tǒng)相關(guān)性,用于和原生窗?系統(tǒng)接?;
OpenGL ES的應(yīng)用
圖片濾鏡、視頻濾鏡