Matrix 变换序列:投影纹理(HLSL)

Matrix 变换序列:投影纹理(HLSL),matrix,xna,transformation,hlsl,Matrix,Xna,Transformation,Hlsl,当我在nvidia上阅读时,我看到了以下图表: (来源:) 转换的编写顺序让我感到困惑。这是因为我学会了从左到右阅读矩阵乘法,也因为我认为变换的顺序应该是这样的: (来源:) 现在我的问题是: 因为矩阵乘法不是可交换的,我应该按什么顺序进行乘法 如果它确实与普通对象的变换顺序相同,为什么它是这样写的 通过相同的顺序,我指的是类似以下hlsl代码的内容: float4 worldPosition = mul(input.Position, World); float4 viewP

当我在nvidia上阅读时,我看到了以下图表:


(来源:)

转换的编写顺序让我感到困惑。这是因为我学会了从左到右阅读矩阵乘法,也因为我认为变换的顺序应该是这样的:


(来源:)

现在我的问题是:

因为矩阵乘法不是可交换的,我应该按什么顺序进行乘法

如果它确实与普通对象的变换顺序相同,为什么它是这样写的

通过相同的顺序,我指的是类似以下hlsl代码的内容:

float4 worldPosition        = mul(input.Position, World);
float4 viewPosition         = mul(worldPosition, View);
output.Position             = mul(viewPosition, Projection);

最后(这是可选的,但可能对其他想知道相同的问题的人有用),您将如何编写HLSL代码来执行此投影纹理乘法,或者如果您通过XNA传递完整矩阵,您将如何执行转换。

您的转换可以符号化地写为

y=tpv W x

其中:

x=(x0,y0,z0,w0)T:对象坐标(列向量4x1)
y=(s,t,r,q)t:窗口空间坐标(列向量4x1)
W:世界建模矩阵(4x4)
V:视图建模矩阵(4x4)
P:投影矩阵(4x4)
T:视口变换矩阵(4x4)

计算如下所示:

y=T(p(V(wx)))

i、 e.从右到左。HLSL代码将是:

float4 worldPosition  = mul(World, input.Position);     // W x
float4 viewPosition   = mul(View, worldPosition);       // V (W x)
float4 projPosition   = mul(Projection, viewPosition);  // P (V (W x))
float4 vportPosition  = mul(Viewport, projPosition);    // T (P (V (W x)))

谢谢你的回答。我假设这是投影纹理的变换,就像文章中的图像一样。我仍然在想两件事:-y=T(P(V(wx))与(xw)V)P=T=y相同吗?让y=tpvwx=T(P(V(wx)))。用xt表示x的转置(列向量4x1变为行向量1x4,4x4矩阵反映在对角线上)。然后yt=(TPVWx)t=xt Wt Vt Pt Tt=((xt Wt)Vt)Pt)Tt。我的评论的另一部分是:(不能意外编辑我的帖子)我感到困惑的原因是因为文章提到:oPosition=Mul(modelViewProj,position);之前在HLSL代码中是另一种方式。-如果不是,为什么它是这样写的,这在几何上意味着不同于(xw)V)P)T=y的东西吗?或者是某种数学惯例,有时从右到左写/读?hlsl编译器知道这两种符号之间的差异吗?当您解释4x1和1x4(转置)版本的矩阵变换之间的差异时,我感到非常惊讶。所以我想说得非常清楚:如果一系列矩阵乘法的转置版本与非转置矩阵乘法相同,那么它们必须以相反的顺序来编写?谢谢我的最后一个问题是,当hlsl编译器是浮点4时,它如何知道您指的是x=4x1还是1x4?