为什么我们需要使用变换矩阵的"transpose"? (direct3D11)
Why do we need to use the "transpose" of a transformed matrix? (direct3D11)
我已经阅读了 SimpleMath and also read the Programmers guide 篇文章,但我似乎无法理解转置矩阵的目的 "transformed"
我的意思是,我明白矩阵的转置是什么。我只是不明白为什么我们需要实际进行转置。
以此代码片段为例..(假设已经为 CameraView
和 CameraProjection
创建了矩阵)
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]最高地址
另一方面,如果您以列优先顺序表示相同的矩阵,矩阵中的浮点值将像这样存储在内存中:
最低地址[1 4 7 2 5 8 3 6 9]最高地址
所以在行-主要顺序中,行的连续值在内存中是连续的,而在列-主要顺序,列的连续值在内存中是连续的。
现在,HLSL 要求您的矩阵以列优先顺序提供,但 DirectXMath 以行优先顺序存储其矩阵,因为它的实现速度更快,因此您必须转置它它以列优先顺序输入 HLSL 着色器。
更正:
HLSL 默认以列优先顺序获取矩阵,但 DirectXMath 以行优先顺序存储其矩阵,因为它的实现速度更快,因此一种解决方案是转置矩阵,以便将它们输入 HLSL列主要顺序的着色器。或者,您可以覆盖此默认值,以便 HLSL 以行优先顺序获取您的矩阵,然后您就不必转置它们了。
我已经阅读了 SimpleMath and also read the Programmers guide 篇文章,但我似乎无法理解转置矩阵的目的 "transformed"
我的意思是,我明白矩阵的转置是什么。我只是不明白为什么我们需要实际进行转置。
以此代码片段为例..(假设已经为 CameraView
和 CameraProjection
创建了矩阵)
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]最高地址
另一方面,如果您以列优先顺序表示相同的矩阵,矩阵中的浮点值将像这样存储在内存中:
最低地址[1 4 7 2 5 8 3 6 9]最高地址
所以在行-主要顺序中,行的连续值在内存中是连续的,而在列-主要顺序,列的连续值在内存中是连续的。
现在,HLSL 要求您的矩阵以列优先顺序提供,但 DirectXMath 以行优先顺序存储其矩阵,因为它的实现速度更快,因此您必须转置它它以列优先顺序输入 HLSL 着色器。
更正:
HLSL 默认以列优先顺序获取矩阵,但 DirectXMath 以行优先顺序存储其矩阵,因为它的实现速度更快,因此一种解决方案是转置矩阵,以便将它们输入 HLSL列主要顺序的着色器。或者,您可以覆盖此默认值,以便 HLSL 以行优先顺序获取您的矩阵,然后您就不必转置它们了。