程序流程控制
分支与循环
if和if-else语句
1 | float distance = 0.7; |
TIP1:
判断式中不可以使用布尔值类型矢量。
TIP2:
GLSL ES中没有 switch语句。
for语句
1 | int sum = 0; |
continue、break、discard语句
continue
1 | for(int i = 0; i<10; i++){ |
break
1 | for(int i = 0;i<10;i++){ |
discard
只能在Fragment shader中使用,表示放弃当前片元直接处理下一个片元。
函数
函数声明
1 | 返回类型函数名 (type0 arg0, type1 arg1, ..., typen argn){ |
如果没有return语句,一定要声明函数是void类型。
注意:
GLSL ES不允许递归调用,这是为了便于编译器对函数进行内联展开。
小例子:将RGBA颜色值转化为亮度值的函数
1 | float luma(vec4 color){ //函数声明 |
规范声明
如果在函数声明之前就进行调用,
必须在调用之前进行 规范声明。
规范声明的目的在于:
告诉WebGL系统函数的参数、参数类型、返回值等等。
1 | float luma(vec4); //规范声明 |
参数限定词
参数限定词可以用来控制参数的行为,大体上包括:
- 传入函数的
- 要被赋值并传出函数的
- 要被传入、赋值、传出函数的
in是默认的参数限定字。
使用参数限定词重写luma函数
1 | void luma(in vec3 color, out float brightness){ |
内置函数