数据结构
基本数据类型
前6 种类型会经常用到,事实上在Wikipedia 有关Cg 语言的阐述中只列举
了前6 种类型,而并没有提到string 数据类型。
注意:Cg 中向量、矩阵与数组是完全不同,向量和矩阵是内置的数据类型
(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型!这一点和
C\C++中不太一样,在C\C++中,这三者同属于数据结构,数组可以构建向量和
矩阵。
向量
内置的向量数据类型
Cg还提供了内置的向量数据类型(built-in vector data types),内置的向量数据类型基于基础数据类型。例如:float4,表示float 类型的4 元向量;bool4,表示bool类型4 元向量。
表达颜色使用fixed就足够了
注意:向量最长不能超过4元,即在cg程序中可以声明float1、float2、float3、float4类型的数组变量,但是不能声明超过4元的向量。
向量的初始化
向量初始化方式一般为:
float4 array = float4(1.0, 2.0, 3.0, 4.0);
较长的向量还可以通过较短的向量进行构建:
float2 a = float2(1.0, 1.0);
float4 b = float4(a, 0.0, 0.0);
另类的使用
float2 a = float2(1.0, 1.0);
float4 b = float4(a.xy, 1.0, 1.0);
float4 c = float4(a.xyxx);
矩阵
cg还提供矩阵数据类型,不过最大的维数不能超过4阶
float1x1 matrix1;//等价于float matirx1; x 是字符,并不是乘号!
float2x3 matrix2;// 表示23 阶矩阵,包含6 个float 类型数据
float4x2 matrix3;// 表示42 阶矩阵,包含8 个float 类型数据
float4x4 matrix4;//表示44 阶矩阵,这是最大的维数
矩阵的初始化方式为:
float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
swizzle操作
结构体
Cg 语言支持结构体(structure),实际上Cg 中的结构体的声明、使用和C++
非常类似(只是类似,不是相同)。一个结构体相当于一种数据类型,可以定义
该类型的变量。引入结构体机制,赋予了Cg 语言一丝面向对象的色彩。还记得
C++中,结构体与类的区别吗?没有区别,除了默认访问属性在结构体中为
public,类中为private,所以结构体与类是非常近似的,由此可以看出shader 语
言的发展趋势还是向着具有面向对象特性的高级语言。不过目前的Cg 语言中的
结构体以展现“封装”功能为主,并不支持继承机制。
结构体的声明以关键字struct开始,然后紧跟结构体的名称,接下来是一个大括号,并以分毫结尾(不要忘了分号)。大括号中是结构体的定义,分为两大类:成员变量和成员函数。例如,定义一个名为myAdd的结构体,包含一个成员变量,和一个执行相加的功能的成员函数,然后声明一个该结构体类型的变量。
struct myAdd
{
float val;
float add(float x)
{
return val + x;
}
};
注意:在当前的所有的profile 版本下,如果结构体的一个成员函数使用了
成员变量,则该成员变量要声明在前。此外,成员函数是否可以重载依赖于使用
的profile 版本
一般来说,cg的源代码都会在文件首部定义两个结构体,分别用于定义输入和输出的类型,这两个结构体定义与普通的c结构定义不同,除了定义结构体成员的数据类型外,还定义了该成员的绑定语义类型,所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的。目前cg支持的绑定语义类型包括postion位置,color颜色、normal法向量、texcoord纹理坐标等类型。
当顶点着色程序向片段着色程序传递的数据类型较多的情况下,使用结构体可以大大的方便代码的编写和维护。总而言之,使用结构体是一个好习惯,高智商的孩子都使用。
类型转换
cg中的类型转换和c语言中的类型转换很类似。c语言中类型转换可以是强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。在cg语言中也是如此
float a = 1.0;
half b = 2.0;
float c = a+b; //等价于float c = a + (float)b;
当有类型变量和无类型常量数据进行运算时,该常量数据不做类型转换,举
例如下:
float a = 1.0;
float b = a + 2.0; //2.0 为无类型常量数据,编译时作为float 类型
Cg 语言中对于常量数据可以加上类型后缀,表示该数据的类型,例如:
float a = 1.0;
float b = a + 2.0h; //2.0h 为half 类型常量数据,运算是需要做类型转换
常量的类型后缀(type suffix)有3 种:
? f :表示 float;
? h: 表示 half;
? x: 表示 fixed