如果要新學習一門新的技術盲再,我們就要知道這門技術中我們要用到什么東西,就像學吃飯時我們要知道筷子棍鳖、碗炮叶、勺子..等等這些東西是什么,用來干什么的一樣渡处。那我們想要學習OpenGL镜悉,我們就要知道它里面有些什么東西,什么時候用到医瘫,用來做什么侣肄。下面我們就從OpenGLg各種專業(yè)名詞開始..
1.圖形API
OpenGL(Open Graphics Library)是?個跨編程語?言、跨平臺的編程圖形程序接?口醇份,它將計算機的資源抽象稱為?個OpenGL的對象稼锅,對這些資源的操作抽象為?個的OpenGL指令叮喳。
OpenGL ES(OpenGL for Embedded Systems)是OpenGL三維圖形 API 的?子集,針對?手機缰贝、 PDA和游戲主機等嵌?入式設備?而設計馍悟,去除了了許多不不必要和性能較低的API接?口。
DirectX是由很多API組成的剩晴,DirectX并不不是?個單純的圖形API. 最重要的是DirectX是屬于 Windows上?個多媒體處理理API锣咒。并不支持Windows以外的平臺,所以不是跨平臺框架赞弥, 按照性 質(zhì)分類毅整,可以分為四?大部分,顯示部分绽左、聲?音部分悼嫉、輸?入部分和?網(wǎng)絡部分。
Metal: Apple為游戲開發(fā)者推出了了新的平臺技術Metal拼窥,該技術能夠為 3D 圖像提?高 10 倍的渲染性能戏蔑。Metal是Apple為了了解決3D渲染?而推出的框架。
圖形API?的是解決什么問題:
?如在游戲開發(fā)中,對于游戲場景/游戲?物的渲染
?如在?視頻開發(fā)中,對于視頻解碼后的數(shù)據(jù)渲染
?如在地圖引擎,對于地圖上的數(shù)據(jù)渲染
?如在動畫中,實現(xiàn)動畫的繪制
?如在視頻處理中,對于視頻加上濾鏡效果
OpenGL/OpenGLES/Metal在任何項?中解決問題的本質(zhì)就是利?GPU芯?來?效渲染圖形圖像鲁纠,圖形API是iOS開發(fā)者唯?接近GPU的?式总棵。
2.OpenGL狀態(tài)機
狀態(tài)機可以理解為一臺可以保存狀態(tài),并根據(jù)當前狀態(tài)進行相應輸出的機器改含。
狀態(tài)機的概念很抽象情龄,它具有以下的特點:
記憶功能,保存當前狀態(tài)
接收輸入捍壤,修改當前狀態(tài)骤视,或根據(jù)當前狀態(tài)進行輸出
當進?特殊狀態(tài)(停機狀態(tài))時,不再接收輸?鹃觉,停?工作
3. OpenGL上下文(context)
在應?程序調(diào)?任何OpenGL的指令之前专酗,首先需要創(chuàng)建?個OpenGL的上下?文。這個上下?是?個?常龐?的狀態(tài)機帜慢,保存了了OpenGL中的各種狀態(tài)笼裳,這也是OpenGL指令執(zhí)?的基礎。
OpenGL的函數(shù)不管在哪個語?中粱玲,都是類似C語?一樣的面向過程的函數(shù)躬柬。本質(zhì)上都是對OpenGL上下?這個龐?的狀態(tài)機中的某個狀態(tài)或者對象進行操作。通過對OpenGL指令的封裝抽减,可以將OpenGL的相關調(diào)?封裝成為?個?向對象的圖形API允青。
由于OpenGL上下?是?個巨?大的狀態(tài)機,切換上下文往往會產(chǎn)生較?的開銷卵沉,但是不同的繪制模塊颠锉,可能需要使?完全獨立的狀態(tài)管理法牲。因此,可以在應?程序中分別創(chuàng)建多個不同的上下文琼掠,在不同線程中使?不同的上下文拒垃,上下?之間共享紋理、緩沖區(qū)等資源瓷蛙。這樣的?方案悼瓮,會?比反復切換上下?,或者?量修改渲染狀態(tài)艰猬,更加合理高效横堡。
總結:
OpenGL指令執(zhí)?的基礎,是?個?常龐?的狀態(tài)機冠桃。
OpenGL上下文切換開銷大命贴。雖然可能使用多個上下文,但上下文之間會共享紋理食听、緩沖區(qū)等資源胸蛛。
OpenGL的函數(shù)雖然是面向過程的,但可以把相關的調(diào)用封裝為面向過程的圖形API碳蛋。
4. 渲染
將圖形/圖像數(shù)據(jù)轉換成3D空間圖像操作叫做渲染(Rendering)胚泌。
5. 頂點數(shù)組和頂點緩沖區(qū)
頂點數(shù)據(jù)就是圖像的輪廓。OpenGL中的圖像都是由圖元組成肃弟。在OpenGL ES中,有3種類型的圖元:點零蓉、線笤受、三?形。
在調(diào)?繪制?法的時候敌蜂,直接由內(nèi)存?zhèn)魅腠旤c數(shù)據(jù)箩兽,也就是說這部分數(shù)據(jù)之前是存儲在內(nèi)存當中的,被稱為頂點數(shù)組(VertexArray)章喉。
?性能更高的做法是汗贫,提前分配?塊顯存,將頂點數(shù)據(jù)預先傳?到顯存當中秸脱。這部分的顯存落包,就被稱為頂點緩沖區(qū)(VertexBuffer)。
總結:
3種類型的圖元:點摊唇、線咐蝇、三?形。
頂點數(shù)組(VertexArray)在內(nèi)存中巷查。
頂點緩沖區(qū)(VertexBuffer)在緩存中有序。
著?器渲染過程
在渲染過程中抹腿,必須存儲2種著?器,分別是頂點著?器旭寿、?元著?器警绩。頂點著?器是第?個著?器、?元著?器是最后?個盅称。頂點著?器中處理頂點房蝉、?元著?器處理像素點顏?。
6. 管線
在OpenGL下渲染圖形微渠,就會經(jīng)歷?個?個的節(jié)點搭幻。而這樣的操作可以理理解管線。就像一個流?線逞盆,任務按照先后順序依次執(zhí)行檀蹋。管線是?個抽象的概念,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照一個固定的順序來的云芦,而且嚴格按照這個順序俯逾。
7. 固定管線/存儲著色器
在早期的OpenGL版本,封裝了多種著色器程序塊舅逸,內(nèi)置了一段包含了光照桌肴、坐標變換、裁剪等諸多功能的固定shader程序來完成琉历。來幫助開發(fā)者來完成圖形的渲染坠七。開發(fā)者只需要傳入相應的參數(shù),就能快速完成圖形的渲染旗笔。類似于iOS開發(fā)會封裝很多API彪置,而我們只需要調(diào)?,就可以實現(xiàn)功能蝇恶,不需要關注底層實現(xiàn)原理拳魁。
但是由于OpenGL的使?場景?常豐富,固定管線或存儲著?器?法完成每一個業(yè)務撮弧,這時將相關部分開放成可編程潘懊。
8. 著?器程序(Shader)
將固定渲染管線架構變?yōu)榱丝删幊啼秩竟芫€。
OpenGL在實際調(diào)?繪制函數(shù)之前贿衍,還需要指定?個由shader編譯成的著色器程序授舟。常見的著?器主要有頂點著?器(VertexShader),?段著?器(FragmentShader)/像素著?器(PixelShader)舌厨,幾何著?(GeometryShader)岂却,曲?細分著?器(TessellationShader)。片段著?器和像素著?器只是在OpenGL和DX中的不同叫法而已□锪ǎ可惜的是署浩,直到OpenGL ES 3.0,OpenGL ES依然只?持頂點著?器和片段著?器這兩個最基礎的著?器扫尺。
OpenGL在處理理shader時筋栋,和其他編譯器一樣。通過編譯正驻、鏈接等步驟弊攘,?成了著?器程序(glProgram),著?器程序同時包含了頂點著?器和?段著?器的運算邏輯姑曙。在OpenGL進行繪制的時候襟交,?先由頂點著?器對傳?的頂點數(shù)據(jù)進?運算。再通過圖元裝配伤靠,將頂點轉換為圖元捣域。然后進?光柵化,將圖元這種?量圖形宴合,轉換為柵格化數(shù)據(jù)焕梅。最后,將柵格化數(shù)據(jù)傳入?段著?器中進?運算卦洽。?段著?器會對柵格化數(shù)據(jù)中的每一個像素進行運算贞言,并決定像素的顏?。
總結:
將固定渲染管線架構變?yōu)榱丝删幊啼秩竟芫€阀蒂。
常見的著?器主要有頂點著?器该窗,?段著?器/像素著?器,幾何著?脂新,曲?細分著?器挪捕。
OpenGL ES只?持頂點著?器和片段著?器。
OpenGL通過編譯争便、鏈接等步驟,將?成著?器程序断医。
在OpenGL進行繪制的時候滞乙,由頂點著?器對傳?的頂點數(shù)據(jù)進?運算。再通過圖元裝配鉴嗤,將頂點轉換為圖元斩启。之后進?光柵化,將圖元這種?量圖形醉锅,轉換為柵格化數(shù)據(jù)兔簇。最后,將柵格化數(shù)據(jù)傳入?段著?器中進?運算。?段著?器會對柵格化數(shù)據(jù)中的每一個像素進行運算垄琐,并決定像素的顏?边酒。
8.1 頂點著?器(VertexShader)
頂點著?器是OpenGL中?于計算頂點屬性的程序。
?般來說典型的需要計算的頂點屬性主要包括頂點坐標變換狸窘、逐頂點光照運算等等墩朦。頂點坐標由?身坐標系轉換到歸一化坐標系的運算,就是在這里發(fā)?的翻擒。
頂點著?器是逐頂點運算的程序氓涣,也就是說每個頂點數(shù)據(jù)都會執(zhí)?一次頂點著?器。當然這是并行的陋气,并且頂點著?器運算過程中?法訪問其他頂點的數(shù)據(jù)劳吠。
8.2 片段著?器(FragmentShader)
?段著?器是OpenGL中?于計算?段(像素)顏?的程序。一般?來處理圖形中每個像素點顏?計算和填充巩趁。
?段著?器是逐像素運算的程序痒玩,也就是說每個像素都會執(zhí)?一次?段著?器,當然也是并?的晶渠。
9. GLSL(OpenGL Shading Language)
GLSL著色語?是?來在OpenGL中著?編程的語?凰荚,是在圖形卡的GPU上執(zhí)?的。代替了固定的渲染管線的?部分褒脯,使渲染管線中不同層次具有可編程性便瑟。?如:視圖轉換、投影轉換等番川。GLSL(GL Shading Language)的著?器代碼分成2個部分: Vertex Shader(頂點著?器)和Fragment(?斷著?器)到涂。
10. 光柵化(Rasterization)
光柵化就是把頂點數(shù)據(jù)轉換為片元的過程。具有將圖轉化為?個個柵格組成的圖象 的作?颁督,特點是每個元素對應幀緩沖區(qū)中的?像素践啄。
光柵化其實是?種將?何圖元變?yōu)槎S圖像的過程。該過程包含了兩部分的?作沉御。第?部分工作:決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?屿讽;第?部分?作:分配一個顏?值和?個深度值到各個區(qū)域。
把物體的數(shù)學描述以及與物體相關的顏色信息轉換為屏幕上用于對應位置的像素及?于填充像素的顏?吠裆,這個過程稱為光柵化伐谈。這是?個將模擬信號轉化為離散信號的過程。
總結:
光柵化就是把頂點數(shù)據(jù)轉換為片元的過程试疙。
該過程包含了兩部分的?作:
? ? ? ? 1.決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?诵棵;
? ? ? ? 2.分配一個顏?值和?個深度值到各個區(qū)域。
11. 紋理(Texture)
紋理可以理解為圖?祝旷。 在渲染圖形時需要在頂點圍成的區(qū)域中填充圖?履澳,使得場景更加逼真嘶窄。?這?使?的圖?,就是常說的紋理距贷。只是在OpenGL柄冲,我們更加習慣叫紋理,?不是圖?储耐。
12. 混合(Blending)
在測試階段之后羊初,如果像素依然沒有被剔除,那么像素的顏?將會和幀緩沖區(qū)中顏?附著上的顏色進?混合什湘,混合的算法可以通過OpenGL的函數(shù)進行指定长赞。但是OpenGL提供的混合算法有限。如果需要更加復雜的混合算法闽撤,一般可以通過片段著?器進?實現(xiàn)得哆,當然性能會?原?的混合算法差?些。
13. 矩陣
13.1 變換矩陣(Transformation)
例如圖形想發(fā)?平移哟旗、縮放贩据、旋轉等變換,就需要使用變換矩陣闸餐。
13.2 投影矩陣(Projection)
?于將3D坐標轉換為?維屏幕坐標饱亮,實際線條也將在二維坐標下進行繪制。
14. 渲染上屏/交換緩沖區(qū)(SwapBuffer)
渲染緩沖區(qū)?般映射的是系統(tǒng)的資源?如窗?舍沙。如果將圖像直接渲染到窗口對應的渲染緩沖區(qū)近上,則可以將圖像顯示到屏幕上。
值得注意的是拂铡,如果每個窗?只有?個緩沖區(qū)壹无,那么在繪制過程中屏幕進?了刷新,窗?可能顯示出不完整的圖像感帅。
為了解決這個問題斗锭,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)。顯示在屏幕上的稱為屏幕緩沖區(qū)失球,沒有顯示的稱為離屏緩沖區(qū)岖是。在一個緩沖區(qū)渲染完成之后,通過將屏幕緩沖區(qū)和離屏緩沖區(qū)交換实苞,實現(xiàn)圖像在屏幕上顯示璧微。
由于顯示器的刷新?般是逐?進?的,為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀硬梁,交換一般會等待顯示器刷新完成的信號,在顯示器器兩次刷新的間隔中進?交換胞得,這個信號就被稱為垂直同步信號荧止,這個技術被稱為垂直同步。
使用了雙緩沖區(qū)和垂直同步技術之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染跃巡,使得幀率無法完全達到硬件允許的最??平危号。為了解決這個問題,引?了三緩沖區(qū)技術素邪。在等待垂直同步時外莲,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?生時兔朦,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換偷线,實現(xiàn)充分利利?硬件性能的?的。
總結:
如果每個窗?只有?個緩沖區(qū)沽甥,若在繪制過程中屏幕進?了刷新声邦,窗?可能顯示出不完整的圖像。為了解決這個問題摆舟,常規(guī)的OpenGL程序?少都會有兩個緩沖區(qū)亥曹。
垂直同步:由于顯示器的刷新?般是逐?進?的,為了防?交換緩沖區(qū)的時候屏幕上下區(qū)域的圖像分屬于兩個不同的幀恨诱,交換一般會等待顯示器刷新完成的信號媳瞪,在顯示器器兩次刷新的間隔中進?交換,這個信號就被稱為垂直同步信號照宝,這個技術被稱為垂直同步蛇受。
三緩沖區(qū)技術:使用了雙緩沖區(qū)和垂直同步技術之后,由于總是要等待緩沖區(qū)交換之后再進?下?幀的渲染硫豆,使得幀率無法完全達到硬件允許的最??平龙巨。為了解決這個問題,引?了三緩沖區(qū)技術熊响。在等待垂直同步時旨别,來回交替渲染兩個離屏的緩沖區(qū),?垂直同步發(fā)?生時汗茄,屏幕緩沖區(qū)和最近渲染完成的離屏緩沖區(qū)交換秸弛,實現(xiàn)充分利利?硬件性能的?的。