OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,針對手機、PDA和遊戲主機等嵌入式設備而設計。該API由Khronos集團定義推廣,Khronos是一個圖形軟硬件行業協會,該協會主要關注圖形和多媒體方面的開放標準。編程
一個用來渲染圖像的OpenGL程序須要執行的主要操做以下所示:數組
OpenGL是使用客戶端 - 服務端的形式實現的,咱們編寫的應用程序能夠看作客戶端,而計算機圖形硬件廠商所提供的OpenGL實現能夠看作服務端。緩存
OpenGL ES當前主要版本有1.0/1.1/2.0/3.0/3.1。函數
OpenGL ES版本 | Android版本 | 描述 |
---|---|---|
OpenGL ES1.0 | Android 1.0+ | OpenGL ES 1.x是針對固定硬件管線的,Android 1.0和更高的版本支持這個API規範。 |
OpenGL ES2.0 | Android 2.2(API 8)+ | OpenGL ES 2.x是針對可編程硬件管線的,不兼容OpenGL ES 1.x,Android 2.2(API 8)和更高的版本支持這個API規範。 |
OpenGL ES3.0 | Android 4.3(API 18)+ | 向下兼容OpenGL ES 2.x,Android 4.3(API 18)及更高的版本支持這個API規範。 |
OpenGL ES3.1 | Android 5.0 (API 21)+ | 向下兼容OpenGL ES3.0/2.0,Android 5.0(API 21)和更高的版本支持這個API規範 |
OpenGL ES 3.0實現了具備可編程着色功能的圖形管線,由兩個規範組成:OpenGL ES 3.0 API 規範
和OpenGL ES着色語言3.0規範(OpenGL ES SL)
。post
圖中藍色方框表明OpenGL ES 3.0中管線的可編程階段。測試
頂點着色器實現了頂點操做的通用可編程方法。spa
頂點着色器的輸入包括:設計
頂點着色器的輸出在OpenGL ES 2.0中稱爲可變(varying)變量,但在OpenGL ES 3.0中更名爲頂點着色器輸出變量。code
頂點着色器能夠用於經過矩陣變換位置、計算照明公式來生成逐頂點顏色以及生成或者變換紋理座標等基於頂點的傳統操做。orm
頂點着色器取得一個位置及相關的顏色數據做爲輸入屬性,用一個 4x4矩陣變換位置,並輸出變換後的位置和顏色。
#version 300 es // OpenGL ES版本信息
uniform mat4 u_mvpMatrix; // 同一變量u_mvpMatrix,它存儲組合的模型視圖和投影矩陣。
// 描述頂點着色器的輸入
in vec4 a_postion; // 輸入頂點位置屬性
in vec4 a_color; // 輸入頂點顏色屬性
out vec4 v_color; // 存儲描述每一個頂點顏色的頂點着色器輸出
void main(){ // 主函數
v_color = a_color; // 讀入頂點屬性輸入a_color,並將其寫入頂點輸出顏色v_color
gl_Position = u_mvpMatrix * a_postion // gl_Position是自動生成的,將變換後的頂點位置寫入gl_Position輸出
}
複製代碼
圖元(Primitive)是三角形、直線或者點精靈等幾何對象。圖元的每一個頂點被髮送到頂點着色器的不一樣拷貝。在圖元裝配期間,這些頂點被組合爲圖元。
對於每一個圖元,必須肯定圖元是否位於視椎體(屏幕上可見的3D空間區域)內。若是沒有徹底在視錐體內,則可能須要進行裁剪。若是圖元徹底處於該區域以外,它就會被拋棄。裁剪以後,頂點位置被轉換爲屏幕座標。裁剪和淘汰後,將數據傳給下一階段 - 光柵化階段。
在此階段繪製對應的圖元(點精靈、直線或者三角形)。光柵化是將圖元轉化爲一組二維片斷的過程,而後,這些片斷由片斷着色器處理。這些二維片斷表明着可在屏幕上繪製的像素。
片斷着色器片斷着色器爲片斷上的操做實現了通用的可編程方法。
對光柵化階段生成的每一個片斷執行這個着色器,採用以下輸入:
#version 300 es // OpenGL ES版本信息
precision mediump float; // 設置默認的精度限定符
in vec4 v_color; // 描述片斷着色器的輸入
out vec4 fragColor; // 片斷着色器輸出變量的聲明
void main(){
fragColor = v_color;
}
複製代碼
在這個階段中會對一個片斷進行各類測試,來決定它是否可見。若是一個片斷成功經過了全部測試,那麼它就會被直接繪製到幀緩存中了, 它對應的像素的顏色值會被更新,若是開啓了融合模式,那麼片斷的顏色會與該像素當前的顏色相疊加,造成一個新的顏色值並寫入幀緩存中。
參考: 《OpenGL編程指南第8版》 《OpenGL ES 3.0編程指南》