不管是OpenGL 仍是 OpenGL ES 或者 Metal ,本質上仍是利用GPU來進行高效的渲染圖形圖像。 換句話說圖形API,是咱們iOS開發者惟一接近GPU的方式。編程
首先,「狀態機」這個東西是什麼,學過編譯原理的同窗,必定聽過或瞭解這三個字。狀態機是有限狀態自動機的簡稱,是現實事物運行規則抽象而成的一個數學模型。數組
若是說下圖「自動門」是個狀態機,他 記憶 了open和close狀態,知道本身處在不一樣狀態時,下一步要幹什麼,是「開門」仍是「關門」。 當在close狀態時,你 輸入 一個開門的信號,他就會切換成open狀態 緩存
狀態機的特色:markdown
回到 OpenGL 狀態機:框架
- 畫圖通常是先畫好圖像的骨架,而後再往骨架裏填充顏色,OpenGL也是如此。頂點數據 就是要畫的圖像的骨架,和現實世界不一樣的是,OpenGL裏的圖像是由圖元構成,(什麼是圖元?點,線,三角形)。這些頂點數據存在何處?開發者能夠選擇設定函數指針,在調用繪製方法前,從內存傳入,也就是先存在內存中,被稱爲 頂點數組 。而爲了高性能,提早分配一塊顯存,將頂點數據傳入顯存,這塊顯存也被稱爲 頂點緩衝區;
- 頂點是指咱們在繪製一個圖形時,各個頂點的位置數據。而這個(些)數據能夠存入數組或直接緩存到GPU中。
- 在OpenGL實際調用繪製函數以前,還須要指定一個由shader編譯成的着色器程序。常見的着色器有:頂點着色器(VertexShader),片元着色器(FragmentShader)/像素着色器(PixelShader),幾何着色器(GeometryShader),曲面細分着色器(TessellationShader)。片元着色器和像素着色器是在OpenGL和DX中的不一樣叫法,可是直到OpenGL ES 3.0 ,依然只支持兩個基礎的頂點着色器和片元着色器。
- OpenGL在處理Shader時,也是經過編譯、連接生成着色器程序(glProgram),着色器程序同時包含頂點着色器和片元着色器的運算邏輯。OpenGL進行繪製時,先傳入頂點數據,由頂點着色器運算,將頂點轉化成圖元,再經過圖元裝配鏈接線條,再進行光柵化,將圖元這種矢量轉成柵格化數據,最後將柵格化數據傳入片元着色器進行運算。片元着色器會對柵格化數據的每個像素進行位運算,決定每個像素的顏色。
- 通常⽤來處理圖形每一個頂點變換(旋轉/平移/投影等)
- 頂點着⾊器是OpenGL中⽤用於計算頂點屬性的程序。頂點着⾊器是逐頂點運 算的程序,也就是說每一個頂點數據都會執行⼀次頂點着色器,固然這是並 行的,而且頂點着⾊器運算過程當中沒法訪問其餘頂點的數據。
- 通常來講典型的須要計算的頂點屬性主要包括頂點座標變換、逐頂點光照 運算等等。頂點座標由自身座標系轉換到歸一化座標系的運算,就是在這裏發生的。
- 通常用來處理圖形中每一個像素點顏色計算和填充
- ⽚段着⾊器是OpenGL中⽤於計算⽚段(像素)顏色的程序。片斷着⾊器是逐像素運算的程序,也就是說每一個像素都會執行⼀次片斷着⾊器,固然也是並行的
OpenGL着⾊色語⾔言(OpenGL Shading Language)是⽤來在OpenGL中着色編程的語言,也即開發人員寫的短小的⾃定義程序,他們是在圖形卡的GPU (Graphic Processor Unit圖形處理單元)上執⾏的,代替了固定的渲染管線的⼀部分,使渲染管線中不一樣層次具備可編程性。好比:視圖轉換、投影轉換等。GLSL(GL Shading Language)的着⾊器代碼分紅2個部分: Vertex Shader(頂點着⾊器)和Fragment(片元着⾊器)函數
- 是把頂點數據轉成片元的過程,具備將圖轉成一個個柵格的做用,特色是每一個元素對應幀緩衝區的每個像素。
- 光柵化實際上是一種將⼏何圖元變爲⼆維圖像的過程。該過程包含了兩部分的⼯工做。第⼀部分工做:決定窗口座標中的哪些整型柵格區域被基本圖元佔用;第⼆部分工做:分配一個顏色值和一個深度值到各個區域。光柵化過程產生的是片元。
- 是一個將模擬信號轉成離散信號的過程
圖位>-gnp 張一示顯端動移 SE LGnepO 件文理紋 agt. LGnepO 圖位>-縮壓性能
當圖形圖像想發平生移、縮放、旋轉等變換,須要使用變換矩陣動畫
將3D座標轉成2緯屏幕座標。spa
- 渲染緩衝區通常映射的是系統的資源好比窗口。若是將圖像直接渲染到窗口對應的渲染緩衝區,則能夠將圖像顯示到屏幕上。
- 可是,若是每一個窗口只有一個渲染緩衝區,那麼在繪製過程當中屏幕進行了刷新,窗口可能顯示不出完整的圖像
- 爲了解決這個問題,常規的OpenGL會有兩個緩衝區:在屏幕上的稱爲屏幕緩衝區,沒有顯示的稱爲離屏緩衝區。在一個緩衝區渲染完成後,經過將屏幕緩衝區和離屏緩衝區交換,實現圖像在屏幕上的顯示
- 因爲顯示器的刷新是逐行進行的,所以爲了防止交換緩衝區的時候出現兩個緩衝區的內容,所以交換通常等待顯示器刷新完成的信號,在顯示器兩次刷新的間隔中間進行交換,這個信號就是垂直同步信號,這個技術就是垂直同步
- 使用了雙緩衝區和垂直同步技術以後,因爲老是要等待緩衝區交換以後才能進行下一幀的渲染,使得幀率沒法達到硬件的最高水平。爲了解決這個問題,引入了三緩衝區技術,在等待垂直同步時,來回交替渲染兩個離屏緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區進行交換,實現充分利用硬件性能的目的