1. 程式人生 > >openGL ES3.0基礎簡介

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執行步驟

①查詢並初始化裝置商可用的顯示器

②建立渲染表面

③建立渲染上下文