2012-02-02 128 views
1

我目前正在開發使用C#的Direct3D 11渲染引擎。投影和裁剪問題?

我已經成功繪製了三角形,應用了顏色和紋理等。 我現在試圖展示的對象是邊長爲1的旋轉立方體,放置在世界空間的原點。 但是,在應用視圖和特別是投影矩陣時,我得到的結果並不令人滿意。由於這是很難解釋,我只是告訴你什麼結果,我得到不同的視點/投影組合:從我的頂點着色器


HLSL代碼片段:

float4x4 wvpMatrix = mul(World, mul(View, Projection)); 
output.Position = mul(input.Position, wvpMatrix); 

世界矩陣使用:

// Static rotation around all three axes 
matrices.World = Matrix.Identity * Matrix.CreateFromYawPitchRoll(0.5f, 0.6f, 1.0f); 

試驗A

從正z方向的原點的簡單視圖向量。沒有使用投影。 您可以看到多維數據集的背面正被裁剪。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.Identity; 

Cube with back corners clipped


試驗B

查看矩陣保持不變,但現在我使用的是正交投影矩陣。 這次立方體的正面消失。你可以看到的部分是那些被試驗A.在測試A.修剪

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.CreateOrthographic(2, 2, 0.01f, 100.0f); 

Cube with front corner clipped


測試C

同樣沒有投影,就像這一次,場景正在從z軸負方向的三個單位觀察。 當相機位置未設置爲系統原點時,該立方體看起來失真。我認爲還有一些裁剪。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.Identity; 

Distorted cube


試驗d

最後,我使用透視投影。到目前爲止,我還沒有找到可以看到立方體任何部分的攝像機位置。我得到的全屏矢車菊藍色。

matrices.View = Matrix.CreateLookAt(new Vector3(0, 0, -3), new Vector3(0, 0, 1), Vector3.Up); 
matrices.Projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100); 

No visible parts of the cube


我想要做的就是繪製全立體的第一件事 - 不進行裁剪。我嘗試了近/遠平面值的不同組合,但找不到可接受的解決方案。 我的最終目標是進行透視投影。但是,正如你所看到的,我甚至無法得到一個好的現場視角。

+1

嗨,這裏有一些提示。確保變換矩陣按照正確的順序相乘。對此我的意思是頂點應該先乘以世界矩陣,結果應該乘以視圖矩陣等。這可以通過修改HLSL代碼來輕鬆測試。此外,請嘗試再次使用正交投影,並將近/遠平原設置爲0.000001f/10000.0f。你可以檢查的最後一件事情是,如果你正在使用三角形基元作爲多維數據集,或者你正在將多維數據集建模爲三角形條。在這種情況下,您需要使用三角形或三角形條來渲染它。 – brano 2012-02-02 15:18:17

+0

你好,目前的訂單是世界,視圖,投影。我甚至將倍增分開,沒有任何變化(如我所料)。另外,改變近平面和遠平面不會影響結果。只有在0到0.45的範圍內發生了更多的削波(超過第二幅圖像)。拓撲結構是TriangleList。 – Lucius 2012-02-02 16:54:35

+0

你可以發佈立方體的座標嗎? – brano 2012-02-03 08:32:50

回答

0

矩陣必須在某個點轉置。

原因是:

Microsoft.Xna.Framework.Matrix結構的佈局是基於行。 HLSL中的矩陣是以列爲基礎的

XNA Documentation

矩陣使用XNA Framework提供的行向量佈局。

Wikipedia article on matrix order

列主順序是相似的平坦化陣列上 線性存儲器的方法,但是這些列中順序列出。着色語言 GLSL和HLSL使用列主要排序。


溶液A:

移調所有矩陣它們被髮送到着色器之前:

var projection = Matrix.CreatePerspectiveFieldOfView(1, 1, 0.1f, 100); 
projection = Matrix.Transpose(projection); 

溶液B:

將此行放入着色器代碼中:

#pragma pack_matrix(row_major)