2013-04-08 80 views
0

我想使用DirectX(11)渲染2D幾何圖形,並試圖通過創建一個根本不轉換頂點的效果文件來實現 - 這是您通常應用的位置你的世界/視圖/投影矩陣我只是返回(未轉換)的輸入。使用DirectX管道進行2D渲染

這個按預期工作,我的四邊形正確渲染到表面。然後我試着用X軸上的平移(2D)進行變換,並得到了一些奇怪的透視變化。

谷歌搜索我看到人們在談論使用正交變換矩陣,但不明白爲什麼 - 我不想將常規3d數據轉換爲2d,我想做2d數據到2d的身份轉換(也許也是2D翻譯/縮放比例)

我感覺我錯過了一些關於管道的重要內容嗎?

任何幫助理解

+0

您正在使用的Direct3D或Direct2D的設備之前,打電話給你的變換矩陣m.Transpose()? – Rafael 2013-04-08 19:18:14

+0

Direct3D - 它可能我可能想在未來從同一設備/緩衝區渲染二維和三維 – user2152466 2013-04-08 19:39:04

+0

@ user2152466爲什麼不粘貼您的代碼? – zdd 2013-04-09 02:20:41

回答

1

我想你可能已經忘記了整理後建設,但其分配給

1

所使用是其給出透視的立體矩陣的投影矩陣。當你在3D中工作時,這很好,但是當你想渲染2D(例如渲染GUI)時,你不想添加透視圖。

正交矩陣是一種基本上忽略透視的矩陣,因此距離中的物體和接近的物體一樣大。

Perspective vs Orthigonal 
O---------O    O---------O 
|\  /|    |   | 
| o-----o |    |   | 
| |  | |    |   | 
| o-----o |    |   | 
|/  \|    |   | 
O---------O    O---------O 

所以你的情況會發生什麼:

它們之間的差異,如果你畫一個框(與上缺少一個立方體)作爲隨後進行可視化?那麼,超出屏幕中心的物體自然會遠離靠近屏幕中心的物體。因爲它們靠得更近。

實施例:

A  B  C  Point A (-5, 0, 5) 
\  | /  Point B (0, 0, 5) 
    \ | /  Point C (5, 0, 5) 
    \ | /  
    \ |/  
    \ |/ 
     \|/ 
     V 

正如你可以看到點A和B是進一步遠離。如果我們將使用非常基本的觀點(這是比較複雜的,但它足以作爲例子)來計算,每個點會出現在你的屏幕上,然後我們可以使用下面的公式:

Vector2 Perspective(Vector3 pos) 
{ 
    return Vector2(pos.x, pos.y)/pos.length(); 
} 

現在正交矩陣將是沿着以下的線路更多:

Vector2 Orthogonal(Vector3 pos) 
{ 
    return Vector2(pos.x, pos.y); 
} 

所以,當你用新的正交矩陣取代舊投影矩陣,那麼你應該不再有觀點的問題。

+0

謝謝,但我沒有使用透視矩陣 - 我使用的是單位矩陣(不是DirectX正交矩陣)。我不明白你爲什麼需要二維渲染的單位矩陣上的正交矩陣,或者會有什麼不同? – user2152466 2013-04-08 21:18:47

+0

嘗試渲染包含點[0.9 0.9]和[-0.9 -0的全屏四元組。9]如果這給你一個四邊形填滿整個屏幕,除了外邊框,那麼你是**不**有透視問題,但你的圖像只是伸展。如果是這種情況,那麼只需使用一個正交矩陣,其輸入等於窗口內部(又稱繪製區域)。這應該可以解決拉伸效應。 – DevWouter 2013-04-09 21:03:30