文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体、斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!
“General-purpose arrays can only be used as uniform parameters to a vertex program. The intent is to allow an application to pass arrays of skinning matrices and arrays of light parameters to a vertex program”(文献【3】的 Array 章节)。
在着色程序中,数组通常的使用目的是:作为从外部应用程序传入大量参数到 Cg 的顶点程序中的形参接口,例如与皮肤形变相关的矩阵数组,或者光照参数数组等。
简而言之,数组数据类型在 Cg 程序中的作用是:作为函数的形参,用于大量数据的转递。
Cg 中声明数组变量的方式和 C 语言类似:例如:
float a[10]; //声明了一个数组,包含 10 个 float 类型数据
float4 b[10]; //声明了一个数组,包含 10 个 float4 类型向量数据
对数组进行初始化的方式为:
float a[4] = {1.0, 2.0, 3.0, 4.0}; //初始化一个数组
要获取数组长度,可以调用“.length”,例如:
float a[10]; //声明一个数组
int length = a.length; //获取数组长度
声明多维数组以及初始化的方式如下所示:
float b[2][3] = {{0.0, 0.0, 0.0},{1.0, 1.0, 1.0}};
对多维数组取长度的方式为:
int length1 = b.length; // length1 值为 2
int length2 = b[0].length; // length2 值为 3
数组和矩阵有些类似,但是并不是相同。例如 4*4 阶数组的的声明方式为:
float M[4][4];
阶矩阵的声明方式为:
float4x4 M。
前者是一个数据结构,包含 16 个 float 类型数据,后者是一个 4 阶矩阵数据。float4x4 M[4],表示一个数组,包含 4 个 4 阶矩阵数据。
进行数组变量声明时,一定要指定数组长度,除非是作为函数参数而声明的形参数组。并且在当前的 profiles 中,数组的长度和所引用的数组元素的地址必须在编译时就知道。
“Unsized arrays may only be declared as function parameters-they may not be declared as variables. Furthermore, in all current profiles, the actual array length and address calculations implied by array indexing must be known at compile time”(文献 【3】)。
由于形参数组的概念与函数的概念紧密结合,所以将在第 8 章的 8.1 函数章节中进行统一阐述。