了解 OpenGL ES

OpenGL ES

1.OpenGL ES是OpenGL的子集
2.是針對嵌入式設(shè)備及移動終端設(shè)備的高級3D圖形應(yīng)用程序咙轩,例如iOS获讳、Android、Windows等
3.OpenGL ES 是跨平臺的活喊,不會提供窗口相關(guān)方法丐膝,需要系統(tǒng)各自提供載體

OpenGL ES渲染流程
下圖出自蘋果官方文檔OpenGL ES as a Client-Server Architecture

OpenGL ES

OpenGL ES的渲染主要分為兩部分:CPU和GPU

CPU部分

1.app代碼通過OpenGL ES API,會調(diào)度OpenGL ES Framework
2.通過OpenGL ES client 調(diào)度 OpenGL ES sever,將頂點(diǎn)數(shù)據(jù)等傳遞到GPU

GPU部分

做一些圖形硬件的處理,例如光柵化帅矗、顯示界面等偎肃。

圖形管道
以上圖片的過程

1.API獲得頂點(diǎn)數(shù)據(jù),將頂點(diǎn)數(shù)據(jù)從內(nèi)存中拷貝至頂點(diǎn)緩沖區(qū)(顯存)
2.拿到數(shù)據(jù)之后浑此,通過attribute通道傳遞至頂點(diǎn)著色器累颂,同事,紋理坐標(biāo)通過Texture通道傳遞到頂點(diǎn)著色器和片元著色器凛俱。
3.圖元裝配紊馏,即圖元的鏈接方式,一共有9種最冰,常用的有6種瘦棋,此步驟將頂點(diǎn)變換為圖形
4.光柵化: 確定圖形與屏幕對應(yīng)的位置
5.片元(片段/像素)著色器:處理對應(yīng)像素點(diǎn)的顏色值
6.將處理好的每個像素點(diǎn)的顏色值存儲到幀緩存區(qū)稀火,然后顯示器中顯示
7.API:可以通過API操作頂點(diǎn)緩沖區(qū)暖哨、頂點(diǎn)著色器、紋理坐標(biāo)凰狞、片元著色器

Apple官方圖示

來自蘋果官方文檔OpenGL ES as a Graphics Pipeline

圖形管道

1.APP:提供圖元裝配頂點(diǎn)信息篇裁,圖片信息
2.Vertex(頂點(diǎn)著色器):處理頂點(diǎn) -> 圖形變換(旋轉(zhuǎn)、縮放赡若、平移)
3.Geometry(圖元裝配):圖元裝配 + 裁剪(超出屏幕部分被裁剪)
4.Fragment(片元著色器) :紋理處理+霧化處理
5.Framebuffer Operation(幀緩沖區(qū)) :透明度混合达布、模板、深度測試逾冬;最后在混合

頂點(diǎn)著?器
頂點(diǎn)著色器輸入-輸出
輸入黍聂,有3種方式

1.通過attribute通道輸入頂點(diǎn)數(shù)據(jù),提供每個頂點(diǎn)的數(shù)據(jù)
2.通過uniform通道輸入統(tǒng)一變量身腻,即頂點(diǎn)/片元著色器中使用的不變數(shù)據(jù)
3.采樣器:表示頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型

輸出:經(jīng)過處理的最終頂點(diǎn)數(shù)據(jù)产还,有2種
  1. gl_Position是GLSL的內(nèi)建變量,是將處理后的最終頂點(diǎn)數(shù)據(jù)復(fù)制給它嘀趟。
  2. gl_PointSize是指頂點(diǎn)尺寸脐区,即可以在頂點(diǎn)著色器中修改每個點(diǎn)的大小,使用率較低她按。
頂點(diǎn)著色器處理的業(yè)務(wù)

1.矩陣變換位置
2.計算光照公式生成逐頂點(diǎn)顏色(也可以片元著色器)
3.生成/變換紋理坐標(biāo):片元著色器是沒有辦法傳入屬性即attribute的牛隅,可以通過頂點(diǎn)著色器橋接,間接將紋理坐標(biāo)屬性傳遞到片元著色器

頂點(diǎn)著色器GLSL代碼示例

1.attribute酌泰、uniform 表示client與server之間的通道
2.其中的vec4媒佣、vec2都是向量類型,表示四維向量和二維向量
3.mat4:4*4矩陣
4.varying是修飾符:通過varying將紋理坐標(biāo)傳入到片元著色器
5.lowp:低精讀
6.main中的操作

  • 實(shí)現(xiàn)了紋理坐標(biāo)的橋接
  • 實(shí)現(xiàn)了頂點(diǎn)旋轉(zhuǎn)矩陣的相乘:列向量 與 列矩陣 相乘陵刹,得到旋轉(zhuǎn)后的頂點(diǎn)坐標(biāo)
  • 將上述得到的頂點(diǎn)坐標(biāo)默伍,賦值給gl_Position
attribute vec4 position;
attribute vec2 textCoordinate; 
uniform mat4 rotateMatrix; 
varying lowp vec2 varyTextCoord; 
void main()
{
    varyTextCoord = textCoordinate;
    vec4 vPos = position;
    vPos = vPos * rotateMatrix;
    gl_Position = vPos; 
}
圖元裝配、光柵化

1.圖元裝配:將頂點(diǎn)數(shù)據(jù)計算成一個個圖元
2.光柵化:將圖元轉(zhuǎn)化為一組二維片段的過程,主要是由于屏幕是2D的巡验,所以轉(zhuǎn)換的像素點(diǎn)也是二維的

片元著色器
片元著色器輸入-輸出
輸入同頂點(diǎn)著色器一樣际插,有3種方式

