目录
- 向量的构造
- 向量使用同类型的构造器构造
- 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》