一:簡介:
OpenGL ES 着色語言是一種高級的圖形編程語言.其源自應用廣泛的C語言,同時具有RenderMan以及其他編程語言的一些優良特性.
與傳統的語言不同的是,他提供了更加豐富的原生類型,比如向量,矩陣等.OpenGL ES着色語言的特性如下:
1.Open GL着色語言是一種高級的過程語言(不是面向對象)
2.對於頂點着色器,片元着色器使用的是同樣的語言,不區分.
3.基於C/C++的語法及流程控制
4.完美支持向量與矩陣的各種操作
5.通過類型限定符管理輸入和輸出
6.擁有大量的內置函數,提供的功能豐富.
有人總結說過,OpenGL ES着色語言是一種易於實現,功能強大,便於使用,完美支持硬件靈活性,並且可以高度並行處理,性能優良的高級圖形編程語言.因此,3D開發的話,掌握着色語言就變得尤爲重要了.
二:着色語言基礎:
雖然OpenGL ES的着色語言是基於C/C++的,但是還是有很多不一樣的地方的.比如說,該語言不支持雙精度(double),字節型(byte),短整型(short),長整形(long),並且取消了C的聯合體(union),
枚舉型(enum),無符號整形(unsigned)以及位運算等特點.
1.標量:標量在着色語言中被稱爲是 無向量 .只有大小,沒有方向.運算尊選代數運算.主要類型有三個
布爾型:bool bool b;//申明一個布爾值
整形:int int i;//申明一個整形
浮點型:float float f;//申明一個浮點型
2.向量:可以理解爲是用同樣類型的標量組成,基本類型爲bool,int,float三種.每個向量是有兩個,三個,四個相同的標量組成的.
vec2 : 包含兩個浮點數的向量;
vec3 : 包含三個浮點數的向量;
vec4 : 包含四個浮點數的向量;
ivec2 :包含兩個整形數的向量;
bvec4 : 包含四個布爾型的向量;
特殊的一個點:當把向量看作顏色的時候,可以使用r g b a 四個分量,代表紅 綠 藍 透明度,如:
aColor.r = 0.6 ; //給向量aColor指定紅色分量
aColor.a = 0.6 ; //給向量aColor指定透明度分量
當把向量看作座標位置時可以使用x y z w四個分量,用法如顏色.
當把向量看作紋理座標時,可以使用s t p q四個分量,用法如顏色.
此處,除了使用 . 作爲加分量名外,還可以使用數組的方式實現,如:
aColor[0] = 0.6; // 給向量aColor指定紅色分量
需要注意的是,一次只能使用一組分量,比如使用r g b a 的時候,不能混合 x y z w.
3.矩陣:矩陣,平凡用於3D中的旋轉,縮放,平移等,因此,矩陣支持就顯得很必要了.
mat2 : 2 X 2 的浮點數矩陣;
mat3 : 3 X 3 的浮點數矩陣;
mat4 : 4 X 4 的浮點數矩陣;
在着色語言中,矩陣是按照順序組織的,也就是說可以看作是幾個列向量組成.比如,mat3就是由3個vec3組成的.
在取值的時候,比如matrix是一個mat3的矩陣,那麼matrix[1]就渠道的是這個矩陣的第二列,爲一個vec3向量.matrix[1][1]取到的是第二行第二列的數,是一個float型.
4.採樣器:不同與C語言的基本數據類型,採樣器專門用來進行紋理採樣.一個採樣器代表一副或一套紋理貼圖.
sampler2D : 用於訪問2維紋理;
sampler3D : 用於訪問3維紋理;
samplerCube : 用於訪問立方貼圖紋理;
5.結構體:自定義結構體,如C語言,關鍵詞使用struct,例如:
struct info {
vec3 color;
vec3 position;
vec2 textureCoor;
}
6.數組:
vec3 position[20] ; //申明一個包含20個vec3的數組
vec3 position[] ; //申明一個大小不固定的數組
postion[3] = vec3(3.0) ; //position的大小需要是4
7.空類型:空類型使用void,例如:
void main() { }