1.由頂點(diǎn)著色器橋接傳遞過來的紋理坐標(biāo)等
2.通過uniform通道輸入統(tǒng)一變量,即頂點(diǎn)/片元著色器中使用的不變數(shù)據(jù)
3.采樣器:表示頂點(diǎn)著色器使用紋理的特殊統(tǒng)一變量類型显设,例如紋理就是通過采樣器來傳遞
4.輸出:某個像素點(diǎn)經(jīng)過片元著色器處理后的結(jié)果

片元著色器業(yè)務(wù)

1.計算顏色
2.獲取紋理值
3.往像素點(diǎn)填充顏色值(紋理值/顏色值)

片元著色器GLSL代碼示例

1.varying:必須和頂點(diǎn)著色器中一模一樣框弛,這樣才能傳遞紋理坐標(biāo)
2.sampler2D 采樣器類型
3.texture2D(紋理采樣器,紋理坐標(biāo)):獲取對應(yīng)位置/坐標(biāo)的顏色值捕捂,簡稱獲得紋素
4.gl_FragColor(內(nèi)建變量):將最終的顏色值賦值給它

varying lowp vec2 varyTextCoord; 
uniform sampler2D colorMap;
void main() {
gl_FragColor = texture2D(colorMap, varyTextCoord); }

總結(jié)

1.頂點(diǎn)著色器瑟枫、片元著色器都是代碼段,類似于iOS中的函數(shù)/方法指攒,有返回值
1.1 頂點(diǎn)著色器的返回值會被復(fù)制給gl_Position
1.2 片元著色器的結(jié)果會賦值給gl_fragColor

2.這兩個返回值都屬于GLSL中的內(nèi)建變量慷妙,是封裝好的,直接將數(shù)據(jù)賦值給它即可
2.1 gl_Position 頂點(diǎn)著色器中某一個頂點(diǎn)經(jīng)過一系列處理后得到的結(jié)果
2.2 gl_fragColor 經(jīng)過片元著色器對某一個像素點(diǎn)來進(jìn)行處理之后的結(jié)果

逐片段操作

這個過程都是GPU內(nèi)部處理的允悦,開發(fā)者并不需要關(guān)心膝擂,將處理好的數(shù)據(jù)存儲到幀緩存區(qū),最后讀取幀緩存區(qū)將圖形顯示到屏幕上

OpenGL ES的應(yīng)用

圖片濾鏡

1.獲取圖片中的每一個像素點(diǎn)
2.像素點(diǎn)做飽和度處理
3.得到新的顏色
4.將新的顏色翻入幀緩存區(qū)
5.最后進(jìn)行顯示

視頻濾鏡
  • 原理以及處理方式是一樣的(GLSL代碼)隙弛,視頻也是一幀一幀處理的架馋,而一幀就是一張圖片

1.獲得視頻MP4文件
2.拿到h264(視頻壓縮文件)
3.將視頻解碼(解壓),還原成一幀一幀的圖片
4.針對一幀一幀的圖片進(jìn)行處理

EGL(Embedded Graphics Library)

  1. OpenGL ES 命令需要渲染上下?繪制表面才能完成圖形圖像的繪制
    2.渲染上下?: 存儲相關(guān)OpenGL ES狀態(tài)全闷,是一個狀態(tài)機(jī)

繪制表面:?于繪制圖元的表面,需要指定渲染的緩存區(qū),例如顏?緩叉寂、深度和模板

3.OpenGL ES API 并沒有提供如何創(chuàng)建渲染上下文或者上下文如何連接到原生窗口系 統(tǒng). EGL 是Khronos 渲染API(如OpenGL ES) 和原?窗?系統(tǒng)之間的接?. 唯?支持 OpenGL ES 卻不支持EGL的平臺是iOS. Apple 提供?己的EGL API的iOS實(shí)現(xiàn),稱為EAGL
4.因為每個窗?系統(tǒng)都有不同的定義,所以EGL提供基本的不透明類型—EGLDisplay, 這 個類型封裝了所有系統(tǒng)相關(guān)性,用于和原生窗?系統(tǒng)接?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市总珠,隨后出現(xiàn)的幾起案子屏鳍,更是在濱河造成了極大的恐慌,老刑警劉巖局服,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钓瞭,死亡現(xiàn)場離奇詭異,居然都是意外死亡腌逢,警方通過查閱死者的電腦和手機(jī)降淮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搏讶,“玉大人佳鳖,你說我怎么就攤上這事∶教瑁” “怎么了系吩?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妒蔚。 經(jīng)常有香客問我穿挨,道長月弛,這世上最難降的妖魔是什么青抛? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任谤祖,我火速辦了婚禮,結(jié)果婚禮上纸巷,老公的妹妹穿的比我還像新娘贞绵。我一直安慰自己厉萝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布榨崩。 她就那樣靜靜地躺著谴垫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪母蛛。 梳的紋絲不亂的頭發(fā)上翩剪,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機(jī)與錄音彩郊,去河邊找鬼前弯。 笑死,一個胖子當(dāng)著我的面吹牛焦辅,可吹牛的內(nèi)容都是我干的博杖。 我是一名探鬼主播椿胯,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筷登,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哩盲?” 一聲冷哼從身側(cè)響起前方,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廉油,沒想到半個月后惠险,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抒线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年班巩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘶炭。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱慌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眨猎,到底是詐尸還是另有隱情抑进,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布睡陪,位于F島的核電站寺渗,受9級特大地震影響匿情,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜信殊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一炬称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涡拘,春花似錦转砖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汞窗,卻和暖如春姓赤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仲吏。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工不铆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人裹唆。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓誓斥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親许帐。 傳聞我的和親對象是個殘疾皇子劳坑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355