Shader学习之Cg语言三(Cg表达式与控制语句)

来源:互联网 发布:阿里云备案号申请 编辑:程序博客网 时间:2024/05/17 07:30

Cg中的操作符与C语言中很类似,所以下面我就只是记录操作符对应的符号,细节和用法看着符号就会了。
关系操作符:<,<=,!=,==,>=,>
逻辑操作符:&&,||,!
数学操作符: * 乘,/除,-取反, + 加,-减, % 求余, ++,–,*=,/=,+= , -=
移位操作符:>>,<< 移位操作符作用到向量上时只能是int类型
Swizzle 操作符:可以使用 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

注意, Cg 语言中 float a 和 float1 a 是基本等价的,两者可以进行类型转换; float 、 bool 、 half 等基本类型声明的变量也可以使用 swizzle 操作符。例如:

float a = 1.0;float4 b = a.xxxx;

注意: swizzle 操作符只能对结构体和向量使用,不能对数组使用,如果对数组使用 swizzle 操作符则会出现错误信息: error C1010: expression left of . ” x ” is not a struct or array 。要从数组中取值必须使用 [] 符号。例如:

float a[3] = {1.0,1.0,0.0};float b = a[0]; //正确float c = a.x; //编译会提示错误信息

条件操作符 : expr1 ? expr2 : expr3
例:

float3 h = float3(-1.0,1.0,1.0);float3 i = float3(1.0,0.0,0.0);float3 g = float3(1.0,1.0,0.0);float3 k;k = (h < float3(0.0,0.0,0.0))?(i):(g);

三元向量 h 与 float3(0.0, 0.0, 0.0) 做比较运算后结果为( true, false, false ) , 所
以 i 的第一个数据赋值给 K 的第一个数据, g 的第二个和第三个数据赋值给 k 的第二
个和第三个数据, K 的值为 (1.0, 1.0, 0.0) 。
操作符优先顺序
这里写图片描述
控制流语句:条件语句: if 、 if-else ;循环语句: while 、 for 。 break语句可以和在 for 语句中使用。
Cg 语言中的控制流语句要求其中的条件表达式返回值都是 bool 类型,这一点是与 C 语言不同之处( C 语言中,条件表达式返回值可以是 0 、 1 )
return 只能作为最后一条语句出现。函数的递归调用( recursion )在Cg 语言中是被禁止的。 Switch 、 casedefault 在 Cg 中作为保留关键字存在,但是它们目前不被任何 profile 所支持。

阅读全文
0 0
原创粉丝点击