Shader中表达式和控制语句
2018-06-29 本文已影响108人
passiony
新手写Shader时经常困惑在Shader那些语法能用,那些不能用,很纠结,下面就对Shader中表达式和控制语句进行一些总结:
关系操作符
CG中有6种关系操作符:“<”、“<=”、“!=”、“==”、“>=”、“>”,这个就不用说明含义了吧。
CG语言表达式允许对向量使用关系操作,例如:
float3 A=float3(0.5,0.1,0.9);
float3 B=float3(0.6,-0.1,2.0);
bool3 c=A<B;
结果:float3(true,false,true)
注意被操作的两向量必须长度一致。
逻辑操作符
逻辑与:“&&”
逻辑或:“||”
逻辑非:“!”
跟C#操作类似。
数学操作符
CG中数学操作符有:乘法,/除法,-减法或取反,+加法,%取余;++,–,=,/=,+=,-=;
移位操作符
Cg 语言中的移位操作符,功能和 C 语言中的一样,也可以作用在向量上,但是向量类型必须是 int 类型
int2 a = int2(0.0,0.0);
int2 b = a>>1;
Swizzle操作符
可以使用 Cg 语言中的 swizzle 操作符( . )将一个向量的成员取出组成一个新的向量。
swizzle 操作符后接 x 、 y 、 z 、 w ,
分别表示原始向量的第一个、第二个、第三个、第四个元素; 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
swizzle 操作符只能对结构体和向量使用,不能对数组使用
条件操作符
expr1 ? expr2 : expr3;
控制流语句
条件语句有: if 、 if-else ;循环语句有: while 、 for 。 break语句可以和在 for 语句中使用。 Switch 、 case 和 default 在 Cg 中作为保留关键字存在,但是它们目前不被任何 profile 所支持。