内置矩阵_Object2World,UNITY_MATRIX_MVP ...行主要或列主要?

时间:2014-08-06 06:23:02

标签: matrix unity3d shader

我无法找到像Object2World或UNITYMATRIX_MVP这样的内置4x4矩阵的明确定义,关于它们的结构(行主要或列主要),这让我对它们应该放在多少的地方感到困惑。 ()函数。

在像

这样的情况下
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 viewDirection = normalize( float3( float4( _WorldSpaceCameraPos, 1.0) - mul(_Object2World, v.vertex) ) );

UNITYMATRIXMVP和_Object2World矩阵是mul()函数中的第一个参数。

所以看来UNITYMATRIXMVP和_Object2World应该根据Matrix-Vector左侧乘法的规则排成行?

并且,第二个参数v.vertex应该是一个4x1向量,所以float4在这里自动被视为4x1而不是1x4向量吗?

在以下情况

float3 normalDirection = normalize( mul( float4(v.normal, 0.0), _World2Object ).xyz );

_World2Object用作第二个参数

那么,World2Object,UNITYMATRIX_MVP和其他内置矩阵实际上是如何在内部显示的,它们是主要的吗?像:

X1,X2,X3,X4

Y1,Y2,Y3,Y4

Z1,Z2,Z3,Z4

W1,W2,W3,W4

或专栏?像:

X1,Y1,Z1,W1

X2,Y2,Z2,W2

X3,Y3,Z3,W3

X4,Y4,Z4,W4。

我现在能做的就是通过反复试验来猜测。 这些内置矩阵是行主要还是列主要?有没有关于它的明确文件?

非常感谢~~

1 个答案:

答案 0 :(得分:3)

Unity中的矩阵是column-major。即你必须将矩阵乘以向量,以便将矩阵提供的仿射变换应用于给定的向量。

我理解你对矢量和矩阵产品的困惑。事实上矩阵乘积在数学上是公平的,但矩阵乘矢量(和反向)乘法不是。当你将矢量乘以矩阵(或矩阵乘矢量)时,数学上它仍然是矩阵的乘法。

还记得你可以乘以(N x M)矩阵和(M×P)矩阵吗?而已。您可以将(1x4)乘以(4x4)(4x4)乘以(4x1)(但不能(4x1)乘以(4x4),不是(4x4)by(1x4))。因此,当您将向量和矩阵相乘时,必须将向量视为矩阵 - 单行矩阵(1x4)或单列矩阵(4x1),并且必须将它们乘以正确的顺序 。这就是为什么当你使用后乘法M.V时,你必须在列主要顺序中使用矩阵来接收有意义的结果。