在Cg中有两种变量:单一值(single values)和压缩数组(packed arrays)。
压缩数组的定义是类型 + 数字
例如float3,int4
压缩数组看起来跟普通的数组很像却又不一样,压缩数组的元素可以作为普通结构访问。
压缩数组中成员的访问及赋值
通常通过x,y,z,w访问
float4 a; a.x=2.0;
Cg也提供别名:r, g, b,a
这两种访问方式没有区别,但是不能混用,例如_Color.xgb
是错误的Cg允许压缩数组同时访问多个成员
o.Albedo = _Color.rgb;
允许重排这些元素的顺序,可以使用下面的代码交换颜色的红和蓝通道
_Color.rgb = _Color.bgr;
压缩数组可以被赋值单一值,它将拷贝给压缩数组的所有字段(涂抹smearing):
o.Albedo = 0; // Black =(0,0,0)
o.Albedo = 1; // White =(1,1,1)
- 也可以给压缩数组的部分成员赋值(蒙版masking)
o.Albedo.rg = _Color.rg;
压缩矩阵
Cg中允许类似于float4x4
的类型,这代表了一个4行4列浮点数的矩阵
- 你可以通过_mRC访问矩阵中的单一成员,这里的R代表行,C代表列
float4x4 matrix;
// ...
float first = matrix._m00;//访问matrix中第1行第1列的元素
float last = matrix._m33;//访问matrix中第4行第4列的元素
_mRC也可以被连接
float4 diagonal = matrix._m00_m11_m22_m33;
这里把矩阵中的四个元素赋值给了float4类型的变量选择矩阵的整行可以使用方括号[]
float4 firstRow = matrix[0];
// Equivalent to
float4 firstRow = matrix._m00_m01_m02_m03;