在Unity Shader中我们一般都使用Cg语言来编写代码,且它的数据类型比其他编程语言的数据类型更为丰富,所以,了解Cg语言的常用数据类型是非常重要的。
1. 基本类型
float | 最高精度的浮点数据类型。在大多数平台上, float 值是 32 位,就像在常规编程语言中一样。 |
half | 中等精度的浮点数据类型。在支持 half 值的平台上,它们通常为 16 位。其它平台则自动转为 float 类型。 |
fixed | 最低精度的定点值,通常为 11 位。 |
int | 整形数据类型,通常用作循环计数器或数组索引。 |
2. 矢量/向量类型
这是一个建立在基本类型的基础上,具有多维特点的数据类型,例如,float3
是一个 3D 矢量,具有分量 .x、.y 和 .z,而 half4
是一个中等精度 4D 矢量,具有分量 .x、.y、.z 和 .w 。并且,我们也可以使用 .r、.g、.b 和 .a 分量来对矢量编制索引,这在处理颜色时很有用。
float2;half2;fixed2;int2 | 表示二维向量的数据类型,通常用作二维坐标、UV坐标等。 |
float3;half3;fixed3;int3 | 表示三维向量的数据类型,通常用作位置、法线、颜色等。 |
float4;half4;fixed4;int4 | 表示四维向量的数据类型,通常用作颜色、四元数等。 |
通常我们使用与这些数据类型同名的函数来为对应数据类型的变量赋初始值:
float2 f2 = float2(1, 1);
half3 h3 = half3(1, 1, 1);
fixed4 f4 = fixed4(1, 1, 1, 1);
并且,我们可以使用 .x、.y、.z 和 .w 或 .r、.g、.b 和 .a来取出它们的分量:
float4 f4 = float4(1, 1, 1, 1);
float c1 = f4.x; // 或 f4.r
float c2 = f4.y; // 或 f4.g
float c3 = f4.z; // 或 f4.b
float c4 = f4.w; // 或 f4.a
我们也可以利用一种称为swizzeling的语法来构建出一个全新的向量:
fixed3 f3 = fixed3(1, 1, 1);
fixed3 color = f3.rgb; // 或 f3.xyz 等价于fixed3(f3.r, f3.g, f3.b)
fixed3 color2 = f3.bgr; // 或 f3.zyx 等价于fixed3(f3.b, f3.g, f3.r)
...
3. 矩阵类型
矩阵类型与矢量类型一样,都是建立在基础类型之上的,它的构建方式类似于矢量类型,如 float4x4
就是一个 4×4 变换矩阵,注意两个4之间的字符为‘x’而不是‘×’,我们可以利用矩阵类型完成许多数学运算。
float2x2…… | 表示2x2矩阵的数据类型,通常用作旋转矩阵等。 |
float3x3…… | 表示3x3矩阵的数据类型,通常用作变换矩阵等。 |
float4x4…… | 表示4x4矩阵的数据类型,通常用作投影矩阵等。 |
矩阵类型变量的赋值与取值的代码如下:
// 定义一个3×3的矩阵
float3x3 M = float3x3(1, 2, 3, 4, 5, 6, 7, 8, 9);
// 得到M的第一行
float3 row = M[0];
// 得到M的第二行第一列的元素
float e = M[1][0];
4. 纹理类型
纹理类型用于存储贴图相关的数据,包括纹理、坐标、采样方式和滤波方式等。
sampler2D | 用来表示二维纹理的数据类型,通常用作贴图等。 |
samplerCUBE | 用来表示立方体纹理的数据类型,通常用作天空盒等。 |
sampler2D_float | 用于存储包含完整浮点精度数据的二维纹理 |
samplerCUBE_float | 用于存储包含完整浮点精度数据的立方体纹理 |