1. 程式人生 > 其它 >一文了解 OpenGL ES

一文了解 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

= THE END =