openGL ES3.0基礎簡介
一、openGL與openGL ES
1.openGL刪除任何冗餘得到openGL ES,保留最實用的方法
①適用裝置:手持和嵌入式為目標的高階3D圖形API
②openGLES優化:降低電源消耗、著色器處理效能提升(引入精度限定符)
二、基本概念及專有名詞
1.基礎名詞
①3D物體:任何物體,其幾何形狀都是由三角形組成的。三角形,或者任何圖形,都由頂點組成。
圖:物體物件、三角形、頂點
②頂點(vertex):具有空間座標和其他資訊(如顏色和紋理座標)的點
圖:具有棋盤格結構的立方體
③紋理(texture):對映到3D物體表面的影象,這會造成該物體由某種材料組成的幻覺。物體的頂點儲存著紋理座標(2維向量),用於指定紋理如何對映到任何給定表面。一個表面用到的紋理可能需要幾百萬個簡單三角形紋理實現。
圖:塊結構三角形的紋理座標
2.圖形管線
即渲染流水線,將資料從3D場景轉換成2D影象,最終在螢幕上顯示出來的總過程。主要分為三個階段:應用階段、幾何階段和光柵階段。
圖:3D影象渲染管線
幾何階段:解析3D位置到螢幕位置→計算屬性
光柵階段:光柵三角形→三角形上頂點屬性插值→陰影畫素→解決能見度
<1>應用階段:
主要是CPU與記憶體打交道,例如碰撞檢測,計算好的資料(頂點座標、法向量、紋理座標、紋理)就會通過資料匯流排傳給圖形硬體 。
<2>幾何階段:
這個階段也被稱為“變換和光照”階段。為了從3D場景轉換到2D,場景中的所有物體都需要轉換到幾個空間。每個空間都有自己的座標系。這些轉換是通過一個空間的頂點轉換到另一個空間的頂點來實現的。
①法向量
三維平面的法線是垂直於該平面的三維向量。曲面在某點P處的法線為垂直於該點切平面(tangent plane)的向量。
法線是與多邊形(polygon)的曲面垂直的理論線,法線決定著曲面與光源(light source)的濃淡處理(Flat Shading),對於每個點光源位置,其亮度取決於曲面法線的方向。
如果一個非零向量n與平面a垂直,則稱向量n為平面a的法向量。
②光照(lighting):
幾何階段的主要部分。是使用物體表面的法向量來計算的。通過攝像機的位置和光源的位置,可以計算出給定頂點的光照屬性。
圖:計算光照
N: 表面法向量 P:平面上的某個點
③視錐圖
圖:相機\眼睛 檢視折線及裁剪平面
近裁剪面、視錐檢視、遠裁剪面
④檢視空間到平面空間轉換
圖:從檢視空間轉到平面空間
<3>光柵階段
將連續的資料轉化成離散的資料。這裡光柵階段是指向量圖形轉化成畫素點的過程。
①片元:GPU需要遍歷2D影象並進行轉換將資料轉化為大量“畫素候選”,轉換的畫素候選即為片元(Fragment),片片元是包含位置,顏色,深度,紋理座標等屬性的資料結構。
②插值(Interpolation):從分配給每個圖元頂點的頂點著色器輸出生成每個片段值的機制。
圖:光柵化三角形並插值其顏色值
圖:光柵化階段輸入和輸出
<4>可程式設計步驟
圖形管線中可程式設計的步驟只有:頂點著色器和片元著色器
圖:openGL ES3.0圖形管線
①頂點著色器
實現了頂點操作的通用可程式設計方法;
【1】輸入:
a.著色器程式:描述頂點上執行操作的頂點著色器程式原始碼或者可執行檔案;
b.頂點著色器輸入(屬性):頂點陣列提供的每個頂點資料;
c.統一變數(uniform):頂點著色器使用的不變資料;
d.取樣器:代表頂點著色器使用紋理的特殊統一變數型別。
【2】輸出:頂點著色器輸出變數,作為片元著色器的輸入。
【3】示例:
#version 300 es
uniform mat4 u_mvpMatrix; //將位置從模型空間轉化為規範化裝置空間的矩陣
//輸入到頂點著色器的屬性
in vec4 a_position; //位置值
in vec4 a_color; //頂點顏色
//頂點著色器的輸出作為片元著色器的輸入
out vec4 v_color;
void main()
{
v_color = a_color;
gl_Position = v_mvpMatrix * a_position; //內建變數gl_Position,存變換後的位置資訊
}
②片元著色器
為片段上的操作實現了可程式設計方法;
【1】片元著色器輸入:
a.片元著色器程式:描述片段上所執行操作的片段著色器程式原始碼或者可執行檔案
b.輸入變數:光柵化單元用插值為每個片段生成的頂點著色器輸出
c.統一變數:片段或者頂點著色器使用的不變資料
d.取樣器:代表片段著色器所用紋理的特殊統一變數型別
【2】輸出:一個或者多個顏色值。
【3】示例:
#version 300 es
precision mediump float;
in vec4 v_color; //從頂點著色器輸出得到的頂點顏色
out vec4 fragColor; //輸出片元顏色
void main()
{
fragColor = v_color;
}
三、EGL作用
EGL是Khronos渲染API(如:OpenGL ES)和原生視窗系統之間的介面。
注意:實現OpenGL ES時,無提供EGL的硬性需求(如:IOS就支援OpenGL但不支援EGL)。
<1>OpenGL ES命令需要渲染上下文和繪製表面
渲染上下文:儲存相關的OpenGL ES狀態;
繪製表面:用於繪製圖元的表面,制定渲染所需的緩衝區型別(如:顏色緩衝區、深度緩衝區、模板緩衝區),還需制定所需的位深度。
<2>渲染前EGL執行步驟
①查詢並初始化裝置商可用的顯示器
②建立渲染表面
③建立渲染上下文