OpenGL(Open Graphics Library)是一個跨編程語言、跨平臺的圖形編程程序接口,它將計算機的資源抽象成一個個OpenGL對象
,將對這些資源的操做抽象成一個個OpenGL指令
。算法
OpenGL ES(OpenGL for Embedded System)是OpenGL
三維圖形API的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計,去除了不少沒必要要的和性能較低的API接口。編程
在應用程序調用任何OpenGL
的指令以前,須要安排首先建立一個OpenGL
的上下文。這個上下文是一個很是龐大的狀態機,保存了OpenGL
中的各類狀態,這也是OpenGL
指令執行的基礎。數組
OpenGL
的函數無論在哪一個語言中,都是相似C語言同樣面向過程的函數,本質上都是對OpenGL
上下文這個龐大的狀態機中的某個狀態或者對象進行操做,固然你得首相把這個對象設置爲當前對象。所以,經過對OpenGL
指令的封裝,是能夠將OPenGL
的相關調用封裝成爲一個面向對象的圖形API的。緩存
因爲OpenGL
上下文是一個巨大的狀態機,切換上下文每每會產生較大的開銷,可是不一樣的繪製模塊,可能須要使用徹底獨立的狀態管理。所以,能夠在應用程序中分別建立多個不一樣的上下文,在不一樣線程中使用不一樣的上下文,上下文之間共享紋理,緩衝區等資源。這樣,會比反覆切換上下文,或者大量修改渲染狀態,更加合理高效。markdown
在程序退出前,OpenGL
總會先中止工做的。架構
(1)
頂點數據
編程語言
(2)
頂點着色器
【必要】:接收頂點數據,單獨處理每一個頂點函數
(3)
細分着色器
【可選】:描述物體的形狀,在管線中⽣生成新的幾何體處理(平順)模型 生成最終狀態 (名稱: 細分控制着⾊器/細分計算着⾊器,對全部的圖像進行修改幾何圖元類型或者放棄全部的凸緣)性能
(4)
幾何着色器
測試
(5)
圖元設置
(6)
剪切
:剪切視口以外的繪製
(7)
光柵化
:輸入圖元的數學描述,轉化爲與屏幕對應位置的像素片元,簡稱光柵化
(8)
片元着色器
【必選】:片元顏色以及深度值,而後傳遞到片元測試和混合模塊
(9) 顯示效果
將圖形/圖像數據轉換成2D空間圖像操做叫渲染
(Rendering)
在渲染過程當中,必須存儲2中着色器,分別是頂點着色器和片元着色器。頂點着色器是第一個,片元着色器是最後一個。頂點着色器中處理頂點,片元着色器處理像素顏色。
OpenGL
也是同樣的,頂點數據就是要畫的圖像的骨架,和現實中不一樣的是,OpenGL
中的圖像都是由圖元
組成。在OpenGL ES
中,有三種類型的圖元
:點、線、三角形。開發者能夠選擇設定函數指針,在調用繪製方法的時候,直接由內存傳入頂點數組
。而性能更高的作法是,提早分配一塊顯存,將頂點數據預先傳入到顯存當中。這部分顯存,就被稱爲頂點緩衝區
。固定渲染管線
架構變爲了可編程渲染管線
。所以OpenGL
在實際調用繪製函數以前,還須要指定一個由shader
編譯成的着色器程序
。常見的着色器主要有頂點着色器(VertexShader)
,片斷着色器(FragmentShader)
/像素着色器(PixelShader)
,幾何着色器(GeometryShader)
,曲面細分着色器(TessellationShader)
。片斷着色器
和像素着色器
只是在OpenGL
和DX
中的不一樣叫法而已。惋惜的是,直到OpenGL ES 3.0
,依然只支持了頂點着色器
和片斷着色器
這兩個最基礎的着色器。OpenGL
在處理Shader
時,和其餘編譯器同樣。經過編譯、連接等步驟,生成了着色器程序(glProgram)
,着色器程序同時包含了頂點着色器
和片斷着色器
的運算邏輯。在OpenGL
進行繪製的時候,首先由頂點着色器
對傳入的頂點數據進行運算。再經過圖元
裝配,將頂點轉換爲圖元。而後進行光柵化
,將圖元這種矢量圖形,轉換爲柵格化數據。最後,將柵格化數據傳入片斷着色器中進行運算。片斷着色器
會對柵格化數據中的每個像素進行運算,並決定像素的顏色。在OpenGL下渲染圖形,就會有經歷一個一個節點,這樣的操做能夠理解爲管線
。就像流水線同樣,每一個任務相似流水線通常執行,任務之間有前後順序。管線是一個抽象概念,之因此稱之爲管線,是由於顯卡在處理數據的時候是按照一個固定的順序來的,並且嚴格按照這個順序,這個順序是不能被打破的。
固定管線
或存儲着色器
沒法完成每個業務。這時將相關部分開放成可編程管線
。頂點着色器
是OpenGL中用於計算頂點屬性的程序。頂點着⾊器
是逐頂點運算的程序,也就是說每一個頂點數據都會執⾏一次頂點着色器,固然這是並⾏的,而且頂點着色器運算過程當中沒法訪問其餘頂點的數據。片斷着色器
是OpenGL中用於計算片斷(像素)顏色的程序。片斷着色器
是逐像素運算的程序,也就是說每一個像素都會執⾏一次片斷着色器,固然也是並⾏的OpenGL着⾊語言(OpenGL Shading Language)
是用來在OpenGL中着色編程的語⾔,即開發人員寫的短小的自定義程序,他們是在圖形卡的GPU(Graphic Processor Unit圖形處理單元)上執行的,代替了固定的渲染管線的一部分,使渲染管線中不一樣層次具備可編程性。好比:視圖轉換、投影轉換等。GLSL(GL Shading Language)
的着⾊器代碼分紅2個部分: Vertex Shader(頂點着⾊器)
和Fragment(片元着色器)
頂點數據
轉換爲片元
的過程,具備將圖轉化爲一個個柵格組成的圖象的做用,特色是每一個元素對應幀緩衝區中的一像素。紋理
能夠理解爲圖片。 你們在渲染圖形時須要在其編碼填充圖片,爲了使得場景更加逼真。而這裏使用的圖片,就是常說的紋理。可是在OpenGL,咱們更加習慣叫紋理,而不是圖片幀緩衝區
中顏色附着上的顏色進⾏混合
,混合
的算法能夠經過OpenGL的函數進行指定。可是OpenGL提供的混合算法是有限的,若是須要更加複雜的混合算法,通常能夠經過像素着色器進行實現,固然性能會比原生的混合算法差一些。渲染緩衝區
⼀般映射的是系統的資源好比窗⼝。若是將圖像直接渲染到窗口對應的渲染緩衝區,則能夠將圖像顯示到屏幕上。垂直同步信號
,這個技術被稱爲垂直同步
雙緩衝區
和垂直同步技術
以後,因爲老是要等待緩衝區交換以後再進行下一幀的渲染,使得幀率沒法徹底達到硬件容許的最高水平。爲了解決這個問題,引入了三緩衝區
技術,在等待垂直同步時,來 回交替渲染兩個離屏的緩衝區,而垂直同步發生時,屏幕緩衝區和最近渲染完成的離屏緩衝區交換,實 現充分利用硬件性能的目的最後咱們經過下面這個圖再來看一下整個渲染流程