OpenGL ES 簡(jiǎn)單介紹與一些專業(yè)名詞

圖像API介紹

  • OpenGL (Open Graphics Library)是一個(gè)跨編程語(yǔ)?言挣磨、跨平臺(tái)的編程圖形程序接?口璧疗,它將計(jì)算機(jī)的資源抽象稱為一個(gè)個(gè)OpenGL的對(duì)象杂曲,對(duì)這些資源的操作抽象為一個(gè)個(gè)的OpenGL指令。

  • OpenGL ES (OpenGL for Embedded Systems)是 OpenGL 三維圖形 API 的子集溃论,針對(duì)手機(jī)滔金、 PDA和游戲主機(jī)等嵌?入式設(shè)備而設(shè)計(jì)色解,去除了許多不必要和性能較低的API接口。

  • DirectX 是由多個(gè)API組成的餐茵,它并不是一個(gè)單純的圖形API科阎,它只支持Windows,不是跨平臺(tái)忿族。按照性質(zhì)可分為顯示部分萧恕,聲音部分,輸入部分和輸出部分肠阱。

  • Metal:它是蘋果為游戲開發(fā)推出的新技術(shù)票唆,該技術(shù)大大的提高了3D圖像渲染性能(10倍)。為3D渲染而推出的框架屹徘。

圖形API簡(jiǎn)單的總結(jié)就是實(shí)現(xiàn)了圖形的底層渲染走趋。

游戲開發(fā)中對(duì)游戲場(chǎng)景、人物的渲染
音視頻開發(fā)中噪伊,視頻解碼后數(shù)據(jù)的渲染
在地圖引擎上地圖數(shù)據(jù)的渲染
繪制動(dòng)畫
給視頻加濾鏡

OpenGL / OpenGL ES / Metal 在項(xiàng)目中利用GPU芯片來高效渲染圖形圖像簿煌。
(CPU是處理一些邏輯性強(qiáng)的任務(wù))

Metal 和 OpenGL ES的學(xué)習(xí)就類似于 swift 與 OC的學(xué)習(xí)氮唯。作為一個(gè)蘋果開發(fā)人員,swift要掌握姨伟,但是OC必須掌握惩琉。OpenGL ES是十分重要的

學(xué)習(xí)OpenGL ES有很多專業(yè)的名詞。下面我們一一介紹一下常用的夺荒。

