0%

Shader CG编程基础数据类型

前言

紧接之前的 Shader结构,这里将讲述CG编程的基础数据类型。

首先要说的是,在 Shader框架结构 中提到的数据类型的定义,是 Properties{}结构中的数据类型,将会展示在 Inspector 中。
而这里的数据类是 CG 编程中用到的数据类型,由于 Properties{} 中的属性不能直接用于编程,这里的数据类型是十分重要的。

注意:CG中要使用Properties{} 中的变量,则 CG 中的变量类型(CG中的变量类型与 Properties 中是不同的,但也有一定的对应关系)要对应,同时 CG 变量名与 Properties 变量名相同

基本类型

类型 描述
float 32位浮点数。
可以充当四维向量 float4 ,三维向量 float3 , 二维 float2 , 一维 float 。
half 16位浮点数。范围在 -6w~6w 之间
fixed 12位定点数,范围在 -2~2 之间,用于表示 Color 十分合适
int 32 位整形数据,有些profile 会将int 类型作为float 类型使用。
bool 布尔数据,布尔数据类型被所有的profiles 支持。
sample 纹理对象的句柄(the handle to a texture object),分为6 类:sampler, sampler1D, sampler2D, sampler3D, samplerCUBE,和samplerRECT。DirectX profiles 不支持samplerRECT 类型,除此之外这些类型被所有的pixelprofiles 和 NV40 vertex program profile 所支持(CgUsersManual 30 页)
string 字符类型,该类型不被当前存在的profile 所支持,实际上也没有必要在CG 程序中用到字符类型,但是你可以通过CG runtime API 声明该类型变量,并赋值。因此,该类型变量可以保存 CG 文件的信息。

CG提供了向量类型,如float4,float3,float2。 最大维度不超过4。

CG也提供了矩阵数据类型,但最大维数不超过 4X4 阶。如:float2x2 matrix4 = {0.1,0.2,0.3,0.4} 。

数组类型

CG 中也允许定义数组,CGPROGRAM 块中的语法和 C语言十分相似,因此定义数组的方式也相同。
数组的定义必须规定长度,这与 C语言 的语法相同。
示例:

1
2
3
float2 array[10];

float2 array[] = {{0.1,0.2},{0.3,0.4}};

结构体类型

C语言中我们经常会使用到结构体,而 CG 也支持结构体,用法与 C语言几乎相同。使用结构体可以达到多值参数,以及多值返回。
但是 CG 结构体中的成员变量必须都有语义。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct a2v{
// 从系统获取顶点坐标
float4 vertex:POSITION;

// 法线,方位可使用三维(法线只有方向)
// 从系统获取法线方向
float3 normal:NORMAL;

//纹理坐标(坐标取值0-1)
// 获取第1套纹理的坐标
float4 texcoord: TEXCOORD0;

};

类型转换

C语言中常常会有类型转换的情况,高精度类型可转低精度类型。CG 中也可以。
例如:

1
2
3
4
float a = 0.1;
half b = 0.3;
// 类型转换
float c = a + b; //等价于 float c = a + (float)b ;

CG 中可以对常量加上后缀来表示其数据类型。
如:

1
2
3
float a = 0.1f;
half b = 0.2h;
fixed c = 0.3x;

常量后缀:(要注意精度和取值范围)

  • f 表示 float 类型
  • h 表示 half 类型
  • x 表示 fixed 类型