Unity Cg/HLSL Shader中向量和矩陣的構造方式

向量的構造

向量使用同類型的構造器構造

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》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章