转换顺序:投影纹理(HLSL)

时间:2011-07-02 19:59:18

标签: matrix xna transformation hlsl

当我在nvidia上阅读this article on Projective Texturing (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);

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

1 个答案:

答案 0 :(得分:4)

您的转型可以象征性地写成

y = T P V 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(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)))