一步步學(xué)習(xí)計(jì)算機(jī)視覺 in IOS(一)計(jì)算機(jī)視覺基礎(chǔ)

計(jì)算機(jī)視覺,按字面上理解胆胰,就是計(jì)算機(jī)上用來處理人眼觀測的技術(shù)。對于IOS而言刻获,可以簡單理解為在屏幕上繪制的技術(shù)蜀涨。

對IOS App開發(fā)而言,在手機(jī)屏幕上展示的是一個(gè)個(gè)UIView将鸵,而大多數(shù)同學(xué)了解UIView的繪制是通過CALayer來完成的勉盅。我們平時(shí)使用的繪制API都是基于這套系統(tǒng)的。但是顶掉,對于硬件而言草娜,圖片實(shí)際上是通過GPU計(jì)算出渲染數(shù)據(jù),通過顯卡在屏幕上渲染像素痒筒。

對一般的App而言宰闰,CALayer提供的Api足以處理視覺上的需求,但是對游戲開發(fā)簿透,視頻開發(fā)而言移袍,手機(jī)屏幕上很少能展示規(guī)則的圖形,而且其UI變化率遠(yuǎn)高于普通App老充。這時(shí)我們就需要操作底層繪制組件來進(jìn)行自己的繪制葡盗。

OpenGL, OpenGL ES, Metal

OpenGL(Open Graphics Library)是一個(gè)跨編程語言、跨平臺的編程圖形程序接口啡浊,它將計(jì)算機(jī)的資源抽象稱為一個(gè)個(gè)OpenGL的對象觅够,對這些資源的操作抽象為一個(gè)個(gè)的OpenGL指令。

OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三維圖形 API 的子集巷嚣,針對手機(jī)喘先、PDA和游戲主機(jī)等嵌入式設(shè)備而設(shè)計(jì),去除了許多不必要和性能較低的API接口廷粒。

Metal 是一個(gè)是蘋果出品類似的面向底層的圖形編程接口窘拯,可以直接操作GPU;支持iOS和OS X坝茎,提供圖形渲染和通用計(jì)算能力涤姊。蘋果在ios 13上已經(jīng)不再提供OpenGL ESKit,使用Metal來替換嗤放。

OpenGL

上下文(Context)

上下文Context在Android思喊,UIGraphicsRenderer上都有應(yīng)用,其意義是指執(zhí)行代碼的容器斤吐。對OpenGL而言搔涝,Context是指一個(gè)OpenGL狀態(tài)機(jī)厨喂,在執(zhí)行渲染、變換等視覺操作之前庄呈,需要先初始化這個(gè)容器狀態(tài)機(jī)蜕煌。這里要注意的是,OpenGL Context十分復(fù)雜诬留,像UIGraphicsRenderer那樣斜纪,每次繪制圖片創(chuàng)建一個(gè)上下文不太合適,在實(shí)際應(yīng)用中文兑,系統(tǒng)可能在啟動時(shí)初始化許多Context備用盒刚。

渲染管線

渲染管線也稱為渲染流水線或像素流水線或像素管線,顯示芯片內(nèi)部處理圖形信號相互獨(dú)立的的并行處理單元绿贞。在實(shí)際應(yīng)用中因块,渲染管線大致可以理解為渲染的步驟:

image.png

首先,我們以數(shù)組的形式傳遞3個(gè)3D坐標(biāo)作為圖形渲染管線的輸入籍铁,用來表示一個(gè)三角形涡上,這個(gè)數(shù)組叫做頂點(diǎn)數(shù)據(jù)(Vertex Data);頂點(diǎn)數(shù)據(jù)是一系列頂點(diǎn)的集合拒名。
當(dāng)其存儲在內(nèi)存時(shí)吩愧,稱為頂點(diǎn)數(shù)組;而其存儲在顯存時(shí)增显,則稱為頂點(diǎn)緩存
一個(gè)頂點(diǎn)(Vertex)是一個(gè)3D坐標(biāo)的數(shù)據(jù)的集合雁佳。而頂點(diǎn)數(shù)據(jù)是用頂點(diǎn)屬性(Vertex Attribute)表示的,它可以包含任何我們想用的數(shù)據(jù)同云,但是簡單起見糖权,我們還是假定每個(gè)頂點(diǎn)只由一個(gè)3D位置(譯注1)和一些顏色值組成的吧。

1梢杭,頂點(diǎn)著色器

它把一個(gè)單獨(dú)的頂點(diǎn)作為輸入温兼。頂點(diǎn)著色器主要的目的是把3D坐標(biāo)轉(zhuǎn)為另一種3D坐標(biāo)(后面會解釋)秸滴,同時(shí)頂點(diǎn)著色器允許我們對頂點(diǎn)屬性進(jìn)行一些基本處理武契。

2,圖元裝配階段

將頂點(diǎn)著色器輸出的所有頂點(diǎn)作為輸入(如果是GL_POINTS荡含,那么就是一個(gè)頂點(diǎn))咒唆,并所有的點(diǎn)裝配成指定圖元的形狀;

3释液,幾何著色器

圖元裝配階段的輸出會傳遞給幾何著色器(Geometry Shader)全释。幾何著色器把圖元形式的一系列頂點(diǎn)的集合作為輸入,它可以通過產(chǎn)生新頂點(diǎn)構(gòu)造出新的(或是其它的)圖元來生成其他形狀误债。

4浸船,光柵化階段

幾何著色器的輸出會被傳入光柵化階段(Rasterization Stage)妄迁,這里它會把圖元映射為最終屏幕上相應(yīng)的像素,生成供片段著色器(Fragment Shader)使用的片段(Fragment)李命。在片段著色器運(yùn)行之前會執(zhí)行裁切(Clipping)登淘。裁切會丟棄超出你的視圖以外的所有像素,用來提升執(zhí)行效率封字。

