矩阵乘法在我的顶点着色器

时间:2016-01-10 10:48:19

标签: matrix directx-11 matrix-multiplication hlsl sharpdx

目前,我正在计算应用程序中的 World View Projection Matrix 而不是GPU。我想将此计算移至GPU,但我目前无法这样做。

案例1(见下文)效果很好,但案例2没有,我不知道我做错了什么。

在我的相机类中,我计算视图投影矩阵,如下所示:

ViewMatrix = SharpDX.Matrix.LookAtLH(_cameraPosition, _lookAtPosition, SharpDX.Vector3.UnitY);
ProjectionMatrix = SharpDX.Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, renderForm.ClientSize.Width / (float)renderForm.ClientSize.Height, 0.1f, 500.0f);

然后,我在渲染过程中为每个模型计算 World 矩阵:

SharpDX.Matrix worldMatrix = SharpDX.Matrix.Translation(_position);

案例1:在我的申请中计算矩阵

渲染模型时,我会像这样计算世界观投影矩阵

SharpDX.Matrix matrix = SharpDX.Matrix.Multiply(worldMatrix, camera.ViewMatrix);
matrix = SharpDX.Matrix.Multiply(matrix, camera.ProjectionMatrix);

matrix.Transpose();

在我的顶点着色器中,我通过调用:

来计算顶点的最终位置
output.pos = mul(input.pos, WVP);

一切正常!

案例2:HLSL中矩阵的计算

我只是将三个矩阵 World View Projection 写入我的顶点着色器的常量缓冲区,而不是计算我的应用程序中的任何内容。计算HLSL中的所有内容:

matrix mat = mul(World, View);
mat = mul(mat, Projection);

mat = transpose(mat);

output.pos = mul(input.pos, mat);

确实有效。我的场景中没有任何东西。所以我假设一些计算错了。我多次检查了我的代码。

要么,我是盲人或愚蠢的。我做错了什么?

2 个答案:

答案 0 :(得分:0)

在hlsl中你不需要计算转置。您还应该使用float4x4,因此很容易看出您使用的尺寸。 你的矩阵应该看起来像:

float4x4 worldViewProj = mul(world, mul(view, proj));
float4 pos = mul(input.pos, worldViewProj);

请记住,点来自float4(x,y,z,1)类型,向量是float4(x,y,z,0)。

在线性代数中,向量的乘法是

'=⋅

所以你需要转置来改变M的一面

'=pT⋅(T表示转置)

HLSL有点不同。 最简单的方法是,只需将所有矩阵从左向右相乘,然后在左侧使用mul函数和向量,就像上面的例子一样。

欲了解更多信息,请阅读:HLSL mul()

答案 1 :(得分:0)

我用了几天时间来试验HLSL着色器和我的渲染函数。事实证明,我转换了一个我不应该做的矩阵。结果,我的整个场景搞砸了。调试并不是很有趣,但现在可以正常工作了! : - )