第一:在上一篇博客中,寫了shading language的基礎類型,現在說一下shading language的基礎類型的聲明,初始化和作用域問題.
1.聲明,作用域及初始化:
變量的聲明及作用域與C++語法類似,可以在任何需要的地方聲明,同時作用域也與C++類似,分爲局部變量和全局變量.如下:
int a , b; //全局變量a和b
vec3 aPosition = vec3(1.0 , 2.0 ,3.0); //全局變量並賦值
void myFunchtion(){
int c = 14;//局部變量c
a = 4;//全局變量賦值
b = a*c;
}
向量和矩陣的初始化還有一些技巧,如下:
float a = 12.3;
float b = 11.4;
vec2 va = vec2(2.1 , 2.2); //聲明二維向量並賦值
vec2 vb = vec2(a , b);
vec3 vc = vce3(vb , 11.1);//聲明三維向量並賦值
vec4 vd = vec4(va ,vb);
mat3 ma = mat3(vc , vc ,vc);//3X3矩陣
mat3 mb = mat3(2.1); //等同於{2.1 , 0 , 0 , 0 , 2.1 , 0 , 0 , 0 , 2.1}
2.變量初始化的規則:
a.常用初始化方式:變量可以在聲明的時候就初始化;
int a = 2 , b = 3 , c ;
b.限定符修飾的變量必須在聲明的時候初始化:
const float k = 1.1; //常量初始化
c.屬性變量,一致變量,易變變量在聲明的時候一定不能初始化:
attribute float angleSpan; //屬性變量不可初始化
uniform int l ; //一致變量不可初始化
varying vec3 position; //易變變量 不可初始化
1.索引:
float array[10]; //聲明一個大小爲10的數組
array[2];//拿到索引爲2的數據
vec3 position = vec3(1.0 , 2.0 , 3.0);
float one = positon[1]; //拿到索引爲1的數據
2.混合選擇:可以通過 " . "混合選擇;
vect4 color = vec4(0.3 , 0.4 , 0.5 , 0.6);
vec3 temp = color.agb; //實際數據(0.4 , 0.5 , 0.6)
vec4 temp1 = color.aaab;//實際數據(0.6 , 0.6 , 0.6 ,0.5)
3.算數運算符.包括(++ -- -(一元非) ! * / + -)
4.其他運算符:包括(< > <= >= == != && ^^ || ?: = += -= *= /=)
因爲3和4都和常規的編程語言一樣就不做多餘解釋了;
第三:類型轉換:
着色語言沒有提供類型自動提升,賦值表達式的兩個操作數類型必須完全相同.另外調用的函數的參數也要完全相同.而且着色語言沒有提供類型的強制轉換,只能通過構造函數實現;
float a = 1.0;
bool b = bool(a);
第四,限定符:着色器語言的限定符主要有如下幾個:
uniform mat4 uMVPMatrix;//一致變量修飾符uniform
attribute vec3 aPositon;//屬性變量修飾符attribute
varying vec4 aaColor;//易變變量修飾符varying
const int con = 5 ;//常量修飾符 const
第五,流程控制.
和常規的編程語言一樣,着色語言有if-else條件語句,while(do-while)循環語句和for循環語句.語法也基本一致.
第六:函數的聲明與使用:
基本格式如: <返回類型> 函數名 (<參數序列>) {/*函數體*/}
需要注意的是在着色語言中有三種特定的修飾符
a. in 代表的是輸入性參數
b. out 代表的是輸出型參數
c . inout 代表的是輸入輸出型參數
第七:片元着色器中的浮點變量精度指定,從低到高分別是lowp medium highp
lowp float color;//精度級別lowp
varying medium vec2 Coord;//精度級別medium
highp mat4 m;//精度級別medium