OpenGL ES 是負責 GPU 工做的,目的是經過 GPU 計算,獲得一張圖片,這張圖片在內存中其實就是一塊 buffer,存儲有每一個點的顏色信息等。而這張圖片最終是要顯示到屏幕上,因此還須要具體的窗口系統來操做,OpenGL ES 並無相關的函數。因此,OpenGL ES 有一個好搭檔 EGL。html
EGL,全稱:embedded Graphic Interface,是 OpenGL ES 和底層 Native 平臺 視窗系統之間的接口。因此大概流程是這樣的:首先,經過 EGL 獲取到手機屏幕 的 handle,獲取到手機支持的配置(RGBA8888/RGB565 之類,表示每一個像素中包 含的顏色等信息的存儲空間是多少位),而後根據這個配置建立一塊包含默認 buffer 的 surface(buffer 的大小是根據屏幕分辨率乘以每一個像素信息所佔大小計 算而得)和用於存放 OpenGL ES 狀態集的 context,並將它們 enable 起來。而後, 經過 OpenGL ES 操做 GPU 進行計算,將計算的結果保存在 surface 的 buffer 中。 最後,使用 EGL,將繪製的圖片顯示到手機屏幕上。算法
而在 OpenGL ES 操做 GPU 計算的時候,還須要介紹 OpenGL ES 的另一個好搭檔 GLSL。小程序
GLSL,全稱:OpenGL Shading Language,是 OpenGL ES 中使用到的着色器的 語言,用這個語言能夠編寫小程序運行在 GPU 上。函數
在這裏須要先提到 CPU 和 GPU 的區別,它們的功能都是用於計算,也都是由不少核組成,區別在於 CPU 的核比較少,可是單個核的計算能力比較強,而 GPU 的核不少,可是每一個核的計算能力都不算特別強。目前 GPU 的主要工做是用於生成圖片(如今也有經過 GPU 進行高性能運算_並行運算,可是在這裏不屬於討論的範圍),緣由就是圖片是由不少像素組成,每一個像素都包含有顏色、深度等信息,而爲了獲得這些信息數據,針對每一個像素點的計算,是能夠經過統一的算法來完成。GPU 就擅長處理針對這種大規模數據,使用同一個算法進行計算。而這個算法,就是使用 GLSL 寫成 Shader,供 GPU 運算使用。性能
在圖形學的視角中,全部的圖片都是由三角形構成的。因此經過 OpenGL ES 繪製圖片的時候,咱們須要經過 OpenGL ES API 建立用於在 GPU 上運行的 shader, 而後將經過 CPU 獲取到的圖片頂點信息,傳入 GPU 中的 Shader 中。在 Vertex Shader 中經過矩陣變換,將頂點座標從模型座標系轉換到世界座標系,再到觀察座標系,到裁剪座標系,最後投影到屏幕座標系中,計算出在屏幕上各個頂點的座標。而後,經過光柵化,以插值的方法獲得全部像素點的信息,並在 Fragment shader 中計算出全部像素點的顏色。最後,經過 OpenGL ES 的 API 設定的狀態,將獲得的像素信息進行 depth/stencil test、blend,獲得最終的圖片。spa
參考連接htm