目錄
向量的構造
向量使用同類型的構造器構造
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版本)單值構造向量
float4 a = float4(0.0); // = float4(0.0, 0.0, 0.0, 0.0)
使用低維向量構造高維向量
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版本)高維向量轉換到低維向量
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)
矩陣的構造
矩陣是行主的,傳入的參數按行填充。
使用數值構造
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可以從三個向量構造
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
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》