前言
紧接之前的 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 | float2 array[10]; |
结构体类型
C语言中我们经常会使用到结构体,而 CG 也支持结构体,用法与 C语言几乎相同。使用结构体可以达到多值参数,以及多值返回。
但是 CG 结构体中的成员变量必须都有语义。
示例:
1 | struct a2v{ |
类型转换
C语言中常常会有类型转换的情况,高精度类型可转低精度类型。CG 中也可以。
例如:
1 | float a = 0.1; |
CG 中可以对常量加上后缀来表示其数据类型。
如:
1 | float a = 0.1f; |
常量后缀:(要注意精度和取值范围)
- f 表示 float 类型
- h 表示 half 类型
- x 表示 fixed 类型