OpenGL ES(一) OpenGL ES初探

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)用

圖片濾鏡、視頻濾鏡

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容