GPU图形与shader:[6]CG表达式与控制语句
按照操作符的功能可以划分为:关系操作符、逻辑操作符、条件操作
符。
关系操作符
- 01
关系操作符,用于比较同类型数据(不同类型的基础数据需要进行类型转换,不同长度的向量,不能进行比较)之间的大小关系或者等价关系。 Cg中有6种关系操作符,如表 1所示, 关系操作符运 bool类型。
- 02
关系操作符 功能 用法 < 小于 expr < expr <= 小于或等于 expr <= expr != 不等于 expr != expr == 等于 expr == expr >= 大于或等于 expr >= expr > 大于 expr > expr
- 03
Cg语言表达式允许对向量使用所有的boolean operator,如果 则被操作的两个向量的长度必须一致。表达式中向量的每个分量 运 bool类型的向量,长度和操作数向 float3 a = float4(0.5, 0.0, 1.0); float3 b = float4(0.6, -0.1, 0.9); bool3 c = a<b; 运 c的结果为float3(true, false, true);
逻辑运算符
- 01
Cg语言中有3种逻辑操作符(也被称为boolean Operators),如表 2所示,逻辑操作符运bool类型。 逻辑操作符 功能 用法 && 逻辑与 expr && expr || 逻辑或 expr || expr ! 逻辑非 !expr 表 2 逻辑操作符
- 02
有一点需要注意:Cg中的逻辑与(&&)和逻辑或(||)不存在C中的短路现象(shortcircuiting,即只用计算一个操作数的bool值即可),而是参与运算的操作数据都进行bool分析。
数学操作符
- 01
cg语言对向量的数学操作提供了内置的支持 Cg中的数学操作符有:*乘法/除法;-取反+加法; %求余;++; *=;/=;+=;-=;后面四运算被归纳到赋值运算符 不过它们实际上进行数学计算,然后进行赋值,所以这里也放入数学操作符中进行说明。
- 02
需要注意的是:求余操作符%。只能在int类型数据间进行,否则编译器会提 示错误信息: error C1021: operands to “%” must be integral.
移位操作符
- 01
Cg语言中的移位操作符,功能和C语言中的一样,也可以作用在向量上,但 是向量类型必须是int类型。例如: int2 a = int2(0.0,0.0); int2 b = a>>1;
Swizzle操作符
- 01
可以使用Cg语言中的swizzle操作符(.)将一个向量的成员取出组成一个新 的向量。swizzle操作符被GPU硬件高效支持。swizzle操作符后接x、y、z、w, 分别表示原始向量的第一个、第二个、第三个、第四个元素;swizzle操作符后接 r、g、b和a的含义与前者等同。不过为了程序的易读性,建议对于表示颜色值的 向量,使用swizzle操作符后接r、g、b和a的方式。 举例如下: float4(a, b, c, d).xyz 等价于 float3(a, b, c) float4(a, b, c, d).xyy 等价于 float3(a, b, b) float4(a, b, c, d).wzyx 等价于 float4(d, c, b, a) float4(a, b, c, d).w 等价于 float d
- 02
要从数组中取值要用[]符号。例如: float a[3] = {1.0,1.0,0.0}; float b = a[0]; //正确 float c = a.x; //编译会
条件操作符
- 01
条件操作符的语法格式为: expr1 ? expr2 : expr3; expr1的计算结果为true或者flase,如果是true,则expr2执行运算,否则 expr3 被计算。
运算符优先级
- 01
Cg语言中操作符的优先顺序如表 3所示,从上到下表示从高级到低级的优 先级;同一行的操作符具有同等优先级。该表参考了Cg教程_可编程实时图形权 威指南第3.3.1节。 操作符 结合律 功能 () [] -> . 从左到右 函数调用、数组引 用、结构引用、成员 选择 ! ~ ++ - + - * & 从右到左 一元操作符:取反、 (type) sizeof 增加、减少、正号、 负号、间接、地址、 转换 * / % 从左到右 乘法、除法、余数 + - 从左到右 加法、减法 << >> 从左到右 移位操作符 < >= > >= 从左到右 关系操作符 == != 从左到右 等于,不等 & 从左到右 位操作符与 ^ 从左到右 位操作符异或 | 从左到右 位操作符或 && 从左到右 逻辑与 || 从左到右 逻辑或 ?: 从右到左 条件表达式 = += -= *= /= %= 从右到左 赋值、赋值表达式 &= ^= != <<= >>= , 从左到右 逗号操作符
控制流语句
- 01
程序最小的独立单元是语句(statement),语句一般由分号结尾,缺省情况 下,语句是顺序执行的,但是当涉及逻辑判断控制时,就要求有控制流程序语句。 控制流程序语句分为条件语句和循环语句,在C语言中,条件语句有if、if-else、 switch等,而循环过程则由while、do-while和for语句支持。Cg中的控制流语句和 循环语句与C语言类似:条件语句有:if、if-else;循环语句有:while、for。break 语句可以和在for语句中使用。
- 02
Cg语言中的控制流语句要求其中的条件表达式返回值都是bool类型,这一点 是与C语言不同之处(C语言中,条件表达式返回值可以是0、1) vs_2_x, vp30和vp40这些profile支持分支指令(又称转移指令,branch instruction),for和while循环指令在这些profile中被完全支持。在文献【3】中提 到:
- 03
profiles中,for和while循环只有当确切的知道循环次数时才能被使用”。但经过试验,如果使用“ fp40和ps_3_0之前的”片段profiles编译含义for, while语句时会出现错误提 error c6003:instruction limit of exceeded……。因此,如果没有确切的把握,不要在低级的profiles中使用循环控制语句。 同样,return只能作为最后一条语句出现。函数的递归调用(recursion)在 Cg语言中是被禁止的。Switch 、case和default在Cg中作为保留关键字存在,但 是它们目前不被任何profile所支持。