? ? 簡述: 最近一直看一些公司的招聘要求,例如BTA等一線大廠,他們絕大多數(shù)都會對音視頻有要求,而想要精通音視頻就必須直到OpenGL等相關知識,所以筆者從今天開始,會按照OpenGL/OpenGL ES/Metal 的學習順序連載相關知識,一點一滴的滲透進去,記錄自己的學習過程,想學習到視覺開發(fā)的小伙伴可以點個小星星哦,我們一起學習.篇幅比較長,堅持就是勝利!
????首先本片文章作為開山之作,當然要先了解一下OpenGL有哪些經(jīng)常用到的專業(yè)名字啦,不然我們后續(xù)提到的技術名詞會很陌生,這里我們先從OpenGL說起.
?圖形API簡介
????1.OpenGL(Open Graphics Library)是一個跨平臺,跨編程語言的圖像編程API,它將算機的資源抽象稱為一個個OpenGL的對象逼争,對這些資源的操作抽象為一個個的OpenGL指令.(這里解釋一下為什么可以跨平臺,簡單來說OpenGL 是直接操控GPU的不需要跟其它打交道)
????2.OpenGL ES?(OpenGL for Embedded Systems)是?OpenGL?三維圖形?API?的?子集,針對?手機姓言、?PDA和游戲主機等嵌?入式設備?而設計邓萨,去除了了許多不不必要和性能較低的API接?口。
????3.Metal :?Metal: Apple為游戲開發(fā)者推出了了新的平臺技術?Metal锨天,該技術能夠為?3D?圖 像提?高?10?倍的渲染性能.Metal?是Apple為了了解決3D渲染?而推出的框架(這是我們iOSer學習的重點,因為他是專門為蘋果而生的,也是最難得一個,但是不要怕,難啃的骨頭吃下去,我們才有成就感嘛)
????那我們學習了這些API可以干什么呢,我相信這是許多同學最關心的話題,可以這么說,OpenGL /OpenGL ES/ Metal?在任何項?目中解決問題的本質(zhì) 就是利用GPU芯?來?效渲染圖形圖像.圖形API?是iOS開發(fā)者唯?接近GPU的?方式,可以這么說音視頻,手機屏幕顯示離不開這些東西!
OpenGL?專業(yè)名詞解析
OpenGL?狀態(tài)機:
????狀態(tài)機是理理論上的?種機器.這個?常難以理解.所以我們把這個狀態(tài)機這么理解.狀態(tài)機描述了了?個對象在其?命周期內(nèi)所經(jīng)歷的各種狀態(tài)毯盈,狀態(tài)間的轉(zhuǎn)變,發(fā)?轉(zhuǎn)變的動因病袄,條件及轉(zhuǎn)變中所執(zhí)?行的活動搂赋。或者說益缠,狀態(tài)機是 ?種行行為脑奠,說明對象在其?命周期中響應事件所經(jīng)歷的狀態(tài)序列以及對那些狀態(tài)事件的響應。因此具有以下特點:
1.有記憶功能,能記住當前的狀
2.可以接收輸入幅慌,根據(jù)輸入的內(nèi)容和?己的原先狀態(tài)宋欺,修改?己當前狀 態(tài),并且可以有對應輸出
3.當進?特殊狀態(tài)(停機狀態(tài))的時候胰伍,便不再接收輸?齿诞,停?工作
說的是什么啊,太難懂了,好的我翻譯下
1.OpenGL可以記錄?自?己的狀態(tài)(如當前所使?用的顏?色、是否開啟了了混和功能等)
2.OpenGL可以接收輸入(當調(diào)用OpenGL函數(shù)的時候骂租,實際上可以看成?OpenGL在接收我們的輸入)祷杈,如我們調(diào)用glColor3f,則OpenGL接收到 這個輸入后會修改?己的“當前顏?”這個狀態(tài)
3.OpenGL可以進?停止狀態(tài)渗饮,不再接收輸?吠式。在程序退出前,OpenGL總 會先停?工作的
渲染:將圖形/圖像數(shù)據(jù)轉(zhuǎn)換成3D空間圖像操作叫做渲染(Rendering).
頂點數(shù)組(VertexArray)和頂點緩沖區(qū)(VertexBuffer)
????頂點指的是我們在繪制?個圖形時,它的頂點位置數(shù)據(jù).?這個數(shù)據(jù)可以直接存儲在數(shù)組中或者將其緩存到GPU內(nèi)存中
?????畫圖?般是先畫好圖像的?骨架抽米,然后再往?架里面填充顏色特占,這對于?OpenGL也是?樣的。頂點數(shù)據(jù)就是要畫的圖像的?架云茸,和現(xiàn)實中不不同的 是是目,OpenGL中的圖像都是由圖元組成。在OpenGLES中标捺,有3種類型的圖元:點懊纳、線、三?角形亡容。那這些頂點數(shù)據(jù)最終是存儲在哪里的呢?開發(fā)者可以選擇設定函數(shù)指針嗤疯,在調(diào)?繪制?的時候,直接由內(nèi)存?zhèn)?入頂點數(shù)據(jù),也就是說這部分數(shù)據(jù)之前是存儲在內(nèi)存當中的闺兢,被稱為頂點數(shù)組茂缚。?性能更高的做法是,提前分配?塊顯存,將頂點數(shù)據(jù)預先傳?到顯存當 中脚囊。這部分的顯存龟糕,就被稱為頂點緩沖區(qū)
? ??管線:在OpenGL?下渲染圖形,就會有經(jīng)歷一個一個節(jié)點.?這樣的操作可以理解為管線.?家可以想象成流?線.每個任務類似流水線般執(zhí)行.任務之間有先后順序.?管線是一個抽象的概念,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照 ?個固定的順序來的悔耘,?且嚴格按照這個順序讲岁。就想富士康的工作流水線,步驟是不能亂的! (總結(jié):這是一個面向過程,管線== 工廠生產(chǎn)線一個個步驟)
固定管線/存儲著?色器器
????在早期的OpenGL?版本,它封裝了了很多種著色器程序塊內(nèi)置的?段包含了了光 照、坐標變換衬以、裁剪等諸多功能的固定shader程序來完成,來幫助開發(fā)者 來完成圖形的渲染.??開發(fā)者只需要傳?相應的參數(shù),就能快速完成圖形的 渲染.?類似于iOS開發(fā)會封裝很多API,?我們只需要調(diào)用,就可以實現(xiàn)功能.不需要關注底層實現(xiàn)原理(固定管線開放接口少就導致可自定義部門少,從而在圖形處理上有局限性,所以現(xiàn)在已經(jīng)淘汰了)
????但是由于OpenGL?的使?場景很豐富,固定管線或存儲著?色器器無法完成每? 個業(yè)務.這時將相關部分開放成可編程
著?器程序Shader
????常用的著色器主要有頂點著色器(VertexShader)缓艳,?元著色器 (FragmentShader),我們后續(xù)學習的內(nèi)容離不開這兩個東西,是我們學習的重點.
我們先了解一下這兩個著色器是用來干嘛的:
????頂點著色器(VertexShader)?般?用來處理理圖形每個頂點變換(旋轉(zhuǎn)/平移/投影等,例如一個支架,頂點著色器就是它的支撐點,他的支撐點移動的話,整個支架也就自然而然的跟著移動了)
????頂點著?器是OpenGL中?于計算頂點屬性的程序。頂點著色器是逐頂點運 算的程序看峻,也就是說每個頂點數(shù)據(jù)都會執(zhí)?一次頂點著?器郎任,當然這是并?的,并且頂點著?器運算過程中不能訪問其他頂點的數(shù)據(jù).
?????元著色器 (FragmentShader)一般?來處理圖形中每個像素點顏色計算和填充
?????元著?器是OpenGL中?于計算?段(像素)顏色的程序备籽。?元著色器是 逐像素運算的程序,也就是說每個像素都會執(zhí)行一次?元著?器分井,當然也 是并?的.這個很容易理解,意思就是假如一張1024x1024寬高的圖片,那么它將會執(zhí)行10124x1024次片元著色器程序!(是不是很多啊!這么龐大的計算是誰來做的呢?我們后續(xù)會提到).
光柵化Rasterization/紋理
????這兩個詞語相信在我們的日常開發(fā)中也接觸過不少,他們具體是什么?做了什么東西?在圖像渲染中對自己定位是什么?下面我們先了解下光柵化: