• 沒有找到結果。

第二章 文獻探討

2.1 OpenGL ES

OpenGL ES 的發展源自 2003 年,為了 mobile 裝置在硬體上效能的受限,其 為 OpenGL 的簡化版本,做為一個免費且跨平台的嵌入式系統,應用包含了手機、

Pad 等。OpenGL ES 是繪圖硬體的軟體介面,為軟體及繪圖硬體中一個靈活強大 的 low-level interface

[12]。提供 programmer 指定物件與操作來完成高品質的

繪圖,尤其是 3D 的物件。大多的 OpenGL ES 需要繪圖硬體擁有 framebuffer,因 為 OpenGL ES 畫的物件包含點、線和多邊形,而這些都需要有 framebuffer 存在,

programmer 控制這些物件 render 到 framebuffer [ML08]。

目前最新的 OpenGL ES 發展到 3.X 的系列,然而對於開發人員該選擇哪個本 版作為開發程式使用呢?因此以下將介紹不同版本間的差異及其來由,以供開發 人員做選擇。

2.1.1 OpenGL ES 1.X

OpenGL ES 1.1 源自 OpenGL 1.5,除了包含功能強的 function 可以使用之 外也增加了一小部分,然而比起 OpenGL 為了輕量化的緣故,還是刪除了許多 function。

其中與 OpenGL 主要的差異包括 glBegin、glEnd 不支援,需改用 vertex array 的形式,polygon mode 和 antialised polygon rendering 也沒有支援,由於 Quad、

Polygon 可採用三角形繪圖達成,為了輕量化所以不支援,ARB_Image、bitmap 和 3D texture 不支援,還有許多如 frontbuffer、accumulation buffer、display

4

list、feedback 和 push/pop 等操作也都不支援 [22],另外,double-precision 的 API 沒支援,如 Rotated、Translated 等,須改用 single-precision 的 API 如 Rotatef、Translatef,其餘詳細的差異於可查參考文獻的 OpenGL ES 的規格 書 [BM08]。

圖 2.1:OpenGL ES 1.X pipeline。OpenGL ES 1.1 的固定管線提供了良好的 3D 應用,從 Transform and Lighting 頂點到 fragment 的 framebuffer [10]。摘錄 自 [13]。

所以什麼時候選擇此版本做為開發呢?由於固定管線(pipeline),彈性較 低,所以當需要開發的程式不需要太多程式碼便能實現,需求簡單的情況下,可 選擇 OpenGL ES 1.1 的版本來使用,其支援版本自 Android 1.0 開始。

2.1.2 OpenGL ES 2.X

OpenGL ES 2.0 發表自 2007 年,其源自 OpenGL 2.0,與先前版本相比,不 支援 OpenGL ES 1.1 的固定管線,它結合了 OpenGL Shading Language 擁有

5

programmable 靈活強大的 3D 繪圖管線來創造 shader 及 program 物件,能在 OpenGL ES Shading Language 中撰寫 vertex shader 和 fragment shader [13],

如此可以經由替換不同的 shader 輕易達到不同的 render 方式,例如盒子材質的 切換,不同的反光效果如金屬面則炫光很強,木頭則幾乎無炫光效果,另外搭配 貼圖的使用,便能營造出不同的感覺,此應用不論是展示模型產品或者在遊戲等 領域上都相當實用。

因為 OpenGL 2.0 programmable pipeline 的替換掉 OpenGL 1.x 的 fixed function transformation 和 fragment pipeline,使用 shader 最小化了花費及 能源。

圖 2.2:OpenGL ES 2.X pipeline。Fragment shader 取代了 OpenGL ES 1.x 的 texture environment、colour sum 等元件。摘錄自 [13]。

OpenGL ES 2.0 雖然並不是完全的兼容 OpenGL ES 1.x,但那些改變與移除 掉的功能可以用 shader 來做到

。因為對 shader 支援的關係,

OpenGL ES 2.0

6

功能很強大,對於開發 OpenGL ES 來講最為推薦,而本論文也是用採用此版本實 作之後探討的應用,其支援版本自 Android 2.2 開始。

2.1.3 OpenGL ES 3.X

OpenGL ES 3.0 的規格於 2012 年公開發表,來自 OpenGL 3.3 和 4.2 的功能,

除了兼容 OpenGL ES 2.0 之外,讓 applicatoin 增加了新的 visual features,

加強了管線包含遮蔽查詢(occlusion queries)、轉換回饋(transform feedback)、實

例渲染(instanced rendering)並支援多個 rendering 目標,全面支援整數及 32 位

元浮點數運算,更大大的加強了 texture 的功能,包含浮點數貼圖、3D 貼圖、

深度貼圖、頂點貼圖、無縫方盒貼圖等[14]。

GPU 方面,目前 ARM 及 Imagination 已經支援,NVIDIA 的 Tegra4 不支援 FP32,

要等到 Tegra 5 才能完全支援 [10],由於 OpenGL ES 3.0 才剛發表不久,Android 目前還未支援,預計到 Android 4.3 會開始支援 [2] 。

目前 Android 支援及使用上最推薦的版本為之援 shader 的 OpenGL ES 2.0,

不過 OpenGL ES 3.0 擁有貼圖及各項強大的功能,期望未來 Android 4.3 以後的 版本能支援!

相關文件