GPUImage源碼解析 -- 框架概覽

在上一篇文章中,主要介紹了OpenGL ES基礎(chǔ)桥嗤,了解了OpenGL ES的基礎(chǔ)之后须妻,我們就可以開始學(xué)習(xí)GPUImage的源碼了。本文將主要介紹GPUImage的整體框架泛领,渲染的流程以及幾個重要的類和協(xié)議荒吏。


輸入和輸出

任何一個框架或者程序的出發(fā)點都是輸入和輸出,GPUImage中最重要的也是這兩個元素渊鞋。在框架層面上說绰更,輸入應(yīng)該是一張圖片,一個視頻锡宋,一個UI元素或者一個數(shù)據(jù)流儡湾。而輸出也同樣應(yīng)該是一個處理完成了的圖片,視頻或者數(shù)據(jù)流执俩。

在GPUImage內(nèi)部的實現(xiàn)中徐钠,主要的實現(xiàn)思想也是將一個圖片的內(nèi)容放置到frameBuffer中,然后將這個frameBuffer在濾鏡鏈中進(jìn)行傳遞役首,并且處理尝丐。因此,每一個濾鏡既可以作為一個輸入(GPUImageInput)宋税,也可以作為一個輸出(GPUImageOutput)存在摊崭。

GPUImageInput

GPUImageInput是一個Protocol,實現(xiàn)這個Protocol的類需要實現(xiàn)的方法主要都是接收上一個GPUImageOutput的frameBuffer相關(guān)的方法杰赛,以及處理當(dāng)上一個GPUImageOutput處理完一幀之后收到的通知呢簸。實現(xiàn)了GPUImageInput接口的類包括了所有的Filter,F(xiàn)ilterGroup,GPUImageView根时,GPUImageMovieWriter瘦赫。因為它們都需要獲取之前一個Output處理得到的結(jié)果,從而進(jìn)行渲染蛤迎。

GPUImageOutput

GPUImageOutput是一個基類确虱,實現(xiàn)了一些基本方法,比如通用的將下一個GPUImageInput添加到FilterChain中的方法替裆。同時在每一個GPUImageOutput中校辩,都需要維護(hù)一個GPUImageFrameBuffer,這個就是Output真正的輸出辆童。GPUImageOutput還提供了從當(dāng)前的FrameBuffer中獲取圖片的一系列方法宜咒。常用的GPUImageOutput的子類有:所有的Filter,F(xiàn)ilterGroup把鉴,GPUImagePicture故黑,GPUImageMovie,GPUImageUIElement等等庭砍。

每一個GPUImageOutput對象通過調(diào)用addTarget:atTextureLocation:方法场晶,將自己的輸出frameBuffer以及相關(guān)的信息告訴FilterChain中的下一個Input;

因此怠缸,每一個FilterChain的第一個元素都是GPUImageOutput的子類诗轻,比如GPUImagePicture,GPUImageMovie等等凯旭。這個和我們上面說的輸入和輸出并不沖突概耻,因為任何一個圖像處理的最初的一個元素,必須要能夠生成并且產(chǎn)出一個FrameBuffer罐呼,才能夠給后面的濾鏡使用。

而最終用于顯示的GPUImageView則是一個GPUImageInput侦高,因為它只需要接收處理完的圖片進(jìn)行顯示嫉柴,而不需要將結(jié)果繼續(xù)傳遞給其他的Input。

GPUImageFrameBuffer

GPUImageFrameBuffer提供了在GPUImageOutput和GPUImageInput進(jìn)行數(shù)據(jù)傳遞的媒介奉呛。每個GPUImageFrameBuffer都有一個自己的OpenGL Texture计螺,這個Texture作為下一個Input的Texel來源。多數(shù)的GPUImageFrameBuffer包含一個OpenGL FrameBuffer瞧壮,這個FrameBuffer用來離屏渲染登馒,并且將渲染的結(jié)果放置到Texture中。每個GPUImageOutput都包含了至少一個GPUImageFrameBuffer對象咆槽,而每個GPUImageInput都實現(xiàn)了一個setInputFramebuffer:atIndex:方法陈轿,來接收上一個Output處理完的紋理。

GPUImageFilter

