matrix - 转换序列 : Projective Texturing (HLSL)

标签 matrix xna transformation hlsl

当我阅读 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/

相关文章:

matrix - 如何在 rpy2 中获取索引向量,或者如果不存在,我如何选择两列?

转换 .txt 文件的文本

c# - 如何在 Monogame 中创建圆形变量并检测与其他圆形/矩形的碰撞

java - 处理中旋转时图像消失

algorithm - 对于大小为 k x k 的矩阵,Strassen 算法有多少浮点运算?

algorithm - 找到一个最小化两个集合的最大距离的算法,比贪心算法好

c# - XNA 内容加载异常

c# - xna 使物体绕 ITS 轴移动(不绕点 0,0,0)

math - 变换以消除共线点

c++ - 使用 Stringstream 将字符串转换为 Int