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 所支持。

上一篇下一篇

猜你喜欢

热点阅读