多语言展示
当前在线:871今日阅读:23今日分享:25

GPU图形与shader:[5]CG数据结构

本章将着重介绍Cg语言中预定义的内置(built in)的、或称为基本(primitive) 的数据类型。然后介绍可以用来声明对象的各类类型,主要是数组和结构类型。 学习本章时,需要体会内置向量类型和数组类型的区别。
基本数据类型
数组类型
1

数组数据类型在 Cg 程序中的作用是:作为函数的形参,用于大 量数据的转递。

2

数组和矩阵有些类似,但是并不是相同。 例如 4*4 阶数组的的声明方式为: float M[4][4];4 阶矩阵的声明方式为:float4x4 M。前者是一个数据结构,包含 16 个 float 类型数据,后者是一个 4 阶矩阵数据。float4x4 M[4],表示一个数组,包 含4个4阶矩阵数据。       进行数组变量声明时,一定要指定数组长度,除非是作为函数参数而声明的 形参数组。并且在当前的 profiles 中,数组的长度和所引用的数组元素的地址必 须在编译时就知道。

结构类型
1

一般来说,Cg 的源代码都会在文件首部定义二个结构体,分别用于定义输人 和输出的类型,这二个结构体定义与普通的 C 结构定义不同,除了定义结构体 成员的数据类型外,还定义了该成员的绑定语义类型( Binding Semantics),所谓 绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的。

2

Cg 支持的绑定语义类型包括 POSTION 位置),COLOR(颜色),NORMAL(法向 量),Texcoord(纹理坐标)等类型。

接口(Interfaces)类型
1

Cg 中的类型转换和 C 语言中的类型转换很类似。C 语言中类型转换可以是 强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度 转换。在 Cg 语言中也是如此  float a = 1.0;half b = 2.0;float c = a+b; //等价于 float c = a + (float)b;

2

当有类型变量和无类型常量数据进行运算时,该常量数据不做类型转换,举 例如下: 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 类型

注意事项
1

较长的向量还可以通过较短的向量进行构建: 向量初始化方式一般为: float4 array = float4(1.0, 2.0, 3.0, 4.0);

2

Cg 还提供矩阵数据类型,不过最大的维数不能超过 4*4 阶。

推荐信息