OpenGL ES介紹:嵌入式3D圖形算法標準
什么是OpenGL?
OpenGL(全寫Open Graphics Library)是個定義了一個跨編程語言、跨平臺的應用程序接口(API)的規格,它用于生成二維、三維圖像。這個接口由近三百五十個不同的函數調用組 成,用來從簡單的圖形繪制復雜的三維景象。而另一種程序接口系統是僅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虛擬實境、科學可視化程序和電子游戲開發。OpenGL的高效實現(利用了圖形加速硬 件)存在于Windows,很多UNIX平臺和MacOS。這些實現一般由顯示設備廠商提供,而且非常依賴于該廠商提供的硬件。開放源代碼庫Mesa是一 個純基于軟件的圖形API,它的代碼兼容于OpenGL。OpenGL規范由1992年成立的OpenGL架構評審委員會(ARB)維護。ARB由一些對 創建一個統一的、普遍可用的API特別感興趣的公司組成。根據OpenGL官方網站,2002年6月的ARB投票成員包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是創立成員之一,但已于2003年3月退出(微軟曾經試圖融合DirectX 和 OpenGL,不過最終放棄了,微軟的DirectX起初的戰略是為了推動DOS游戲開發者轉向Windows,從此之后它就被綁定在Windows下為 PC游戲服務,所以它僅支持Windows)。
OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種計算機平臺及設備上的數千優秀應用程序。OpenGL™ 是獨立于視窗操作系統或其它操作系統的,亦是網絡透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、制造業、制藥業及虛擬現實等行業領域 中,OpenGL™ 幫助程序員實現在 PC、工作站、超級計算機等硬件設備上的高性能、極具沖擊力的高視覺表現力圖形處理軟件的開發。
什么是OpenGL ES?
OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和游戲主機等嵌入式設備而設計。OpenGL ES 是從 OpenGL 裁剪定制而來的,去除了 glBegin/glEnd,四邊形(GL_QUADS)、多邊形(GL_POLYGONS)等復雜圖元等許多非絕對必要的特性。經過多年發展,現在主要 有兩個版本,OpenGL ES 1.x 針對固定管線硬件的,OpenGL ES 2.x 針對可編程管線硬件。OpenGL ES 1.0 是以 OpenGL 1.3 規范為基礎的,OpenGL ES 1.1 是以 OpenGL 1.5 規范為基礎的,它們分別又支持 common 和 common lite 兩種profile。lite profile只支持定點實數,而common profile既支持定點數又支持浮點數。 OpenGL ES 2.0 則是參照 OpenGL 2.0 規范定義的,common profile發布于2005-8,引入了對可編程管線的支持。
Open GL ES 3.0
在 2007 年 8 月,初代 iPhone 和 Android 都內置了 OpenGL ES 1.x;2009 年 10 月,iPhone 3GS 和 Android 2.2 內置了 OpenGL ES 2.0。結果 OpenGL ES 在移動市場的占有率大增,從 2006 年的 20% 到今年的 90% 以上。在昨天的 SIGGRAPH 2012 大會上,科納斯組織(Khronos Group)公布了新版本 OpenGL ES 3.0。
OpenGL ES 3.0 帶來很多新特性:
1、支持更多緩沖區對象。在 OpenGL ES 2.0 時中,緩沖區對象的規范有模糊之處。名字一樣緩沖區對象,在實際渲染中對表現卻有細微的差別。針對這個問題 OpenGL ES 3.0 制定了更詳細對格式規范。新版 OpenGl ES 還增加對 Uniform Buffer Object 的支持。
2、新版 GLSL ES 3.0 著色語言,支持 32 位整數和浮點數據類型以及操作。之前版本的著色語言只支持精度更低的,這樣雖然能夠加快計算的速度,所需的資源也更少,但當著色器的復雜度增加,出錯也隨之增加。同時,新版著色語言的語法更貼近 GLSL。
3、支持遮擋查詢(Occlusion Query)以及幾何體實例化(Geometry Instancing)。通過遮擋查詢,能夠讓 GPU 知道 3D 場景中,哪些物體被其它物體完全遮擋,這些完全被遮擋的物體 GPU 不會去渲染。幾何體實例化是通過對具有相同頂點數據的幾何體,賦予不同的空間位置、顏色或紋理等特征,從而創造出不同實例對象的技術。這兩個特性都能夠節 省硬件資源,提高 3D 圖形渲染的性能。
4、增加多個紋理的支持。包括浮點紋理、深度紋理、頂點紋理等等。
5、多重渲染目標(Multiple Render Targets),讓 GPU 一次性渲染多個紋理。
6、多重采樣抗鋸齒(MSAA Render To Texture),讓 3D 物體對邊緣不出現毛刺,可提升圖像效果。
7、使用統一的紋理壓縮格式 ETC:多年來阻礙 OpenGL 發展的一大頑疾,就是沒有統一的紋理壓縮格式,包括 S3TC、GPUs、PVPRTC、ETC 等等。因為沒有一個統一標準,開發者不得不因為不同的硬件環境而將紋理重復壓縮多次——尤其對于 Android 開發者而言,這個過程苦不堪言(對用戶來說也有大量的煩惱,比如安裝游戲數據包時需要自己來識別需要哪種材質的數據包)。顯然,統一紋理壓縮格式,能夠提 高開發者對開發效率。但現實中,統一標準這類事情的進展從來沒有快過。這視乎之后開發者與廠商會做出怎樣的反應。
Android 4.3 升級到 Open GL ES 無疑是一個好的開始,OpenGL ES 3.0 大量的新特性完全加持,將大幅提高移動平臺圖形特性,提高游戲圖形效果。