算数操作符
(1)
GLSL操作符与优先级
操作符
|
描述
|
()
|
用于表达式组合,函数调用,构造
|
[ ]
|
数组下标,向量或矩阵的选择器
|
.
|
结构体和向量的成员选择
|
++ --
|
前缀或后缀的自增自减操作符
|
+ - !
|
一元操作符,表示正 负 逻辑非
|
* /
|
乘 除操作符
|
+ -
|
二元操作符 表示加 减操作
|
<> <= >= == !=
|
小于,大于,小于等于, 大于等于,等于,
不等于 判断符
|
&& || ^^
|
逻辑与 ,或, 异或
|
?:
|
条件判断符
|
= += –= *= /=
|
赋值操作符
|
,
|
表示序列
|
(2)
操作符重载
GLSL中大部分操作符都是经过重载的,也就是说他们可以用于多种类型的数据操作。
特别是,矩阵和向量的算数操作符,在GLSL中都是经过严格定义的
例如:如果我们需要进行向量和矩阵之间的乘法
vec3 v;
mat3 m;
vec3 r=v*m;
基本的限制条件:要求矩阵和向量的维度必须是匹配的!
这里有一个例外 简单说一下
两个向量相乘得到一个逐分量相乘的新向量,
但是两个矩阵相乘得到的是通常矩阵相乘的结果。
例如:
vec2 a,b,c;
c=a*b; //c=( a.x*b.x
,a
.y*b.y )
mat2 m,u,v;
m= u*
v;
//m=( u00*v00+u01*v10 u00*v01+u01*v11
u01*v00+u11*v10 u10*v01+u11+v11 );
(3)
控制流
GLSL
的逻辑控制方式也是用的
if
和
switch
,
if(){
}else{
}
switch(){
case:
break;
case:
break;
default :
break;
}
注意
:
如果没有使用
break
结尾,拿语句会继续执行
case
的内容。
(4)
循环语句
GLSL
的循环语句是
for
、
while
、
do{ }while
1.for
循环可以在循环初始化条件中声明循环迭代变量,迭代变量的作用于直线于循环内
for(int i=0
;
i<10
;
++i
)
{}
2.while
(
n<10
)
{….}
3.do{…...}while(n<10)
(5)
流控制语句
语句
|
描述
|
break
|
终止循环体的运行,并且继续执行循环体外的内容
|
continue
|
种植循环体内当前迭代过程的执行,跳转到代码块开始的部分并继续执行下一次迭代的内容
|
return
|
从当前例程返回,可以带有一个函数的返回值(返回值必须与函数声明的返回类型相符合)
|
dicard
|
丢弃当前片元,终止片元着色器执行(只能在片元着色器中使用,运行到该语句位置上时 片元着色器会立即终止)
|
(6)
函数声明
函数的作用:我们可以使用函数调用来取代可能反复执行的通用代码。
声明:
return Type functionName
(
[accessmodifier] type,…..
)
{
….
//
函数体
return returnValue
;
//
如果
returnType
为
void
,则不需要
return
语句;
}
注意
:
1.函数声明,变量名需要添加访问修饰符
2.GLSL支持用户自定义函数,同时它定义了一些内置函数
3.函数名称可以是任何字符、数字、下划线,但是不能使用数字,连续下划线或者gl_作为函数的开始
4.返回值可以是任何内置的GLSL类型,或者用户定义的结构体和数组类型。
5.返回值是数组时,必须现实的指定大小。函数返回类型是void则没有返回值
6.函数的参数也可以是任何类型的函数,包括数组(这里数组必须设置大小)
7.在使用一个函数前必须声明他的原型或者直接给出函数体。
8.GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
9.函数原型只是给出了函数的形式,但是并没有给出具体的实现内容
例如
:
float HornerEvalPolynomial(float coeeff[10] ,float x);