OpenGL是Open Graphics Library 的縮寫,是一組圖形繪製的api集合,大約有350個函數左右,經常使用於CAD、虛擬現實、科學可視化程序和電子遊戲開發以及圖片和視頻的濾鏡處理等場景。OpenGL規範描述了繪製2D和3D圖形的抽象API,雖然這些API徹底能夠經過軟件實現,但它是爲大部分或所有使用硬件加速而設計的。各類圖形API的做用本質就是使用GPU芯片高速渲染圖形,得益於GPU的計算能力。而圖形API也是iOS惟一可以接近GPU的地方。算法
爲了能夠在從此的OpenGL/Open GL ES / Metal等學習中,能夠更加清楚處理過程,必須對其中的一些專業名詞進行理解和消化。編程
在應用程序調用OpenGL任一API以前都會先初始化一個上下文,這是OpenGL的命令基礎。由於用來記錄OpenGL中的各個對象以及狀態,也被稱爲狀態機。api
OpenGL中的函數都是相似C的面向過程的,其本質是經過上下文這個龐大的狀態機進行修改某個狀態或者某個對象,前提都是須要把對象設爲當前對象。經過封裝OpenGL函數,能夠實現面向對象的圖形API。數組
因爲上下文是個龐大的狀態機,在多個模塊的渲染中,能夠在不一樣的線程建立不一樣的上下文,上下文間共享文理、緩衝區資源等。能夠減小上下文的切換和修改渲染狀態帶來的巨大資源損耗。網絡
狀態機是理論上的一種的機器。狀態機能夠說是一種行爲,記錄了對象在其生命週期內中的各類狀態序列,以及狀態事件的響應。狀態機有如下特色:架構
①有記憶功能,能夠記憶當前狀態。函數
②能夠根據輸入的值和以前的值計算後進行修改。性能
③在某些狀態(停機)時,沒法接收輸入,中止工做。學習
OpenGL程序退出以前,老是會先中止工做的。編碼
將圖像/圖像數據轉換成3D空間圖像的操做。
OpenGL中圖形都是由圖元組成,而圖元則是由頂點組成。在OpenGL中經常使用有七種圖元,在OpenGL ES中只有三種圖元:點、線、三角形。
在二位圖像中,每一個點都含有顏色,深度,紋理信息,將該點和相關信息稱爲片元。1片元對應着1像素,只是片元含有的信息更多。
全部圖元都是由頂點組成的,有時一個圖元由幾個點組成,常常會用到頂點數組,保存在內存中或者頂點緩衝區中。
頂點數據存放在內存中,也能夠存儲在頂點緩衝區中。存放在內存中就是繪製的時候調用繪製函數,傳入頂點數據,就會存儲在內存中;性能更高的是先分配一塊顯存,預先把頂點存到顯存中,這一塊顯存被稱爲頂點緩衝區。
OpenGL渲染圖形中,能夠有多個處理單元並行執行加快執行速度,其具體過程相似於工廠中的流水線。
在早期的版本中,固定管線是封裝了許多着色器程序模塊,包含了座標轉換、裁切、旋轉變換等功能的模塊程序,幫助開發者只需調用函數,傳入指定的着色器程序和其餘參數便可獲得想要的結果。其實能夠說是一個封裝的接口模塊。
由於固定管線/着色器沒法一一包含全部freestyle的功能,這時將相關部分變成可編程的部分。
將固定管線架構的一部分變成了可編程渲染管線。實際在繪製的過程當中須要傳入一個指定着色器程序的參數。常見的着色器程序有:
頂點着色器(VertexShader)
片元着色器(FragmentShader)、像素着色器(PixelShader,DirectX的叫法)、片元着色器(這三種着色器描述的都是同一種着色器,叫法不一樣)
幾何着色器(GeomtryShader)
曲線細分着色器(TessellationShader)
直至OpenGL ES 3.0還只支持頂點着色器和片斷着色器。
OpenGL在處理着色器時,像普通程序同樣通過編譯、連接後生成着色器程序(glProgram)。着色器程序同時包含了頂點着色器和片斷着色器的運算邏輯。OpenGL在繪製過程以下:
頂點着色器是Open GL計算頂點屬性的程序,包括旋轉、平移、縮放等運算。
片斷着色器是OpenGL中逐像素進行並行計算每一個片斷(像素)的顏色和填充的程序,還有別名:片斷着色器、像素着色器。
OpenGL 着色語言(Open GL Shadering Language),用在Open GL着色的編程的語言。是開發人員編寫的短小自定義的程序,他們在圖形處理單元(Graphic Processor Unit,GPU)中執行。GLSL代替了固定管線的步驟的一部分,變得能夠自定義編程,使得固定管線的不一樣層次具備可編程性。
GLSL的着色器分爲兩個部分:頂點着色器和片斷着色器。
把物體的數學描述和物體相關的顏色信息轉換成屏幕上的對應像素和顏色填充,這個過程被稱爲光柵化。這個過程就是從模擬信號到離散信號的過程,過程產生的就是片元。光柵化就是把頂點數據轉換成片元的過程。片元每一個元素都對應着幀緩衝區的一個像素。
光柵化的本質是把幾何圖元轉換成二維圖像的過程。該過程包含兩個過程:
①決定窗口中哪些整型柵格化區域是被圖元佔據的
②分配一個顏色值和深度到各個區域。
在OpenGL中渲染圖形時,有時爲了使場景更加逼真,會使用圖片編碼後進行填充(能夠理解成貼圖,即每一個像素都從圖片中獲取後進行填充,再也不使用單純的顏色填充)。這個圖片在OpenGL中被稱爲紋理。
像素的顏色將會和幀緩衝區中顏色附着的顏色進行混合。混合算法能夠經過函數進行指定,若是想實現更加複雜的算法,能夠經過片斷着色器進行計算,可是這樣的性能會比原生的混合算法差一些(排除大牛的手法)。
數學線性代數的一個概念。圖形發平生移、旋轉、縮放就須要用到變換矩陣。
把3D座標轉換成2D座標,實際的線條也使用二維座標下進行繪製。
渲染緩衝區通常映射的是系統的資源好比窗口。若是將圖像映射到窗口對應的緩衝區,那麼圖像將會顯示到屏幕中。