5黔州,片段著色器

片段著色器的主要目的是計(jì)算一個(gè)像素的最終顏色,這也是所有OpenGL高級效果產(chǎn)生的地方阔籽。通常流妻,片段著色器包含3D場景的數(shù)據(jù)(比如光照、陰影笆制、光的顏色等等)绅这,這些數(shù)據(jù)可以被用來計(jì)算最終像素的顏色。

6在辆,測試與混合

在所有對應(yīng)顏色值確定以后君躺,最終的對象將會被傳到最后一個(gè)階段,我們叫做Alpha測試和混合(Blending)階段开缎。這個(gè)階段檢測片段的對應(yīng)的深度(和模板(Stencil))值(后面會講)棕叫,用它們來判斷這個(gè)像素是其它物體的前面還是后面,決定是否應(yīng)該丟棄奕删。這個(gè)階段也會檢查alpha值(alpha值定義了一個(gè)物體的透明度)并對物體進(jìn)行混合(Blend)俺泣。所以,即使在片段著色器中計(jì)算出來了一個(gè)像素輸出的顏色完残,在渲染多個(gè)三角形的時(shí)候最后的像素顏色也可能完全不同伏钠。

固定管線與可編程管線

固定管線,也可稱為可配置管線谨设,其中的繪制渲染的算法不可配置熟掂,只能根據(jù)提供的Api進(jìn)行配置。
可編程管線中扎拣,渲染算法是由傳入的著色器程序shader來決定的赴肚。

著色器程序shader

Shader其實(shí)就是一段代碼,這段代碼的作用是告訴GPU具體怎樣去繪制模型的每一個(gè)頂點(diǎn)的顏色以及最終每一個(gè)像素點(diǎn)的顏色二蓝。
Shader是一段代碼誉券,那必然要用一種語言來書寫它,目前主流的有三種語言:
1)基于OpenGL的OpenGL Shading Language刊愚,簡稱GLSL踊跟。
2)基于DirectX的High Level Shading Language,簡稱HLSL。
3)基于C的C for Graphic鸥诽,簡稱Cg語言
根據(jù)上面中提到的著色器流程商玫,Shader有以下幾種:
1)頂點(diǎn)著色器
圖形有幾個(gè)頂點(diǎn)執(zhí)行有幾次箕憾,用于處理理圖形每個(gè)頂點(diǎn)變換(旋轉(zhuǎn)/平移/投影等),坐標(biāo)系變換拳昌。
2)幾何著色器
幾何著色器能夠產(chǎn)生0個(gè)以上的基礎(chǔ)圖元厕九,它能起到一定的裁剪作用、同時(shí)也能產(chǎn)生比頂點(diǎn)著色器輸入更多的基礎(chǔ)圖元地回。
3)(像素)片段著色器
用于繪制圖形中每一個(gè)像素點(diǎn)扁远。

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

幀緩沖區(qū)(顯存):是由像素組成的二維數(shù)組,每一個(gè)存儲單元對應(yīng)屏幕上的一個(gè)像素刻像,整個(gè)幀緩沖對應(yīng)一幀圖像即當(dāng)前屏幕畫面畅买。

值得注意的是,如果每個(gè)窗?口只有?一個(gè)緩沖區(qū)细睡,那么在繪制過程中屏幕進(jìn)?行行了了刷新谷羞,窗?口可能顯 示出不不完整的圖像。因此引入了交換緩沖區(qū)溜徙。

常規(guī)的OpenGL程序?至少都會有兩個(gè)緩沖區(qū)湃缎。顯示在屏幕上的稱為屏幕緩沖區(qū),沒有顯示的稱為離屏緩沖區(qū)蠢壹。在一個(gè)緩沖區(qū)渲染完成之后嗓违,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換,實(shí)現(xiàn)圖像 在屏幕上的顯示图贸。交換一般會等待顯示器器刷新完成的信號蹂季,在顯示器器兩次刷新的間隔中進(jìn)?行行交換,這個(gè)信 號就被稱為垂直同步信號疏日,這個(gè)技術(shù)被稱為垂直同步偿洁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市沟优,隨后出現(xiàn)的幾起案子涕滋,更是在濱河造成了極大的恐慌,老刑警劉巖挠阁,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宾肺,死亡現(xiàn)場離奇詭異,居然都是意外死亡鹃唯,警方通過查閱死者的電腦和手機(jī)爱榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瓣喊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坡慌,“玉大人,你說我怎么就攤上這事藻三『殚伲” “怎么了跪者?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熄求。 經(jīng)常有香客問我渣玲,道長,這世上最難降的妖魔是什么弟晚? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任忘衍,我火速辦了婚禮,結(jié)果婚禮上卿城,老公的妹妹穿的比我還像新娘枚钓。我一直安慰自己,他們只是感情好瑟押,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布搀捷。 她就那樣靜靜地躺著,像睡著了一般多望。 火紅的嫁衣襯著肌膚如雪嫩舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天怀偷,我揣著相機(jī)與錄音家厌,去河邊找鬼。 笑死椎工,一個(gè)胖子當(dāng)著我的面吹牛像街,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播晋渺,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镰绎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了木西?” 一聲冷哼從身側(cè)響起畴栖,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎八千,沒想到半個(gè)月后吗讶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恋捆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年照皆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沸停。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膜毁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘟滨,我是刑警寧澤候醒,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站杂瘸,受9級特大地震影響倒淫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜败玉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一敌土、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧运翼,春花似錦纯赎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至六剥,卻和暖如春晚顷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疗疟。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工该默, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人策彤。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓栓袖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親店诗。 傳聞我的和親對象是個(gè)殘疾皇子裹刮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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