OpenGL ES着色器语言的程序块基本构成如下:
语句和声明
函数定义
选择(if-else)
迭代(for, while, do-while)
跳跃(discard, return, break, continue)
着色器是由一系列全局声明和函数定义组成的。函数声明规范如下:
// prototype
returnType functionName (type0 arg0, type1 arg1, ..., typen argn);
函数定义规范如下:
// definition
returnType functionName (type0 arg0, type1 arg1, ..., typen argn)
{
// do some computation
return returnValue;
}
数组可以作为参数,但是不能作为返回值。当把数组作为形参时,数组的元素个数也必须同时传进去。数组作为实参传进函数时,只使用函数的名称即可,不要带下标。
结构体也可以作为参数,返回值也可以是不包含数组的结构体。
main函数是着色器的入口函数。顶点和片元着色器必须包含一个main函数。它没有参数,也没有返回值,而且必须声明为void。
函数通过值返回的方式被调用。这意味着,在调用时输入参数被拷贝进函数,在函数退出前输出参数被拷贝出给调用者。
函数声明或定义中控制参数拷进还是拷出的方法如下:
着色语言的条件控制流使用if 或 if-else:
if (bool-expression)
true-statement
或者
if (bool-expression)
true-statement
else
false-statement
while和do循环规范如下:
for (for-init-statement; condition(opt); expression)
statement-no-new-scope
while (condition)
statement-no-new-scope
do
statement
while (expression)
for循环的condition语句是可选的,没有该语句的话默认为true。
continue;
break;
return;
return expression;
discard; // in the fragment shader language only
没有goto语句。
continue只能用在循环中,程序执行到continue得时候会自动舍弃后面的操作而进入下一次循环。
break;也只能用在循环中,作用是直接跳出其所在的那层循环。
discard关键字只能使用在片元着色器中。它用在片元着色器中来放弃对当前片元的操作。这个关键字导致片元直接被忽略并且不会更新任何缓冲区。最典型的用法是在一个条件语句中,如:
if(indensity < 0.0)
discard;
片元着色器可能会测试一个片元的alpha值,并根据测试忽视片元。
需要注意的是着色器执行后会出现覆盖测试(coverage test),覆盖测试可以改变alpha的值。
return语句直接导致退出当前函数。