matrix - float4 乘以 _World2Object 不是一个 4by4 矩阵吗?

标签 matrix unity-game-engine shader

我正在研究unity着色器,但是一行代码让我困惑:

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

float4 乘以 _World2Object(这是一个 4x4 矩阵)的结果不也是一个 4x4 矩阵吗?但结果似乎是 float4,然后通过访问 .xyz 属性转换为 float3。

是否有任何预定义的属性用于访问 .xyz 等二维矩阵?

非常感谢:)

最佳答案

您可以将向量与矩阵相乘,也可以将矩阵与向量相乘。

第一种情况称为左乘或预乘,向量以行主序 (1x4) 表示。第二种情况是右乘或后乘,其中向量以列主序 (4x1) 表示。

让我们将矩阵 (4x4) 视为 X、Y、Z 和 W 向量的基础。然后按行主序矩阵将写为

 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

因此乘法的顺序(V.M 与 M.V)仅取决于矩阵的顺序。在您的示例中,矩阵是按行优先顺序编写的。由于其 4x4 矩阵,它代表 3D 空间中的完整仿射变换(旋转、缩放和变换)。因此,要将向量乘以该矩阵,您必须提供行向量 (X,Y,Z,0)。请注意,如果要变换,则必须提供行向量 (X,Y,Z,1)。

关于您问题的其余部分,有一个内置的 swizzle 运算符:用于向量的 .xyzw 或 .rgba 。该运算符允许重新排列和复制向量的组成部分(.xxxx、.wzyx、.rrra 等)。矩阵没有 sqizzle 运算符。

关于matrix - float4 乘以 _World2Object 不是一个 4by4 矩阵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25117094/

相关文章:

rotation - 在 GLSL ES 中的片段着色器上旋转纹理

c++ - 继承基类的所有内容

c++ - 世界空间的切线空间(TBN 矩阵)

algorithm - 我怎样才能找到所有连续的子矩阵?

MATLAB - 给定索引矩阵置换矩阵的列

unity-game-engine - Unity 3d - 布料对象

c# - 3 维波的法线

opengl - GPU 手动 Mipmap 生成 [OpenGL 2.x]

matrix - Unity3D 相机矩阵的高级信息

c++ - 将结构发送到着色器存储缓冲区时,为什么会得到垃圾数据?