【问题标题】:Matrix transposition before passing to the vertex shader传递给顶点着色器之前的矩阵转置
【发布时间】:2020-10-27 21:19:02
【问题描述】:
我对将矩阵传递给顶点着色器感到非常困惑,据我所知,您必须先转置矩阵,然后才能将它们传递给顶点着色器。
但是当我将它传递给顶点着色器时,我的世界矩阵无法正常工作,它在缩放和旋转方面工作良好,但平移会导致奇怪的视觉故障。因此,通过反复试验,我发现这个问题可以通过在将世界矩阵传递给顶点着色器之前不转置来解决,但是当我尝试使用视图和投影矩阵时,没有任何效果。
我不明白为什么我很困惑,我必须转置除世界矩阵之外的所有矩阵吗?
【问题讨论】:
标签:
c++
matrix
directx-11
【解决方案1】:
这取决于你的着色器的代码。
如果没有任何/Zpr 或/Zpc HLSL 编译器选项,当您的HLSL 代码显示pos = mul( matrix, vector ) 时,矩阵应该是主要列。当 HLSL 代码显示 pos = mul( vector, matrix ) 时,矩阵应为行主矩阵。
列主矩阵在 GPU 上的处理速度稍快一些,原因如下。
-
用于乘法的 HLSL 编译为四个 dp4 指令。点积在 GPU 上的速度很快,在任何地方都被广泛使用,尤其是在像素着色器中。
-
VRAM 访问模式稍好一些。如果您想了解更多,关键字是“内存合并”,大多数来源都是关于 CUDA 但那同样适用于图形。
这就是 Direct3D 默认为列主要布局的原因。