为什么我们需要使用变换矩阵的"transpose"?(直接3D11)

Why do we need to use the "transpose" of a transformed matrix? (direct3D11)

本文关键字:transpose 直接 3D11 我们 变换 为什么      更新时间:2023-10-16

我读过SimpleMath,也读过程序员指南文章,但我似乎无法理解矩阵被"转换"后转置的目的

我的意思是,我知道矩阵的转置是什么。我只是不明白为什么我们要做转置

以下面的代码片段为例。(假设已经为CameraViewCameraProjection创建了矩阵)

World = XMMatrixIdentity();                             
WVP = World * CameraView * CameraProjection;
XMMatrixTranspose(WVP)      

那么我的问题是,得到WVP的转置的目的是什么?Direct3D 11的目的是什么?

首先,让我们看看如何在内存中表示矩阵。考虑下面的矩阵:

1 2 3
4 5 6
7 8 9

存储在计算机内存中的所有值都是按顺序存储的,没有"行"的概念。和"列",只有地址。如果您以行序表示上面的矩阵,则矩阵中的浮点值将像这样线性地存储在内存中:

最低地址[1 2 3 4 5 6 7 8 9]最高地址

另一方面,如果您以列主序表示相同的矩阵,则矩阵中的float值将以如下方式存储在内存中:

最低地址[1 4 7 2 5 8 3 6 9]最高地址

因此在-主顺序中,的连续值在内存中是连续的,而在-主顺序中,的连续值在内存中是连续的。

现在,HLSL要求您的矩阵以列为主顺序提供,但DirectXMath以行为主顺序存储其矩阵,因为它的实现方式更快,所以您必须将其转置,以便它以列为主顺序被馈送到HLSL着色器中。

更正:

HLSL默认以列为主顺序获取矩阵,但DirectXMath以行为主顺序存储矩阵,因为这样实现更快,所以一个解决方案是将矩阵转置,以便它们以列为主顺序被馈送到HLSL着色器中。或者,您可以覆盖此默认值,以便HLSL按行为主的顺序获取您的矩阵,然后您就不必对它们进行转置。