Unity Cg/HLSL Shader中向量和矩阵的构造方式

目录

  • 向量的构造
    • 向量使用同类型的构造器构造
    • CG(不是所有的HLSL版本)单值构造向量
    • 使用低维向量构造高维向量
    • CG(不是所有的HLSL版本)高维向量转换到低维向量
  • 矩阵的构造
      • 使用数值构造
      • float3x3可以从三个向量构造
      • 从float4x4截取出float3x3
  • 参考资料

向量的构造

向量使用同类型的构造器构造

1
2
3
float2 a = float2(1.0, 2.0);
float3 b = float3(-1.0, 0.0, 0.0);
float4 c = float4(0.0, 0.0, 0.0, 1.0);

CG(不是所有的HLSL版本)单值构造向量

1
float4 a = float4(0.0); // = float4(0.0, 0.0, 0.0, 0.0)

使用低维向量构造高维向量

1
2
3
float2 a = float2(0.1, 0.2);
float3 b = float3(0.0, a); // = float(0.0, 0.1, 0.2)
float4 c = float4(b, 1.0); // = float4(0.0, 0.1, 0.2, 1.0)

CG(不是所有的HLSL版本)高维向量转换到低维向量

1
2
3
float4 a = float4(-1.0, 2.5, 4.0, 1.0);
float3 b = float3(a); // = float3(-1.0, 2.5, 4.0)
float2 c = float2(b); // = float2(-1.0, 2.5)

矩阵的构造

矩阵是行主的,传入的参数按行填充。

使用数值构造

1
2
3
4
float3x3 m = float3x3(
    1.1, 1.2, 1.3, //第一行
    2.1, 2.2, 2.3, //第二行
    3.1, 3.2, 3.3 //第三行

这和GLSL是不同的,GLSL的mat3是列主。移植shader时一定要注意这个区别。

float3x3可以从三个向量构造

1
2
3
4
float3 row0 = float3(0.0, 1.0, 0.0);
float3 row1 = float3(1.0, 0.0, 0.0);
float3 row2 = float3(0.0, 0.0, 1.0);
float3x3 m = float3x3(row0, row1, row2);

由于float3x3是行主的,所以传入的三个向量分别是float3x3的三行。

从float4x4截取出float3x3

float4x4的左上角3x3元素会被截取,并填入float3x3

1
2
3
4
5
6
float4x4 m = float4x4(1.1, 1.2, 1.3, 1.4,
                                    2.1, 2.2, 2.3, 2.4,
                                    3.1, 3.2, 3.3, 3.4,
                                    4.1, 4.2, 4.3, 4.4);
float3x3 n = float3x3(m);  
// = float3x3(1.1, 1.2, 1.3, 2.1, 2.2, 2.3, 3.1, 3.2, 3.3)

参考资料

《Cg Programming in Unity》