系列推薦文章:
OpenGL/OpenGL ES入門:圖形API以及專業名詞解析
OpenGL/OpenGL ES入門:渲染流程以及固定存儲着色器
OpenGL/OpenGL ES入門:圖像渲染實現以及渲染問題
OpenGL/OpenGL ES入門:基礎變換 - 初識向量/矩陣
OpenGL/OpenGL ES入門:紋理初探 - 經常使用API解析
OpenGL/OpenGL ES入門: 紋理應用 - 紋理座標及案例解析(金字塔)
OpenGL/OpenGL ES入門: 頂點着色器與片元着色器(OpenGL過渡OpenGL ES)
OpenGL/OpenGL ES入門: GLKit以及API簡介
OpenGL/OpenGL ES入門: GLKit使用以及案例算法
當初接觸OpenGL的時候,也關注到了蘋果爸爸棄用的問題,內心想着,蘋果爸爸都棄用了OpenGL/Open LG ES,那麼學這東西還有什麼用呢?編程
值得注意的是:
一、蘋果自身的系統遷移到Metal是花費了4年時間
二、在沒有推出Metal時,蘋果對於OpenGL ES是高度集成且配合相應圖層和GLKit來輔助開發者能快速使用OpenGL ES
三、OpenGL ES的棄用,只是針對蘋果內部系統底層API依賴而言,並非想讓iOS開發者今後不使用OpenGL ES。只是角色變成了第三方,畢竟它的跨平臺以及穩定是很難讓現有的開發放棄,而這幾點Metal目前很難作到
四、目前大多數相似百度地圖、高德地圖和音視頻處理的項目組已經很龐大了,暫時不會遷移到Metal,因此只學習Metal是不夠用的
五、因此學習須要一步一步的走OpenGL -> OpenGL ES -> Metal,這個也是親身體會,以前嘗試過上來就學GPUImage或者是OpenGL ES,可是僅僅停留在會用,可是不知道原理,因此先要打好基礎數組
OpenGL(Open Graphics Library):是一個跨編程語言、跨平臺的編程圖形程序接口,它將計算機的資源抽象稱爲一個個OpenGL的對象,對這些資源的操做抽象爲一個個的OpenGL指令。緩存
OpenGL ES(OpenGL for Embedded Systems):是OpenGL三維圖形API的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計的,去除了許多沒必要要和性能較低的API接口。網絡
DirectX:是由不少API組成的,DirectX並非一個單純的圖形API。最重要的是DirectX是屬於Windows上一個多媒體處理API。並不支持Windows之外的平臺,因此不是跨平臺框架。按照性質分類,可分爲四大部分,顯示部分、聲音部分、輸入部分和網絡部分。架構
Metal:Apple爲遊戲開發者推出了新的平臺技術,該技術可以爲3D圖像提升10倍的渲染性能。Metal是Apple爲解決3D渲染而推出的框架框架
簡單的說就是實現圖形的底層渲染編程語言
本質:就是利用GPU芯片來高效渲染圖形圖像 圖形API是iOS開發者惟一接近GPU的方式函數
在應用程序調用任何OpenGL的指令以前,須要先建立一個OpenGL的上下文context。這個上下文是一個很是龐大的狀態機,保存了OpenGL中的各類狀態,這也是OpenGL指令執行的基礎post
OpenGL的函數無論在哪一個語言中,都是相似C語言同樣的面向過程的函數,本質上都是對OpenGL上下文這個龐大的狀態機中的某個狀態或者對象進行操做,固然你得首先把這個對象設置爲當前對象。所以,經過對OpenGL指令的封裝,是能夠將OpenGL的相關調用封裝成爲一個面向對象的圖形API
因爲OpenGL上下文是一個巨大的狀態機,切換上下文每每會產生較大的開銷,可是不一樣的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不一樣的上下文,在不一樣線程中使用不一樣的上下文,上下文之間共享紋理、緩衝區等資源。這樣的方案,會比反覆切換上下文,或者大量修改渲染狀態更加合理高效
狀態機理論上是一種機器,它描述了一個對象在其生命週期內所經歷的各類狀態,狀態間的轉變、發送轉變的動因、條件以及轉變中所執行的活動。或者說,狀態機是一種行爲,即對象在其生命週期中響應事件所經歷的狀態序列以及對那些狀態事件的響應。具備一下特色:
電腦能夠說就是典型的狀態機
類推到OpenGL中,能夠這麼理解
OpenGL是一個狀態機,它保持自身的狀態,除非用戶輸入一條命令讓它改變狀態
將圖形/圖像數據轉換成3D空間圖像操做叫作渲染(Rendering
)
頂點: 指的是在繪製一個圖形時,它的頂點位置數據,而這個數據能夠直接存粗在數組中或者將其緩存到GPU內存中
OpenGL中的圖像都是由圖元組成,在OpenGL ES中,有3種類型的圖元:點、線、三角形。開發者能夠選擇設定函數指針,在調用繪製方法的時候,直接由內存傳入頂點數據,也就是說這部分數據以前是存儲在內存當中的,被稱爲頂點數組。而性能更高的作法是提早分配一塊顯存,將頂點數據預先傳入到顯存當中,這部分的顯存,就被稱爲頂點緩衝區
管線:能夠理解爲渲染流水線。實際上指一堆原始圖形數據途徑一個輸送管道,期間通過各類變化處理最終出如今屏幕的過程。
在OpenGL下渲染圖形,就會經歷一個一個節點。而這樣的操做能夠理解爲管線。能夠想象成流水線,每一個任務相似流水線同樣執行,任務之間有前後順序。之因此稱之爲管線是由於顯卡在處理數據的時候是按照一個固定的順序來的,並且嚴格按照這個順序。就像水從一根管子的一端留到另外一端,這個順序不能打破。
固定管線:簡單理解爲渲染圖像這個過程,咱們只能經過調用GLShaderManager
類的固定管線效果實現一系列的着色器處理。
可編程管線:簡單理解爲在處理圖形的過程,咱們可以使用自定義頂點着色器和片元着色器的過程。因爲OpenGL的使用場景很是豐富,固定管線或者存儲着色器沒法完成每個任務,這時將相關部分開放成可編程
將固定渲染管線架構變成爲可編程渲染管線。所以,OpenGL在實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器程序。常見的着色器主要有頂點着色器(VertexShader)、片斷/片元着色器(FragmentShader)/像素着色器(PixelShader)、幾何着色器(GeometryShader)、曲面細分着色器(TessellationShader)。直到OpenGL ES3.0,依然只支持了頂點着色器和片斷着色器這兩個最基礎的着色器
OpenGL在處理shader時,和其餘編譯器同樣。經過編譯、連接等步驟,生成了着色器程序(glProgram),着色器程序同時包含了頂點着色器和片元着色器的運算邏輯。在OpenGL進行繪製的時候,首先由頂點着色器對傳入的頂點數據進行運算。在經過圖元裝配,將頂點轉換爲圖元。而後進行光柵化,將圖元這種矢量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入片元着色器中進行運算。片元着色器會對柵格化數據中的每個像素進行運算,並決定像素的顏色。
通常用來處理圖形每一個頂點變換(旋轉/平移/投影等)
頂點着色器時OpenGL中用於計算頂點屬性的程序。頂點着色器是逐頂點運算的程序,也就是說每一個頂點數據都會執行一次。固然這是並行,而且頂點着色器運算過程當中沒法訪問其餘頂點數據
通常來講典型的須要計算的頂點屬性主要包括頂點座標變換、逐頂點光照運算等等。頂點座標由自身座標系轉換到規範化座標系的運算,就是在這裏發生的
通常用來處理圖形中每一個像素點顏色計算和填充
片元着色器是OpenGL中用於計算片斷(像素)顏色的程序,片元着色器是逐像素運算的程序,也就說每一個像素都會執行一次片元着色器,固然也是並行的
OpenGL着色語言是用來在OpenGL中着色編碼的語言,也就是開發人員寫的短小的自定義程序,他們是在GPU(Graphic Processor Unit圖形處理單元)上執行的,代替了固定的渲染管線的一部分,使渲染管線中不一樣層次具備可編程性。
GLSL的着色器代碼分紅2個部分: VertexShader(頂點着色器) 和 Fragment Shader(片元着色器)
光柵化就是把頂點數據轉換爲片元的過程。具備將圖轉化爲一個個柵格組成的圖像的做用。片元中的每個元素對應於幀緩衝區的一個像素
光柵化實際上是一種將幾何圖元變爲二維圖像的過程。該過程包含了兩部分的工做。第一部分工做:決定窗口座標中的哪些整型柵格區域被基本圖元佔用;第二部分工做:分配一個顏色值和一個深度值到各個區域。光柵化過程產生的是片元
把物體的數學描述以及與物體相關的顏色信息轉換爲屏幕上用於對應位置的像素以及用於填充像素的顏色,這個過程稱爲光柵化,這是一個將模擬信號轉化爲離散信號的過程
紋理能夠理解爲圖片。在渲染圖形時須要在其編碼填充圖片,爲了使得場景更加逼真,而這裏使用的圖片,就是常說的紋理。在OpenGL中,更加習慣叫紋理,而不是圖片。
在測試階段以後,若是像素依然沒有被剔除,那麼像素的顏色將會和幀緩衝區中顏色附着上的顏色進行混合。混合的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法有限的,若是須要更加複雜的混合算法,通常能夠經過像素着色器進行實現,固然性能會比原聲的混合算法差一些
混合就是把兩種顏色混在一塊兒。具體一點,就是把某一像素位置原來的顏色和將要畫上去的顏色,經過某種方式混在一塊兒,從而達到特殊的效果
圖形想發平生移、縮放、旋轉變換,就須要使用變換矩陣
用於將3D座標轉換爲二維屏幕座標,實際線條也將在二維座標下進行繪製
渲染緩衝區通常映射的是系統的資源,好比窗口。若是將圖像直接渲染到窗口對應的緩衝區,則能夠將圖像顯示到屏幕上。可是,值得注意的是,若是每一個窗口只有一個緩衝區,那麼在繪製過程當中,屏幕進行了刷新,窗口可能顯示出不完整的圖像。
常規的OpenGL程序至少都會有兩個緩衝區。顯示在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成以後,經過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上顯示。
由於顯示器的刷新通常是逐行進行的,所以爲了防止交換緩衝區的時候,屏幕上下區域的圖像分屬於兩個不一樣的幀,所以交換通常會等待顯示器刷新完成的信號,在顯示器兩次刷新的間隔中進行交換,這個信號就被稱爲垂直同步信號,這個技術被稱爲垂直同步
使用了雙緩衝區和垂直同步技術以後,因爲老是要等待緩衝區交換以後再進行下一幀的渲染,使得幀率沒法徹底達到硬件容許的最高水平,爲了解決這個問題,引入了三緩衝區技術,在等待垂直同步時,來回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實現充分利用硬件性能的目的