1.1位圖
亦稱為點陣圖像或柵格圖像柿隙,是由稱作像素(圖片元素)的單個點組成的。這些點可以進行不同的排列和染色以構成圖樣鲫凶。當放大位圖時禀崖,可以看見賴以構成整個圖像的無數(shù)單個方塊。擴大位圖尺寸的效果是增大單個像素螟炫,從而使線條和形狀顯得參差不齊波附。然而,如果從稍遠的位置觀看它昼钻,位圖圖像的顏色和形狀又顯得是連續(xù)的掸屡。由于每一個像素都是單獨染色的,您可以通過以每次一個像素的頻率操作選擇區(qū)域而產(chǎn)生近似相片的逼真效果然评,諸如加深陰影和加重顏色仅财。縮小位圖尺寸也會使原圖變形碗淌,因為此舉是通過減小像素來使整個圖像變小的盏求。同樣,由于位圖圖像是以排列的像素集合體形式創(chuàng)建的亿眠,所以不能單獨操作(如移動)局部位圖碎罚。
舉例:比如一個位圖的寬高為120*120px , 那么一個像素包含四個顏色分量RGBA,也就是占四個字節(jié)纳像,一個字節(jié)占8位bit
120 * 120 = 14400 -> RGBA -> 14400 * 4 = 位圖 (紋理)
映射: 對應關系
1.2 管線
在OpenGL下渲染圖形荆烈,就會經(jīng)歷?個?個的節(jié)點。而這樣的操作可以理理解管線竟趾。就像一個流?線憔购,任務按照先后順序依次執(zhí)行。管線是?個抽象的概念潭兽,之所以稱之為管線是因為顯卡在處理數(shù)據(jù)的時候是按照一個固定的順序來的倦始,而且嚴格按照這個順序。
核心要點:
任務嚴格按照順序依次執(zhí)行山卦。
1.3 固定管線
在早期的OpenGL版本鞋邑,封裝了多種著色器程序塊诵次,內(nèi)置了一段包含了光照、坐標變換枚碗、裁剪等諸多功能的固定shader程序來完成逾一。來幫助開發(fā)者來完成圖形的渲染。開發(fā)者只需要傳入相應的參數(shù)肮雨,就能快速完成圖形的渲染遵堵。類似于iOS開發(fā)會封裝很多API,而我們只需要調(diào)?怨规,就可以實現(xiàn)功能陌宿,不需要關注底層實現(xiàn)原理。(就類似于調(diào)用一些別人封裝好的API一樣)
但是由于OpenGL的使?場景?常豐富波丰,固定管線或存儲著?器?法完成每一 個業(yè)務壳坪,這時將相關部分開放成可編程。
核心要點:
早期的OpenGL版本封裝的輔助快速開發(fā)的著色器程序塊掰烟。由于提供的功能有限爽蝴,后期變成了可編程的形式。
1.4著色器
就全?的將固定渲染管線架構變?yōu)榱丝删幊啼秩竟芫€纫骑。因此蝎亚,OpenGL在實際調(diào)?繪制函數(shù)之前,還需要指定?個由shader編譯成的著?器程序先馆。常?的著?器主要有頂點著?器(VertexShader)发框,?元著?器(FragmentShader)/像素著?器(PixelShader),?何著?器(GeometryShader)磨隘,曲?細分著?器(TessellationShader)缤底。?段著?器和像素著?器只是在OpenGL和DX中的不同叫法?已顾患》妫可惜的是,直到OpenGLES 3.0江解,依然只?持了頂點著?器和?段著?器這兩個最基礎的著?器设预。
OpenGL在處理shader時,和其他編譯器?樣犁河。通過編譯鳖枕、鏈接等步驟,?成了著?器程序(glProgram)桨螺,著?器程序同時包含了頂點著?器和?段著?器的運算邏輯宾符。在OpenGL進?繪制的時候,?先由頂點著?器對傳?的頂點數(shù)據(jù)進?運算灭翔。再通過圖元裝配魏烫,將頂點轉換為圖元。然后進?光柵化,將圖元這種?量圖形哄褒,轉換為柵格化數(shù)據(jù)稀蟋。最后,將柵格化數(shù)據(jù)傳??段著?器中進?運算呐赡。?段著?器會對柵格化數(shù)據(jù)中的每?個像素進?運算退客,并決定像素的顏?
1.5頂點著色器
? ?般?來處理圖形每個頂點變換(旋轉/平移/投影等)
? 頂點著?器是OpenGL中?于計算頂點屬性的程序。頂點著?器是逐頂點運算的程序链嘀,也就是說每個頂點數(shù)據(jù)都會執(zhí)??次頂點著?器萌狂,當然這是并?的,并且頂點著?器運算過程中?法訪問其他頂點的數(shù)據(jù)? ?般來說典型的需要計算的頂點屬性主要包括頂點坐標變換怀泊、逐頂點光照運算等等粥脚。頂點坐標由?身坐標系轉換到歸?化坐標系的運算,就是在這?發(fā)?的包个。
核心要點:
1.確定位置 2.縮放/平移/旋轉位置換算 3.將3D圖形數(shù)據(jù)轉換成2D(投影換算)刷允,顯示在手機屏幕上
1.6?元著?器
? ?般?來處理圖形中每個像素點顏?計算和填充
? ?段著?器是OpenGL中?于計算?段(像素)顏?的程序。?段著?器是逐像素運算的程序碧囊,也就是說每個像素都會執(zhí)??次?段著?器树灶,當然也是并?的
核心要點:
片元著色器處理的是一個個片元,也就是像素點糯而,執(zhí)行片段著色器天通,并行運算,當我們想對位圖進行加濾鏡等等操作熄驼,實際上就是修改片元像寒,后面會講到OpenGL ES,用它來處理
1.6光柵化
? 是把頂點數(shù)據(jù)轉換為?元的過程瓜贾,具有將圖轉化為?個個柵格組成的圖象的作?诺祸,特點是每個元素對應幀緩沖區(qū)中的?像素, 光柵化就是把頂點數(shù)據(jù)轉換為?元的過程祭芦。?元中的每?個元素對應于幀緩沖區(qū)中的?個像素筷笨。
? 光柵化其實是?種將?何圖元變?yōu)?維圖像的過程。該過程包含了兩部分的?作龟劲。第?部分?作:決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?胃夏;第?部分?作:分配?個顏?值和?個深度值到各個區(qū)域。光柵化過程產(chǎn)?的是?元 把物體的數(shù)學描述以及與物體相關的顏?信息轉換為屏幕上?于對應位置的像素及?于填充像素的顏?昌跌,這個過程稱為光柵化仰禀,這是?個將模擬信號轉化為離散信號的過程
核心要點:
光柵化就是把頂點數(shù)據(jù)轉換為片元的過程。該過程包含了兩部分的?作:①決定窗?坐標中的哪些整型柵格區(qū)域被基本圖元占?;②分配一個顏?值和?個深度值到各個區(qū)域。
1.7OpenGL上下文
在應用程序調(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)用封裝成為一個面向?qū)ο蟮膱D形API
由于OpenGL上下文是一個巨大的狀態(tài)機,切換上下文往往會產(chǎn)生較大的開銷堰氓,但是不同的繪制模塊挤渐,可能需要使用完全獨立的狀態(tài)管理。因此双絮,可以在應用程序中分別創(chuàng)建多個不同的上下文浴麻,在不同線程中使用不同的上下文,上下文之間共享紋理囤攀、緩沖區(qū)等資源软免。這樣的方案,會比反復切換上下文焚挠,或者大量修改渲染狀態(tài)膏萧,更加合理高效的.
簡單的說上下文就是一個狀態(tài)機,保存當前的所有狀態(tài)