OpenGL ES 初探

OpenGL ES

  • OpenGL ES是OpenGL的子集
  • 是針對嵌入式設(shè)備及移動終端設(shè)備的高級3D圖形應(yīng)用程序喂饥,例如iOS棘钞、Android字管、Windows等
  • OpenGL ES 是跨平臺的,不會提供窗口相關(guān)方法侵佃,需要系統(tǒng)各自提供載體
OpenGL ES渲染流程
OpenGL ES渲染流程

OpenGL ES允許應(yīng)用程序利用底層圖形處理器的強?功能桑李。iOS設(shè)備上的GPU可以執(zhí)行復(fù)雜的2D和3D繪圖踱蛀,以及最終圖像中每個像素的復(fù)雜著色計算。

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圖形管線

OpenGL ES圖形管線
  • API獲得頂點數(shù)據(jù),將頂點數(shù)據(jù)從內(nèi)存中拷貝至頂點緩沖區(qū)(顯存)
  • 拿到數(shù)據(jù)之后呛伴,通過attribute通道傳遞至頂點著色器勃痴,同時,紋理坐標通過Texture通道傳遞* 到頂點著色器和片元著色器
  • 然后热康,圖元裝配沛申,即圖元的連接方式,一共有9種姐军,常用的有6種铁材,此步驟將頂點變換為圖形
  • 光柵化:確定圖形與屏幕對應(yīng)的位置
  • 片元/片段/像素著色器:處理對應(yīng)像素點的顏色值
  • 在將處理好的每個像素點的顏色值存儲到幀緩存區(qū)尖淘,然后在顯示器中顯示
  • API:可以通過API操作頂點緩沖區(qū)、頂點著色器著觉、紋理坐標德澈、片段著色器

Apple官方圖示

圖形管道-蘋果官方圖示
  • App:提供圖元裝配頂點信息,圖片信息
  • Vertex(頂點著色器):處理頂點 -- 圖形變換(旋轉(zhuǎn)固惯、縮放、平移)
  • Geometry(圖元裝配):圖元裝配 + 裁剪(超出屏幕部分被裁剪)
  • Fragment(片元著色器):紋理處理 + 霧化處理
  • Framebuffer Operation(幀緩沖區(qū)):透明度混合缴守、模板葬毫、深度測試;最后在混合屡穗,這些操* 作都是在即將顯示時贴捡,在幀緩沖區(qū)中完成的動作

頂點著色器

  1. 著?器程序—描述頂點上執(zhí)?操作的頂點著?器程序源代碼/可執(zhí)行?件
    2.頂點著?器輸?(屬性) — ?頂點數(shù)組提供每個頂點的數(shù)據(jù)
    3.統(tǒng)?變量(uniform)—頂點/?元著色器使?的不變數(shù)據(jù)
  2. 采樣器—代表頂點著色器使?紋理的特殊統(tǒng)?變量類型.


    頂點著色器

輸入,有3種方式
1村砂、通過attribute通道輸入頂點數(shù)據(jù)烂斋,提供每個頂點的數(shù)據(jù)
2、通過uniform通道輸入統(tǒng)一變量础废,即頂點/片元著色器中使用的不變的數(shù)據(jù)
3汛骂、采樣器:表示頂點著色器使用紋理的特殊統(tǒng)一變量類型
輸出:經(jīng)過處理的最終頂點數(shù)據(jù),有2種
1评腺、gl_Position帘瞭,是GLSL 的內(nèi)建變量,是將處理后的最終頂點數(shù)據(jù)賦值給它
2蒿讥、gl_PointSize蝶念,是指點的尺寸,即可以在頂點著色器中修改每個點的大小芋绸,使用率較低

頂點著色器處理的業(yè)務(wù)

  • 矩陣變換位置
  • 計算光照公式生成逐頂點顏色(也可以片元著色器)
  • 生成/變換紋理坐標:片元著色器是沒有辦法傳入屬性即attribute的媒殉,可以通過頂點著色器橋接,間接將紋理坐標屬性傳遞到片元著色器

頂點著色器GLSL代碼示例

  • attribute摔敛、uniform 表示client與server之間的通道
  • 其中的vec4廷蓉、vec2都是向量類型,表示四維向量和二維向量
  • mat4:4*4矩陣
  • varying是修飾符:通過varying將紋理坐標傳入到片元著色器
  • lowp:低精讀
    main中的操作
  • 實現(xiàn)了紋理坐標的橋接
  • 實現(xiàn)了頂點旋轉(zhuǎn)矩陣的相乘:列向量 與 列矩陣 相乘马昙,得到旋轉(zhuǎn)后的頂點坐標
  • 將上述得到的頂點坐標苦酱,賦值給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; 
}

