Ale*_*alm 6 xna transformation matrix hlsl
当我在nvidia 上阅读关于投影纹理(9.3.2)的这篇文章时,我遇到了这个图:
http://http.developer.nvidia.com/CgTutorial/elementLinks/252equ01.jpg
编写转换的顺序使我感到困惑.这是因为我学会了从左到右阅读矩阵乘法,也因为我认为变换序列应按此顺序排列:
http://http.developer.nvidia.com/CgTutorial/elementLinks/fig4_1.jpg
现在我的问题如下:
因为矩阵乘法不是可交换的,所以乘法的顺序是什么?
如果它确实与正常对象的转换序列顺序相同,为什么它会像这样写?
按照相同的顺序顺序,我的意思是像这个hlsl代码:
float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);
Run Code Online (Sandbox Code Playgroud)
最后(这是可选的,但对于其他想知道相同的人可能有用),如何编写HLSL代码来执行此投影纹理乘法,或者如果通过XNA传递完整的Matrix,您将如何进行转换.
你的变换可以象征性地写成
y = TPVW 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 (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)))
Run Code Online (Sandbox Code Playgroud)