目前,我正在计算应用程序中的 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);
确实有效。我的场景中没有任何东西。所以我假设一些计算错了。我多次检查了我的代码。
要么,我是盲人或愚蠢的。我做错了什么?
答案 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着色器和我的渲染函数。事实证明,我转换了一个我不应该做的矩阵。结果,我的整个场景搞砸了。调试并不是很有趣,但现在可以正常工作了! : - )