2016-01-10 41 views
0

目前,我計算世界視圖投影矩陣在我的應用程序,而不是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); 

然後,我計算在渲染過程中世界矩陣我的每個模型:

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計算而不是在我的應用程序計算什麼的

,我只寫了三個矩陣世界查看投影到我的頂點着色器的常數緩衝區在HLSL計算一切:

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

mat = transpose(mat); 

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

它的工作。我在場景中沒有看到任何東西。所以我假設一些計算是錯誤的。我檢查了幾次我的代碼。

要麼我是盲人,要麼是愚蠢的。我做錯了什麼?

+0

它可能是矩陣被視爲行主或列主要差異的結果。你有沒有嘗試從案例2中的着色器中移除轉置? –

+0

亞當萬里達!感謝您的答覆。 我已經試過了。在案例1中移除轉置時,我沒有看到我的模型。在案例2中移除轉置時,我仍然看不到它們。 – Endgegner85

+0

您是否嘗試過使用任何GPU調試器,如內置於Visual Studio中的調試器?檢查恆定緩衝區的內容可能是值得的。 –

回答

0

我以前幾天與HLSL着色器進行試驗,並與我的渲染功能。事實證明,我調換了一個我不應該做的矩陣。結果,我的整個場景都搞亂了。調試並沒有太多樂趣,但它現在起作用了! :-)

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)。

在矢量的線性代數乘法是

'=⋅

所以需要轉置用於改變

中號

的側'=pT⋅(所述T表示轉置)

HLSL有點不同。 爲了最簡單的方法,只需從左到右乘以所有矩陣,然後在左邊使用帶有矢量的mul函數,就像我上面的示例一樣。

欲瞭解更多信息,請閱讀這個:HLSL mul()