圖元裝配、光柵化

  • 圖元(Primitive): 點,線,三?形等.
  • 圖元裝配:將頂點數(shù)據(jù)計算成一個個圖元.在這個階段會執(zhí)行裁剪给猾、透視分割和 Viewport變換操作疫萤。
  • 圖元類型和頂點確定將被渲染的單獨圖元。對于每個單獨圖元及其對應(yīng)的頂點敢伸,圖元裝配階段執(zhí)行的操作包括:將頂點著色器的輸出值執(zhí)行裁剪扯饶、透視分割、視?變換后進?光柵化階段。
  • 光柵化:在這個階段繪制對應(yīng)的圖元(點/線/三?角形). 光柵化就是將圖元轉(zhuǎn)化成一組二維?段的過程.?這些轉(zhuǎn)化的?段將由?元著色器處理.這些?維片段就是屏幕上可繪制的像素尾序。

?段著?器/片元著色器

  1. 著色器程序—描述?段上執(zhí)行操作的片元著?器程序源代碼/可執(zhí)行文件
    2.輸?變量— 光柵化單元用插值為每個片段?成的頂點著色器輸出
    3.統(tǒng)?變量(uniform)—頂點/片元著色器使?的不變數(shù)據(jù)
  2. 采樣器—代表片元著色器使用紋理的特殊統(tǒng)?變量類型.


    片元著色器輸入-輸出

輸入同頂點著色器一樣钓丰,有3種方式
由頂點著色器橋接傳遞過來的紋理坐標等
通過uniform通道輸入統(tǒng)一變量,即頂點/片元著色器中使用的不變的數(shù)據(jù)
采樣器:表示頂點著色器使用紋理的特殊統(tǒng)一變量類型每币,例如紋理就是通過采樣器傳遞
輸出:某個像素點經(jīng)過片元著色器處理后的結(jié)果

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

  1. 計算顏?
  2. 獲取紋理值
  3. 往像素點中填充顏色值(紋理值/顏色值);
    總結(jié): 它可以?于圖片/視頻/圖形中每個像素的顏?填充(?如給視頻添加濾鏡,實際上就是將視頻中每個圖片的像素點顏?填充進行修改.)

片元著色器GLSL代碼示例

varying:必須和頂點著色器中一模一樣携丁,這樣才能傳遞紋理坐標
sampler2D 采樣器類型
texture2D(紋理采樣器,紋理坐標):獲取對應(yīng)位置/坐標的顏色值兰怠,簡稱獲得紋素
gl_FragColor(內(nèi)建變量):將最終的顏色值賦值給它

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

總結(jié)

  • 頂點著色器梦鉴、片元著色器都是代碼段,類似于iOS中的函數(shù)/方法揭保,有返回值
  • 頂點著色器的返回值會被復(fù)制給gl_Position
  • 片元著色器的結(jié)果會賦值給gl_fragColor
  • 這兩個返回值都屬于GLSL中的內(nèi)建變量肥橙,是封裝好的,直接將數(shù)據(jù)賦值給它即可
  • gl_Position:頂點著色器中某一個頂點經(jīng)過一系列處理后得到的結(jié)果
  • gl_fragColor:經(jīng)過片元著色器對某一個像素點來進行處理之后的結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秸侣,一起剝皮案震驚了整個濱河市存筏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌味榛,老刑警劉巖椭坚,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搏色,居然都是意外死亡藕溅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門继榆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巾表,“玉大人,你說我怎么就攤上這事略吨〖遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵翠忠,是天一觀的道長鞠苟。 經(jīng)常有香客問我,道長秽之,這世上最難降的妖魔是什么当娱? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮考榨,結(jié)果婚禮上跨细,老公的妹妹穿的比我還像新娘。我一直安慰自己河质,他們只是感情好冀惭,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布震叙。 她就那樣靜靜地躺著,像睡著了一般散休。 火紅的嫁衣襯著肌膚如雪媒楼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天戚丸,我揣著相機與錄音划址,去河邊找鬼。 笑死限府,一個胖子當著我的面吹牛夺颤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谣殊,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牺弄!你這毒婦竟也來了姻几?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤势告,失蹤者是張志新(化名)和其女友劉穎蛇捌,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咱台,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡络拌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了回溺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片春贸。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遗遵,靈堂內(nèi)的尸體忽然破棺而出萍恕,到底是詐尸還是另有隱情,我是刑警寧澤车要,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布允粤,位于F島的核電站,受9級特大地震影響翼岁,放射性物質(zhì)發(fā)生泄漏类垫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一琅坡、第九天 我趴在偏房一處隱蔽的房頂上張望悉患。 院中可真熱鬧,春花似錦榆俺、人聲如沸购撼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽迂求。三九已至碾盐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揩局,已是汗流浹背毫玖。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凌盯,地道東北人付枫。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像驰怎,于是被迫代替她去往敵國和親阐滩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355