传递到顶点着色器之前的矩阵转置

问题描述

就将矩阵传递给顶点着色器感到非常困惑,据我所知,您必须先将矩阵传递给顶点着色器。

但是,当我将其传递给顶点着色器时,我的世界矩阵无法正常工作,在缩放和旋转时可以正常工作,但平移会引起奇怪的视觉故障。因此,通过反复试验,我发现可以通过在将世界矩阵传递给顶点着色器之前不对世界矩阵进行转置来解决此问题,但是当我尝试对视图和投影矩阵进行相同操作时,则无济于事。

我不明白为什么我很困惑,除了世界矩阵之外,我是否必须转置所有矩阵?

解决方法

这取决于着色器的代码。

在没有任何/Zpr/Zpc HLSL编译器选项的情况下,当您的HLSL代码显示pos = mul( matrix,vector )时,矩阵应为主列。当HLSL代码显示pos = mul( vector,matrix )时,矩阵应该是行主的。

列主矩阵在GPU上的处理速度稍快,原因如下。

  1. 用于乘法的HLSL编译为四个dp4指令。点产品在GPU上速度很快,在很多地方都得到了广泛使用,尤其是在像素着色器中。

  2. VRAM访问模式稍好一些。如果您想了解更多,关键字是“内存合并”,大多数资源都是关于CUDA的,但是这同样适用于图形。

这就是Direct3D默认使用列主要布局的原因。