第一:在上一篇博客中,写了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