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的官方的描述如下:
<code>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.</code>
經過多年的發展,目前OpenGL ES主要分為以下幾個主要的版本:。
采用<code>固定渲染管線</code>的 OpenGL ES 1.x (主要包括1.0與1.1):
固定渲染管線,可以由硬體GPU支援或由軟體模拟GPU進行圖形渲染,其渲染能力有限。特别是在不包含GPU的終端裝置上,由軟體模拟GPU進行圖形渲染,其渲染性能也較弱(早期的Android裝置「2010年以前的Android裝置」,部分裝置中是不包含GPU硬體的,其圖形渲染工作由軟體模拟經CPU計算來完成)。
采用<code>可程式設計渲染管線</code>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 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 規範。
目前khronos官方網站中,最新的OpenGL ES版本為 OpenGL ES3.2。而移動作業系統Android早在Android 7.0(API 24)已經完成OpenGL ES 3.2相關API的支援。
Khronos目前已經釋出的OpenGL ES版本如下:
Android各版本對OpenGL ES的支援情況,我做了如下表格,供大家參考:
Android 引入版本
引入大緻時間
OpenGL ES 1.x
Android 1.6(API 4)
2009.09
Android 2.2.3(API 8)
2011.09
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 建構的三維空間,其中的<code>三維</code>實體<code>由許多的三角形拼接構成</code>。
如下圖左側所示的三維實體圓錐,其由許多三角形按照一定規律拼接構成。而組成圓錐的每一個三角形,其任意一個頂點由三維空間中 x、y、z 三個坐标分量來定義。
對于我們日常使用的移動手持裝置,手機螢幕視窗由<code>不連續的有限的二維像素小格子</code>構成的,每一個像素格子有x、y兩個分量來定義。
是以在OpenGL ES繪制流程中,其主要工作是<code>将三維空間中的坐标點(x,y,z)構成的三維圖形,轉化為手機螢幕上的二維像素點</code>。
這個轉化過程主要分為兩個步驟:
一個是頂點的變換;
三維空間中的實體,經過各種變換(主要是通過矩陣相乘進行坐标系的變換),變為可投影在二維平面上的有限的像素點資料;
二是渲染着色;
根據傳入的頂點顔色資料或圖檔紋理資料,将相應的顔色對應到相應的像素點。
在OpenGL ES中,其大概的繪制流程如下圖所示:
資料分組
這一階段是OpenGL ES中資料基本處理階段,對三維空間中物體的<code>頂點坐标</code>、<code>頂點對應的顔色</code>資料進行一個基本處理,并且指定三維實體的<code>繪制方式</code>為三角形繪制。
組裝三角形
這一階段按上一步指定的繪制方式,将三維頂點資料組裝成一個三角形實體圖元。
剪裁
可以了解為将位于視野外的三角形部分排除掉,類似于人眼視角以外的部分排除掉,進而減少不比較的渲染繪制工作。經過剪裁後的三角形,可能會增加頂點資料。
光栅化
光栅化是将<code>三維空間的三角形圖形</code>,栅格化為<code>手機二維螢幕上的一個個像素點</code>。将由<code>三維</code>頂點資訊組成的<code>三角形圖元</code>,<code>栅格化</code>為由<code>許多像素點</code>構成的<code>二維圖像</code>
着色
顔色混合
如若存在多個三維實體,每個三維實體的顔色各有不同,其重疊部分的顔色是兩個或者多個顔色疊加而成。
注:
*對于以上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