OpenGL ES着色器语言之语句和结构体(官方文档第六章)

       OpenGL ES着色器语言的程序块基本构成如下:

语句和声明

函数定义

选择(if-else)

迭代(for, while, do-while)

跳跃(discard, return, break, continue)


6.1函数定义

        着色器是由一系列全局声明和函数定义组成的。函数声明规范如下:

                  // 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。

6.1.1  函数调用约定

       函数通过值返回的方式被调用。这意味着,在调用时输入参数被拷贝进函数,在函数退出前输出参数被拷贝出给调用者。

       函数声明或定义中控制参数拷进还是拷出的方法如下:

  • 关键字in用来说明参数是拷进参数,不能拷出
  • 关键字out用来说明参数是拷出参数,不能拷进
  • 关键字inout用来说明参数既可以是拷进参数,也可以使拷出参数
  • 没有使用修饰符的函数参数默认为指定in


6.2  选择

        着色语言的条件控制流使用if 或 if-else:

if (bool-expression)
         true-statement


或者


if (bool-expression)
         true-statement
else
         false-statement


6.3  迭代

         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。


6.4  跳跃语句

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语句直接导致退出当前函数。







你可能感兴趣的:(测试,prototype,文档,语言,shader)