OpenGL 專業(yè)名詞解析

  • OpenGL 上下文 (Context):

    在調(diào)用OpenGL指令之前首先要?jiǎng)?chuàng)建一個(gè)OpenGL上下文瞒渠。存儲(chǔ)了各種狀態(tài),也是OpenGL指令執(zhí)行基礎(chǔ)技扼。由于上下文是一個(gè)巨大的狀態(tài)機(jī)伍玖,為了減少開銷但是又能夠完成不同的繪制操作,所以在程序中創(chuàng)建多個(gè)不同的上下文剿吻,他們共同共享紋理窍箍,緩存區(qū)等資源。
    (自我記憶理解:上下文就好比我們搭建一個(gè)服務(wù)器網(wǎng)絡(luò)中的許多配置文件)

  • OpenGL 狀態(tài)機(jī):

    顧名思義就是描述一個(gè)對(duì)象在一個(gè)生命周期中經(jīng)歷過的各種狀態(tài)丽旅。

  • 渲染:

    將圖像/圖形數(shù)據(jù)轉(zhuǎn)換成3D空間圖像操作椰棘。

  • 頂點(diǎn)數(shù)組 (VertexArray)

    頂點(diǎn)指的是我們?cè)诶L制一個(gè)圖形時(shí),它的頂點(diǎn)位置數(shù)據(jù).而這個(gè)數(shù)據(jù)可以直接 存儲(chǔ)在數(shù)組中或者將其緩存到GPU內(nèi)存中

    畫圖一般是先畫好圖像的骨架,然后再往骨架里面填充顏色榄笙,這對(duì)于 OpenGL也是一樣的邪狞。頂點(diǎn)數(shù)據(jù)就是要畫的圖像的?骨架,和現(xiàn)實(shí)中不不同的 是办斑,OpenGL中的圖像都是由圖元組成外恕。在OpenGLES中杆逗,有3種類型的圖 元:點(diǎn)乡翅、線、三角形罪郊。那這些頂點(diǎn)數(shù)據(jù)最終是存儲(chǔ)在哪里的呢?開發(fā)者可 以選擇設(shè)定函數(shù)指針蠕蚜,在調(diào)用繪制方法的時(shí)候,直接由內(nèi)存?zhèn)魅腠旤c(diǎn)數(shù) 據(jù)悔橄,也就是說這部分?jǐn)?shù)據(jù)之前是存儲(chǔ)在內(nèi)存當(dāng)中的靶累,被稱為頂點(diǎn)數(shù)組。而性能更高的做法是癣疟,提前分配一塊顯存挣柬,將頂點(diǎn)數(shù)據(jù)預(yù)先傳入到顯存當(dāng) 中。這部分的顯存睛挚,就被稱為頂點(diǎn)緩沖區(qū)邪蛔。

  • 管線:

    在OpenGL下渲染圖形,就會(huì)經(jīng)歷一個(gè)一個(gè)節(jié)點(diǎn)扎狱。這樣的操作理解為管線侧到。就相當(dāng)于我們工作流水線一樣勃教。因?yàn)轱@卡處理數(shù)據(jù)的時(shí)候是按照一個(gè)固定的順序來完成的,這個(gè)順序是不能被打破的匠抗。

    • 固定管線 / 存儲(chǔ)著色器

      在早期的OpenGL 版本,它封裝了很多種著色器程序塊內(nèi)置的一段包含了光 照故源、坐標(biāo)變換、裁剪等諸多功能的固定shader程序來完成,來幫助開發(fā)者 來完成圖形的渲染. ?而開發(fā)者只需要傳?入相應(yīng)的參數(shù),就能快速完成圖形的 渲染汞贸。類似于我們熟悉的 iOS 開發(fā)會(huì)封裝很多API,?而我們只需要調(diào)用,就可以實(shí)現(xiàn)功能绳军。不 需要關(guān)注底層實(shí)現(xiàn)原理。

      但是OpenGL使用的場(chǎng)景豐富著蛙,固定管線/存儲(chǔ)著色器無法完成每一個(gè)業(yè)務(wù)删铃,所以后來將部分 開放成 可編程管線

  • 著色器程序 (Shader)

    就全面的將固定渲染管線架構(gòu)變?yōu)榱丝删幊啼秩竟芫€。因此踏堡,OpenGL在實(shí) 際調(diào)用繪制函數(shù)之前猎唁,還需要指定一個(gè)由shader編譯成的著?器程序。常 見的著色器主要有頂點(diǎn)著?器(VertexShader)顷蟆,片段著色器(FragmentShader)/像素著色器(PixelShader)诫隅,幾何著?(GeometryShader),曲面細(xì)分著?色器器(TessellationShader)帐偎。片段著?器和像素著?器只是在OpenGL和DX中的不同叫法?而已逐纬。
    可惜的是,直到 OpenGLES 3.0削樊,依然只支持了 “頂點(diǎn)著?器” 和 “片段著?器” 這兩個(gè)最基礎(chǔ)的著?器豁生。

    OpenGL在處理shader時(shí),和其他編譯器一樣漫贞。通過編譯甸箱、鏈接等步驟,?成了著色器程序(glProgram)迅脐,著?器程序同時(shí)包含了頂點(diǎn)著?器和?片段 著?器的運(yùn)算邏輯芍殖。在OpenGL進(jìn)行繪制的時(shí)候,首先由頂點(diǎn)著?器對(duì)傳入 的頂點(diǎn)數(shù)據(jù)進(jìn)行運(yùn)算谴蔑。再通過圖元裝配豌骏,將頂點(diǎn)轉(zhuǎn)換為圖元。然后進(jìn)行光柵化隐锭,將圖元這種?量圖形窃躲,轉(zhuǎn)換為柵格化數(shù)據(jù)。最后钦睡,將柵格化數(shù)據(jù)傳 ?片段著?器中進(jìn)?運(yùn)算蒂窒。?段著?器會(huì)對(duì)柵格化數(shù)據(jù)中的每?個(gè)像素進(jìn)行運(yùn)算,并決定像素的顏色

    • 頂點(diǎn)著色器 (VertexShader)

      一般?來處理圖形每個(gè)頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等)

      頂點(diǎn)著?器是OpenGL中用于計(jì)算頂點(diǎn)屬性的程序。頂點(diǎn)著?器是逐頂點(diǎn)運(yùn) 算的程序刘绣,也就是說每個(gè)頂點(diǎn)數(shù)據(jù)都會(huì)執(zhí)?行行一次頂點(diǎn)著?器樱溉,當(dāng)然這是并行的,并且頂點(diǎn)著?器運(yùn)算過程中無法訪問其他頂點(diǎn)的數(shù)據(jù)

      一般來說典型的需要計(jì)算的頂點(diǎn)屬性主要包括頂點(diǎn)坐標(biāo)變換纬凤、逐頂點(diǎn)光照 運(yùn)算等福贞。頂點(diǎn)坐標(biāo)由?身坐標(biāo)系轉(zhuǎn)換到歸一化坐標(biāo)系的運(yùn)算,就是在這里發(fā)生的

    • 片元著色器 (FragmentShader)

      一般用來處理圖形中每個(gè)像素點(diǎn)顏色計(jì)算和填充

      片段著?器是OpenGL中用于計(jì)算片段(像素)顏色的程序停士。?段著?器是 逐像素運(yùn)算的程序挖帘,也就是說每個(gè)像素都會(huì)執(zhí)?行行一次片段著色器,當(dāng)然也 是并行的

  • 光柵化 (Rasterization)

    是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為?元的過程恋技,具有將圖轉(zhuǎn)化為一個(gè)柵格組成的圖象 的作用拇舀,特點(diǎn)是每個(gè)元素對(duì)應(yīng)幀緩沖區(qū)中的一像素。

    光柵化就是把頂點(diǎn)數(shù)據(jù)轉(zhuǎn)換為片元的過程蜻底。片元中的每一個(gè)元素對(duì)應(yīng)于幀 緩沖區(qū)中的一個(gè)像素骄崩。

    光柵化其實(shí)是一種將幾何圖元變?yōu)槎S圖像的過程。該過程包含了兩部分 的工作薄辅。第一部分工作:決定窗?口坐標(biāo)中的哪些整型柵格區(qū)域被基本圖元 占用;第二部分工作:分配一個(gè)顏色值和一個(gè)深度值到各個(gè)區(qū)域要拂。光柵化過程產(chǎn)生的是片元

    把物體的數(shù)學(xué)描述以及與物體相關(guān)的顏色信息轉(zhuǎn)換為屏幕上用于對(duì)應(yīng)位置 的像素及?用于填充像素的顏色,這個(gè)過程稱為光柵化站楚,這是一個(gè)將模擬信 號(hào)轉(zhuǎn)化為離散信號(hào)的過程

  • 紋理:

    紋理可以理解為圖片. 大家在渲染圖形時(shí)需要在其編碼填充圖片,為了使得 場(chǎng)景更加逼真.?這里使?的圖片,就是常說的紋理.但是在OpenGL,我們更加 習(xí)慣叫紋理,不是圖片.

  • 混合(Blending)

    在測(cè)試階段之后脱惰,如果像素依然沒有被剔除,那么像素的顏色將會(huì)和幀緩 沖區(qū)中顏色附著上的顏色進(jìn)行混合窿春,混合的算法可以通過OpenGL的函數(shù)進(jìn) 行指定拉一。但是OpenGL提供的混合算法是有限的,如果需更加復(fù)雜的混合 算法旧乞,一般可以通過像素著?器進(jìn)行實(shí)現(xiàn)蔚润,當(dāng)然性能會(huì)比原?的混合算法差一些.

  • 變換矩陣

    圖像需要發(fā)生平移,縮放良蛮,旋轉(zhuǎn)變換時(shí)抽碌,需要使用變換矩陣

  • 投影矩陣

    將3D坐標(biāo)轉(zhuǎn)換成二維屏幕坐標(biāo)悍赢,實(shí)際線條也將在二維坐標(biāo)下繪制

  • 渲染上屏/交換緩沖區(qū)(SwapBuffer)

    渲染緩沖區(qū)一般映射的是系統(tǒng)的資源?比如窗口决瞳。如果將圖像直接渲染到窗口對(duì)應(yīng)的渲染緩沖區(qū),則可以 將圖像顯示到屏幕上左权。

    -但是皮胡,值得注意的是,如果每個(gè)窗口只有?個(gè)緩沖區(qū)赏迟,那么在繪制過程中屏幕進(jìn)?了刷新屡贺,窗口可能顯 示出不完整的圖像

    為了解決這個(gè)問題,常規(guī)的OpenGL程序至少都會(huì)有兩個(gè)緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū)甩栈,沒有 顯示的稱為離屏緩沖區(qū)泻仙。在一個(gè)緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換量没,實(shí)現(xiàn)圖像 在屏幕上的顯示玉转。

    由于顯示器器的刷新一般是逐行進(jìn)行的,因此為了防止交換緩沖區(qū)的時(shí)候屏幕上下區(qū)域的圖像分屬于兩個(gè) 不不同的幀殴蹄,因此交換一般會(huì)等待顯示器刷新完成的信號(hào)究抓,在顯示器兩次刷新的間隔中進(jìn)行交換,這個(gè)信號(hào)就被稱為垂直同步信號(hào)袭灯,這個(gè)技術(shù)被稱為垂直同步

    使?了雙緩沖區(qū)和垂直同步技術(shù)之后刺下,由于總是要等待緩沖區(qū)交換之后再進(jìn)?下?幀的渲染,使得幀率?法完全達(dá)到硬件允許的最高水平稽荧。為了解決這個(gè)問題橘茉,引入了三緩沖區(qū)技術(shù),在等待垂直同步時(shí)姨丈,來回交替渲染兩個(gè)離屏的緩沖區(qū)捺癞,?垂直同步發(fā)生時(shí),屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換构挤,實(shí)現(xiàn)充分利?硬件性能的目的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末髓介,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筋现,更是在濱河造成了極大的恐慌唐础,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矾飞,死亡現(xiàn)場(chǎng)離奇詭異一膨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洒沦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門豹绪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人申眼,你說我怎么就攤上這事瞒津。” “怎么了括尸?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵巷蚪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我濒翻,道長(zhǎng)屁柏,這世上最難降的妖魔是什么啦膜? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮淌喻,結(jié)果婚禮上僧家,老公的妹妹穿的比我還像新娘。我一直安慰自己裸删,他們只是感情好啸臀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烁落,像睡著了一般乘粒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伤塌,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天灯萍,我揣著相機(jī)與錄音,去河邊找鬼每聪。 笑死旦棉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的药薯。 我是一名探鬼主播绑洛,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼童本!你這毒婦竟也來了真屯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穷娱,失蹤者是張志新(化名)和其女友劉穎绑蔫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泵额,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡配深,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嫁盲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篓叶。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羞秤,靈堂內(nèi)的尸體忽然破棺而出缸托,到底是詐尸還是另有隱情,我是刑警寧澤锥腻,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布嗦董,位于F島的核電站母谎,受9級(jí)特大地震影響瘦黑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一幸斥、第九天 我趴在偏房一處隱蔽的房頂上張望匹摇。 院中可真熱鬧,春花似錦甲葬、人聲如沸廊勃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)坡垫。三九已至,卻和暖如春画侣,著一層夾襖步出監(jiān)牢的瞬間冰悠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工配乱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溉卓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓搬泥,卻偏偏與公主長(zhǎng)得像桑寨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忿檩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容