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