GPUImageFilter是一個GPUImageOutput的子類,同時實現(xiàn)了GPUImageInput協(xié)議麦射。是整個GPUImage框架的核心蛾娶。GPUImage除了實現(xiàn)了Input和Output的功能之外,還實現(xiàn)了基本的渲染功能潜秋。因此蛔琅,每個GPUImageFilter都包含了一個GLProgram的對象,這個對象實現(xiàn)了OpenGL ES相關(guān)的渲染峻呛。

GLProgram

GLProgram是對OpenGL ES的program的面向?qū)ο蠓庋b罗售,包括了Vertex Shader,F(xiàn)ragmentShader的加載钩述,program的link以及對attribute和uniform的獲取和管理寨躁。由于GPUImage處理的對象主要是2D的圖片,因此切距,作者將一些常用的Attributes以及Uniform做了固定的命名規(guī)范處理朽缎,從而實現(xiàn)了簡單的面向?qū)ο蠓庋b。


渲染過程

根據(jù)上面的介紹谜悟,我們可以總結(jié)出GPUImage總體的渲染流程话肖;

1. 首先我們需要創(chuàng)建一個GPUImageOutput,作為需要被處理的對象來源葡幸,常用的有:

GPUImagePicture:使用圖片作為處理對象最筒;

GPUImageMovie:使用視頻作為處理對象;

GPUImageUIElement:使用UIElement作為處理對象蔚叨;

GPUImageVideoCamera: 使用相機(jī)捕捉到的圖像作為處理對象床蜘;

2. 有了處理的對象之后,我們需要根據(jù)我們的需求蔑水,創(chuàng)建不同種類的Filter邢锯,并且通過GPUImageOutput的addTarget:atTextureLocation:方法,將這些Filter添加到FilterChain中搀别;

3. 如果我們需要顯示處理完的結(jié)果或者保存這個結(jié)果的話丹擎,我們還需要將處理完的結(jié)果輸出到一個GPUImageInput中。常用的有:

GPUImageView:將處理結(jié)果顯示到一個View上歇父,這個View可以實時顯示處理的結(jié)果蒂培;

GPUImageMovieWriter:將處理的結(jié)果保存到一個視頻文件中;

圖片:如果最終沒有一個顯示的Target榜苫,我們也可以通過GPUImageOutput中的一系列newCGImageFromFrameBuffer方法护戳,直接獲取到當(dāng)前GPUImageOutput處理的結(jié)果。

4. 調(diào)用第一步素材的開始處理方法垂睬,讓處理過程開始:

[picture processImage];

[movie startProcessing];

[element update];

[camera startCapture];

到這里媳荒,整個GPUImage渲染的流程就結(jié)束了抗悍,就可以坐等輸出的結(jié)果啦。當(dāng)然本文只是介紹了GPUImage的整個渲染流程肺樟,具體的每一個元素會在之后的具體解析中再詳細(xì)介紹檐春。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市么伯,隨后出現(xiàn)的幾起案子疟暖,更是在濱河造成了極大的恐慌,老刑警劉巖田柔,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俐巴,死亡現(xiàn)場離奇詭異,居然都是意外死亡硬爆,警方通過查閱死者的電腦和手機(jī)欣舵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀磕,“玉大人缘圈,你說我怎么就攤上這事⊥嗖希” “怎么了糟把?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長牲剃。 經(jīng)常有香客問我遣疯,道長,這世上最難降的妖魔是什么凿傅? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任缠犀,我火速辦了婚禮,結(jié)果婚禮上聪舒,老公的妹妹穿的比我還像新娘辨液。我一直安慰自己,他們只是感情好箱残,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布室梅。 她就那樣靜靜地躺著,像睡著了一般疚宇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赏殃,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天敷待,我揣著相機(jī)與錄音,去河邊找鬼仁热。 笑死榜揖,一個胖子當(dāng)著我的面吹牛勾哩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播举哟,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼思劳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妨猩?” 一聲冷哼從身側(cè)響起潜叛,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壶硅,沒想到半個月后威兜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡庐椒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年椒舵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片约谈。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡笔宿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棱诱,到底是詐尸還是另有隱情泼橘,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布军俊,位于F島的核電站侥加,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粪躬。R本人自食惡果不足惜担败,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望镰官。 院中可真熱鬧提前,春花似錦、人聲如沸泳唠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笨腥。三九已至拓哺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脖母,已是汗流浹背士鸥。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留谆级,地道東北人烤礁。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓讼积,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脚仔。 傳聞我的和親對象是個殘疾皇子勤众,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

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