OpenGL ES 是負責 GPU 工作的,目的是通過 GPU 計算,得到一張圖片,這張圖片在內存中其實就是一塊 buffer,存儲有每個點的顏色信息等。而這張圖片最終是要顯示到屏幕上,所以還需要具體的窗口系統來操作,OpenGL ES 並沒有相關的函數。所以,OpenGL ES 有一個好搭檔 EGL。
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,得到最終的圖片。
參考鏈接