OpenGLES2.0著色器語言glsl
OpenGLES2.0中是強制使用可程式設計的渲染管線的,使用的是glsl著色器語言,因為著色器語言是使用的GPU,即圖形處理單元,而不是CPU,這樣可以使CPU從繁重的幾何計算和畫素的處理中解脫出來了。這就加大了處理的速度。
下面的這篇教程是轉載的。原文地址如下,感謝作者manyou
http://www.apkbus.com/blog-99192-39382.html
一、著色語言基礎
資料型別概述
1. 標量
標量也被稱為“無向量”其值只有大小,並不具有方向。標量之間的運算遵循簡單的代數法則,如質量、密度、體積、時間以及溫度等都屬於標量。OpenGL ES著色語言支援的標量型別有布林型(bool)、整形(int)和浮點型(float)。
2. 向量
OpenGL ES著色語言中,向量可以看做是用同樣型別的標量組成,其基本型別也分為bool、int和float三種。每個向量可以由2個、3個、4個相同的標量組成,具體情況如下:
向量型別 | 說明 | 向量型別 | 說明 |
vec2 | 包含了2個浮點數的向量 | ivec4 | 包含了4個整數的向量 |
vec3 | 包含了3個浮點數的向量 | bvec2 | 包含了2個布林數的向量 |
vec4 | 包含了4個浮點數的向量 | bvec3 | 包含了3個布林數的向量 |
ivec2 | 包含了2個整數的向量 | bvec4 | 包含了4個布林數的向量 |
ivec3 | 包含了3個整數的向量 |
向量在著色器程式碼的開發中有著十分重要的作用,可以很方面的儲存以及儲存顏色、位置、紋理座標等不僅包含一個組成部分的量。開發中,有時可能需奧單獨訪問向量中的某個分量,基本的語法為“<向量名>.<分量名>”,根據目的的不同,主要有以下幾種用法:
將一個向量看做顏色時,可以使用r,g,b,a四個分量名,分別代表紅、綠、藍、透明度4個色彩通道。具體用法如下:
[程式碼]xml程式碼:
12 | //給向量aColor的紅色通道賦值 aColor.r = 0.6; |
將一個向量看做位置時,可以使用x,y,z,w等4個分量名,分別代表X軸,Y軸,Z軸和向量的模四個分量,具體用法和顏色類似。
將一個向量看做紋理座標時,可以使用s,t,p,q四個分量名,期分別代表紋理座標的不同分量,具體用法同顏色。(對紋理座標中的s,t等分量巴友可能不是很明白,不用擔心,在後面介紹紋理貼圖的教程會進行詳細的介紹)
訪問向量中的各個不同的分量不但可以採用“.”加上不同的分量名,還可以將向量看做一個數組,用下標來進行訪問,具體用法如下:
[程式碼]xml程式碼:
12 | //給向量aColor的紅色通道賦值 aColor[0] = 0.6; |
3. 矩陣
有一些基礎的開發人員都知道,3D場景中的移位、旋轉、縮放等變換都是由矩陣的運算來實現的。因此3D場景的開發中會非常多的使用矩陣,矩陣按尺寸分為2x2矩陣、3x3矩陣、4x4矩陣,具體情況如下表所示:
矩陣型別 | 說明 |
mat2 | 2x2浮點數矩陣 |
mat3 | 3x3浮點數矩陣 |
mat4 | 4x4浮點數矩陣 |
對於矩陣的訪問,可以講矩陣作為列向量的陣列來訪問。如matrix為一個mat4,可以使用matrix[2]取到該矩陣的第三列,其為一個vec4;也可以使用matix[2][2]取得第三列向量的第3個分量。
4. 取樣器
取樣器是著色語言中不同於C語言的一種特殊的基本資料型別,其專門用來進行紋理取樣的相關操作。一般情況下,一個取樣器變數代表一幅或一套紋理貼圖,其具體情況如下:
取樣器 | 說明 |
sampler2D | 用於訪問二維紋理 |
smapler3D | 用於訪問三維紋理 |
samplerCube | 用於訪問立方貼圖紋理 |
需要注意的是,與前面介紹的幾種變數不同,取樣器變數不能再著色器中初始化。一般情況下采樣器變數都用uniform限定符來修飾,從宿主語言(如java)接受傳遞進著色器的值。
5. 結構體
OpenGL ES著色語言還提供了類似C語言中的使用者自定義結構體,同樣也是使用struct關鍵字進行宣告。其基本用法如下:
[程式碼]xml程式碼:
12345 | struct info{ vec3 color; vec3 position; vec2 textureCoor; } |
6. 陣列
宣告陣列的方式主要有兩種,
在宣告陣列的同時,指定陣列的大小:
[程式碼]xml程式碼:
1 | vec3 position[20]; |
在宣告陣列時,也可以不指定陣列的大小,但是必須符合下列兩種情況之一。
u 引用陣列之前,要再次使用第一種宣告方式來生命該陣列:
[程式碼]xml程式碼:
1234 | //聲明瞭一個大小不定的vec3陣列 vec3 position[];
|