当我阅读 this article on Projective Texturing (9.3.2)在 nvidia 上,我遇到了这张图:
(来源:nvidia.com)
转换的编写顺序让我感到困惑。这是因为我学会了从左到右阅读矩阵乘法,还因为我认为转换顺序应该按以下顺序进行:
(来源:nvidia.com)
现在我的问题如下:
因为矩阵乘法不是可交换的,所以我应该按什么顺序进行乘法?
而如果确实和普通物体的变换顺序是一样的,那为什么要这样写呢?
通过相同的顺序,我的意思是这样的 hlsl 代码:
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
最后(这是可选的,但可能对其有相同疑问的其他人有用),您将如何编写 HLSL 代码来执行此投影纹理乘法,或者如果您通过 XNA 传递完整的矩阵,您将如何进行转换。
最佳答案
您的转换可以象征性地写为
y = T P V W x
在哪里:
x = (x0, y0, z0, w0)T:物体坐标(列向量4x1)
是 = (s, t, r, q)T:窗口空间坐标(列向量 4x1)
女 :世界建模矩阵(4x4)
五 :查看建模矩阵(4x4)
电话 :投影矩阵(4x4)
电话 :视口(viewport)变换矩阵(4x4)
计算如下:
y = T (P (V (W x)))
即从右到左。 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)))
关于matrix - 转换序列 : Projective Texturing (HLSL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6559304/