1、GLSL操作符与优先级
操作符 | 描述 |
() | 用于表达式组合,函数调用,构造 |
[] | 数组下标,向量或矩阵的选择器 |
. | 结构体和向量的成员 |
++ -- | 前缀或后缀的自增自减操作符 |
+ - ! | 一元操作符 表示正 负 逻辑非 |
* / | 乘 除操作符 |
+ - | 二院操作符 表示加 减操作 |
< > <= >= == != | 判断符 小于 大于 小于等于 大于等于 等于 不等于 |
&& || ^^ | 逻辑与 或 异或 |
?: | 条件判断符 |
= += -= *= /= | 赋值运算符 |
, | 表示序列 |
2、操作符重载
例如:向量与矩阵之间的乘法
vec3 v;
mat3 m;
vec3 r=v*m; //注意:矩阵和向量的维度必须匹配!
3、控制流
if(){}else{}
switch(){
case:break;
default:break;
}
4、循环语句
for(int i=0;i<10;i++){}
while(){}
do{}while();
5、流控制语句
break;
return;
continue;
discard:丢弃当前片元,终止片元着色器执行(只能在片元着色器中使用,只要运行到该语句,那片元着色器就会立即终止)
6、函数声明
a、函数声明,变量名必须添加访问修饰符;
b、GLSL支持用户自定义函数,同时它定义了一些内置函数
c、函数名称可以是任何字符、数字、下划线,但不能使用数字、连续下划线以及gl_作为函数的开始
d、返回值可以是任何类型的GLSL类型,或者用于定义的结构体和数组类型
e、返回值是数组是,必须现实的指定大小。函数返回类型为void则没有返回值
f、函数的参数也可以是任何类型的函数,包括数组(这里的数组必须设置大小)
g、在使用一个函数前必须声明他的原型或者直接给出函数体。
h、GLSL的编译器在使用函数前必须找到函数的声明,否则会产生错误
i、函数原型只是给出了函数的形式,但是并没有给出具体的实现内容
6、案例:
unifrom mat uMVPMatrix;//总变化矩阵
attribute vec3 aPosition;//顶点数据
attribute vec2 atexCoor;//纹理数据
varying vec2 vTextureCood;//传递片元着色器的变量
void positionShift(){
gl_Position=uMVPMatrix*vec4(aPosition,1);
}
void main(){
//主函数
positionShift();
vTextrueCoord=aTexCoor;
}