一文了解 OpenGL ES
OpenGL ES(OpenGL for Embedded Systems) 是一種免費的跨平臺3D圖形 API介面,其適用於低功耗裝置,可用於嵌入式裝置和移動裝置(包括手機、車載大屏 和嵌入式電器終端裝置)上渲染高效的 2D 、 3D 圖形。
其由OpenGL(Open Graphics Library)針對嵌入式裝置裁剪而來,去除了OpenGL中許多不是必須冗餘特性,比如:GL_QUADS(四邊形)、GL_POLYGONS(多邊形)繪製模式、glBegin(開始)/glEnd(結束)等特性。
OpenGL ES API介面由 Khronos 組織定義並推廣(Khronos 是一個圖形軟硬體行業協會,致力於為這些 API 建立免費的開發標準),對於OpenGL ES Khronos的官方的描述如下:
OpenGL® ES is a royalty-free, cross-platform API for rendering advanced 2D and 3D graphics on embedded and mobile systems - including consoles, phones, appliances and vehicles. It consists of a well-defined subset of desktop OpenGL suitable for low-power devices, and provides a flexible and powerful interface between software and graphics acceleration hardware.
經過多年的發展,目前OpenGL ES主要分為以下幾個主要的版本:。
- 採用
固定渲染管線
的 OpenGL ES 1.x (主要包括1.0與1.1):
固定渲染管線,可以由硬體GPU支援或由軟體模擬GPU進行圖形渲染,其渲染能力有限。特別是在不包含GPU的終端裝置上,由軟體模擬GPU進行圖形渲染,其渲染效能也較弱(早期的Android裝置「2010年以前的Android裝置」,部分裝置中是不包含GPU硬體的,其圖形渲染工作由軟體模擬經CPU計算來完成)。 - 採用
可程式設計渲染管線
OpenGL ES 2.x、3.x:
從OpenGL ES 2.0開始,OpenGL ES引入了可程式設計渲染管線,渲染能力得到了很大的提升(同時可程式設計渲染管線,也對終端硬體裝置提出了要求,終端硬體裝置中必須有相應的GPU硬體單元)。
OpenGL ES 3.0向後相容OpenGL 2.0,也就是說 為OpenGL 2.0編寫的應用程式在OpenGL ES 3.0中可以繼續執行。
一、OpenGL ES與OpenGL對應關係
OpenGL ES由OpenGL裁剪而來,因此有必要了解一下兩者的對應關係。關於OpenGL ES與OpenGL的各版本的對應關係,我做了如下表格。
OpenGL ES Version | OpenGL Version |
---|---|
OpenGL ES 1.0 | OpenGL 1.3 |
OpenGL ES 1.1 | OpenGL 1.5 |
OpenGL ES 2.0 | OpenGL 2.0 |
OpenGL ES 3.0 | OpenGL 3.3 |
OpenGL ES 3.x | OpenGL 4.x |
- OpenGL ES 1.0 與 OpenGL ES 1.1(合稱OpenGL ES 1.x)分別從OpenGL 1.3與OpenGL 1.5規範衍生而來。
OpenGL ES 1.x採用固定渲染管線,渲染能力有限。 - OpenGL ES 2.0 從 OpenGL 2.0 規範衍生而來。
OpenGL ES 2.0開始採用可程式設計渲染管線,其渲染能力大大提高。 - OpenGL ES 3.0 從 OpenGL 3.3 規範衍生而來。
OpenGL ES 3.x 規範同樣採用的可程式設計渲染管線,同時引入了陰影貼圖、體渲染、基於GPU的粒子動畫、紋理壓縮、變化反饋等重要功能。 - OpenGL ES 3.x 基於 OpenGL 4.x 規範衍生而來。
OpenGL ES 3.x 向下相容 OpenGL ES 3.0/2.0 規範。
二、Android中OpenGL ES的支援
目前khronos官方網站中,最新的OpenGL ES版本為 OpenGL ES3.2。而移動作業系統Android早在Android 7.0(API 24)已經完成OpenGL ES 3.2相關API的支援。
Khronos目前已經發布的OpenGL ES版本如下:
Android各版本對OpenGL ES的支援情況,我做了如下表格,供大家參考:
OpenGL ES Version | Android 引入版本 | 引入大致時間 |
---|---|---|
OpenGL ES 1.x | Android 1.6(API 4) | 2009.09 |
OpenGL ES 2.0 | Android 2.2.3(API 8) | 2011.09 |
OpenGL ES 3.0 | Android 4.4(API 19) | 2013.10 |
OpenGL ES 3.1 | Android 5.0(API 21) | 2014.09 |
OpenGL ES 3.2 | Android 7.0(API 24) | 2016.17 |
- Android 早在Android 1.6(API 4)已經支援OpenGL ES 1.x;
- Android 在Android 2.2.3(API 8)引入OpenGL ES 2.0支援;
- Android 在Android 4.4(API 19)引入了OpenGL ES 3.0支援;
- Android 在Android 5.0(API 21)引入了OpenGL ES 3.1支援;
- Android 7.0(API 24)引入了OpenGL ES 3.2支援;
三、OpenGL ES渲染初探
OpenGL ES 構建的三維空間,其中的三維
實體由許多的三角形拼接構成
。
如下圖左側所示的三維實體圓錐,其由許多三角形按照一定規律拼接構成。而組成圓錐的每一個三角形,其任意一個頂點由三維空間中 x、y、z 三個座標分量來定義。
對於我們日常使用的移動手持裝置,手機螢幕視窗由不連續的有限的二維畫素小格子
構成的,每一個畫素格子有x、y兩個分量來定義。
因此在OpenGL ES繪製流程中,其主要工作是將三維空間中的座標點(x,y,z)構成的三維圖形,轉化為手機螢幕上的二維畫素點
。
這個轉化過程主要分為兩個步驟:
- 一個是頂點的變換;
三維空間中的實體,經過各種變換(主要是通過矩陣相乘進行座標系的變換),變為可投影在二維平面上的有限的畫素點資料; - 二是渲染著色;
根據傳入的頂點顏色資料或圖片紋理資料,將相應的顏色對應到相應的畫素點。
在OpenGL ES中,其大概的繪製流程如下圖所示:
- 資料分組
這一階段是OpenGL ES中資料基本處理階段,對三維空間中物體的頂點座標
、頂點對應的顏色
資料進行一個基本處理,並且指定三維實體的繪製方式
為三角形繪製。 - 組裝三角形
這一階段按上一步指定的繪製方式,將三維頂點資料組裝成一個三角形實體圖元。 - 剪裁
可以理解為將位於視野外的三角形部分排除掉,類似於人眼視角以外的部分排除掉,從而減少不比較的渲染繪製工作。經過剪裁後的三角形,可能會增加頂點資料。 - 光柵化
光柵化是將三維空間的三角形圖形
,柵格化為手機二維螢幕上的一個個畫素點
。將由三維
頂點資訊組成的三角形圖元
,柵格化
為由許多畫素點
構成的二維影象
- 著色
根據傳入的頂點顏色資料或圖片紋理資料,將相應的顏色對應到相應的畫素點。 - 顏色混合
如若存在多個三維實體,每個三維實體的顏色各有不同,其重疊部分的顏色是兩個或者多個顏色疊加而成。
注:
*對於以上OpenGL ES的繪製流程,這裡僅是做一個初步的介紹。詳細瞭解OpenGL ES繪製流程,可檢視 *《一文讀懂OpenGL ES 2.x 渲染流程》:
https://xiaxl.blog.csdn.net/article/details/119960657
三、參考
《OpenGL ES 3.0程式設計指南》
《OpenGL ES 3.x遊戲開發》
khronos:
https://www.khronos.org
維基百科 OpenGL:
https://zh.wikipedia.org/wiki/OpenGL
learnopengl:
https://learnopengl-cn.github.io/01%20Getting%20started/01%20OpenGL/
gl_pipeline:
http://www.songho.ca/opengl/gl_pipeline.html