为什么我们需要使用变换矩阵的"transpose"?(直接3D11)
Why do we need to use the "transpose" of a transformed matrix? (direct3D11)
我读过SimpleMath,也读过程序员指南文章,但我似乎无法理解矩阵被"转换"后转置的目的
我的意思是,我知道矩阵的转置是什么。我只是不明白为什么我们要做转置
以下面的代码片段为例。(假设已经为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]最高地址
另一方面,如果您以列主序表示相同的矩阵,则矩阵中的float值将以如下方式存储在内存中:
最低地址[1 4 7 2 5 8 3 6 9]最高地址
因此在行-主顺序中,行的连续值在内存中是连续的,而在列-主顺序中,列的连续值在内存中是连续的。
现在,HLSL要求您的矩阵以列为主顺序提供,但DirectXMath以行为主顺序存储其矩阵,因为它的实现方式更快,所以您必须将其转置,以便它以列为主顺序被馈送到HLSL着色器中。
更正:
HLSL默认以列为主顺序获取矩阵,但DirectXMath以行为主顺序存储矩阵,因为这样实现更快,所以一个解决方案是将矩阵转置,以便它们以列为主顺序被馈送到HLSL着色器中。或者,您可以覆盖此默认值,以便HLSL按行为主的顺序获取您的矩阵,然后您就不必对它们进行转置。
相关文章:
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 公开最直接的基类模板名称
- 为什么这种直接初始化有效?(C++17)
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 直接在RcppArmadillo中调用LAPACK例程
- 根据 GetLastError 直接写入磁盘会导致错误代码 5
- 字符串变量,比如说"字符串str",可以直接复制到数组中吗?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 直接 2D 呈现到命令列表和打印:图片压缩
- 直接初始化不可复制、不可移动的成员,而不使用聚合初始化
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- Eigen - matrix.transpose 会创建矩阵的副本吗?
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 直接显示手动图形内存泄漏
- 通过直接函数调用将 std::p romise 对象传递给函数
- 为什么我们需要使用变换矩阵的"transpose"?(直接3D11)