我无法找到像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。
我现在能做的就是通过反复试验来猜测。 这些内置矩阵是行主要还是列主要?有没有关于它的明确文件?
非常感谢~~
答案 0 :(得分:3)
Unity中的矩阵是column-major。即你必须将矩阵乘以向量,以便将矩阵提供的仿射变换应用于给定的向量。
我理解你对矢量和矩阵产品的困惑。事实上矩阵乘积在数学上是公平的,但矩阵乘矢量(和反向)乘法不是。当你将矢量乘以矩阵(或矩阵乘矢量)时,数学上它仍然是矩阵的乘法。
还记得你可以乘以(N x M)矩阵和(M×P)矩阵吗?而已。您可以将(1x4)乘以(4x4)或(4x4)乘以(4x1)(但不能(4x1)乘以(4x4),不是(4x4)by(1x4))。因此,当您将向量和矩阵相乘时,必须将向量视为矩阵 - 单行矩阵(1x4)或单列矩阵(4x1),并且必须将它们乘以正确的顺序 。这就是为什么当你使用后乘法M.V时,你必须在列主要顺序中使用矩阵来接收有意义的结果。