Cg(c for graphic)语言的数据类(转)

抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”算法

 

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

5.1 基本数据类型数组

    Cg支持7种基本的数据类型:数据结构

1.    float,32位浮点数据,一个符号位。浮点数据类型被全部的profile支持(可是DirectX8 pixel profiles在一些操做中下降了浮点数的精度和范围);app

2.    half,16为浮点数据;函数

 

3.    int,32位整形数据,有些profile会将int类型做为float类型使用;学习

4.    fixed,12位定点数,被全部的fragment profiles所支持;ui

5.    bool,布尔数据,一般用于if和条件操做符(?:),布尔数据类型被全部的profiles支持;编码

6.    sampler*,纹理对象的句柄(the handle to a texture object),分为6类:sampler, sampler1D, sampler2D, sampler3D, samplerCUBE,和samplerRECT。DirectX profiles不支持samplerRECT类型,除此以外这些类型被全部的pixel profiles和    NV40 vertex program profile所支持(CgUsersManual 30页)。因而可知,在不远的将来,顶点程序也将普遍支持纹理操做;orm

7.    string,字符类型,该类型不被当前存在的profile所支持,实际上也没有必要在Cg程序中用到字符类型,可是你能够经过Cg runtime API声明该类型变量,并赋值;所以,该类型变量能够保存Cg文件的信息。

    前6种类型会常常用到,事实上在Wikipedia有关Cg语言的阐述中只列举了前6种类型,而并无提到string数据类型。除了上面的基本数据类型外,Cg还提供了内置的向量数据类型(built-in vector data types),内置的向量数据类型基于基础数据类型。例如:float4,表示float类型的4元向量;bool4,表示bool类型4元向量。

    注意:向量最长不能超过4元,即在Cg程序中能够声明float一、float二、float三、float4类型的数组变量,可是不能声明超过4元的向量,例如:

 

float5 array ;// 编译报错

向量初始化方式通常为:

 

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);

 

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

 

float1x1 matrix1; // 等价于 float matirx1; x 是字符,并非乘号!

float2x3 matrix2; // 表示2*3 阶矩阵,包含6 个 float 类型数据

float4x2 matrix3;// 表示 4*2 阶矩阵,包含 8 个 float 类型数据

float4x4 matrix4 ;// 表示4*4 阶矩阵,这是最大的维数

 

矩阵的初始化方式为:

 

float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};

 

    注意:Cg中向量、矩阵与数组是彻底不一样,向量和矩阵是内置的数据类型(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型!这一点和C\C++ 中不太同样,在C\C++中,这三者同属于数据结构,数组能够构建向量和矩阵。下一节中将详细阐述Cg中的数组类型。

5.2 数组类型

    “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];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函数章节中进行统一阐述。

5.3 结构类型

    Cg语言支持结构体(structure),实际上Cg中的结构体的声明、使用和C++很是相似(只是相似,不是相同)。一个结构体至关于一种数据类型,能够定义该类型的变量。引入结构体机制,赋予了Cg语言一丝面向对象的色彩。还记得C++中,结构体与类的区别吗?没有区别,除了默认访问属性在结构体中为public,类中为private,因此结构体与类是很是近似的,由此能够看出shader 语言的发展趋势仍是向着具备面向对象特性的高级语言。不过目前的Cg语言中的结构体以展示“封装”功能为主,并不支持继承机制。

    结构体的声明以关键字struct开始,而后紧跟结构体的名字,接下来是一个大括号,并以分号结尾(不要忘了分号)。大括号中是结构体的定义,分为两大类:成员变量和成员函数。例如,定义一个名为myAdd的结构体,包含一个成员变量,和一个执行相加功能的成员函数,而后声明一个该结构体类型的变量,代码为:

 

struct myAdd

{

      float val;

      float add(float x)

   {

        return val + x;

    }

};

myAdd s;

 

使用符号“ ”引用结构体中的成员变量和成员函数。例如:

float a = s.value;

float b = s.add(a);

 

    注意:在当前的全部的profile版本下,若是结构体的一个成员函数使用了成员变量,则该成员变量要声明在前。此外,成员函数是否能够重载依赖于使用的profile版本。(文献[3] 的structures and Member functions章节)

    通常来讲,Cg的源代码都会在文件首部定义二个结构体,分别用于定义输人和输出的类型,这二个结构体定义与普通的C结构定义不一样,除了定义结构体成员的数据类型外,还定义了该成员的绑定语义类型( Binding Semantics),所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不一样数据类型的。目前Cg支持的绑定语义类型包括POSTION位置), COLOR(颜色),NORMAL(法向量),Texcoord(纹理坐标)等类型。

    当顶点着色程序向片断着色程序传递的数据类型较多的状况下,使用结构体能够大大的方便代码的编写和维护。总而言之,使用结构体是一个好习惯,高智商的孩子都使用。

5.4 接口(Interfaces)类型

    Cg语言提供接口类型,实际上,我本人不多见到使用接口类型的着色程序,缘由在于,Cg语言中的接口类型还不完善,不能被扩展和包含。此外,目前的GPU 编程大多只是针对独立的算法进行编码,规模较小,使用接口类型没有太大的优点。因此这里对该类型并很少作说明。有兴趣的读者能够参阅文献【3】的 Interfaces章节。

5.5 类型转换

    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

相关文章
相关标签/搜索