Matrix 矩阵乘法在我的顶点着色器中不起作用

Matrix 矩阵乘法在我的顶点着色器中不起作用,matrix,directx-11,matrix-multiplication,hlsl,sharpdx,Matrix,Directx 11,Matrix Multiplication,Hlsl,Sharpdx,目前,我正在计算应用程序中的世界视图投影矩阵,而不是GPU。我想将此计算移到GPU,但我目前无法这样做 案例1(见下文)效果很好,但案例2效果不好,我不知道我做错了什么 在camera类中,我计算视图和投影矩阵,如下所示: ViewMatrix = SharpDX.Matrix.LookAtLH(_cameraPosition, _lookAtPosition, SharpDX.Vector3.UnitY); ProjectionMatrix = SharpDX.Matrix.Perspecti

目前,我正在计算应用程序中的世界视图投影矩阵,而不是GPU。我想将此计算移到GPU,但我目前无法这样做

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

在camera类中,我计算视图和投影矩阵,如下所示:

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);
SharpDX.Matrix matrix = SharpDX.Matrix.Multiply(worldMatrix, camera.ViewMatrix);
matrix = SharpDX.Matrix.Multiply(matrix, camera.ProjectionMatrix);

matrix.Transpose();
然后,我在渲染过程中计算每个模型的世界矩阵:

SharpDX.Matrix worldMatrix = SharpDX.Matrix.Translation(_position);
案例1:在我的应用程序中计算矩阵

渲染模型时,我按如下方式计算世界视图投影矩阵:

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);
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中矩阵的计算

我没有在应用程序中计算任何内容,而是将世界、视图和投影这三个矩阵写入顶点着色器的常量缓冲区,然后在HLSL中计算所有内容:

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

mat = transpose(mat);

output.pos = mul(input.pos, mat);
它确实有效。在我的场景中我什么都没看到。所以我认为有些计算是错误的。我检查了我的代码好几次


要么我是瞎子,要么我是笨蛋。我做错了什么?

在hlsl中,您不需要计算转置。您还应该使用浮动4x4,这样就很容易看到您使用的尺寸。 您的矩阵应该如下所示:

float4x4 worldViewProj = mul(world, mul(view, proj));
float4 pos = mul(input.pos, worldViewProj);
请记住,点来自类型float4(x,y,z,1),向量来自float4(x,y,z,0)

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


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

这可能是矩阵被视为行主矩阵还是列主矩阵的不同结果。在案例2中,您是否尝试过从着色器中移除转置?您好,亚当·迈尔斯!谢谢你的回复。我已经试过了。当我移除案例1中的转置时,我看不到我的模型。当移除案例2中的转置时,我仍然看不到它们。您是否尝试过使用任何GPU调试器,比如内置在Visual Studio中的调试器?可能值得检查常量缓冲区的内容是否如您所期望的那样。否。老实说,我不知道有一个。在把我的问题发布到这里之前,我做了网络调查,但我只发现了几十条评论,指出没有办法输出着色器变量的输入,比如文件输出或控制台输出。这个周末我要试一试!