2012-04-12 26 views
0

我在Direct3D 11中繪製GUI,目前我通過在屏幕附近繪製3D四邊形的負載來管理它。我決定實施屏幕四邊形來提高速度。屏幕空間到剪輯空間轉換問題

當我繪製我四I爲它提供的輸入位置(input.pos),這是一組定義一個四如下座標:

0,0 
0,1 
1,0 
1,1 

我還通過在一個實例位置,這是四分之一屏幕空間中的位置,例如,

456,700 

最後,我傳遞四個像素的比例尺。因此,一個50x30像素四將有以下刻度值:

50,40 

爲了將這些座標轉換成裁剪空間轉換爲我的像素着色器我用下面的數學(我的意圖在CPU上做最終的,但現在是在頂點着色器中完成的):

output.pos = float4((input.pos*2* input.instanceScale)/winSize+input.instancePos*2/winSize -1,0.25,1); 

這大部分工作,一切都出現在一切附近,但y軸是倒置的。這是因爲剪輯空間從-1運行到1,但1是剪輯空間中的屏幕頂部 - 與正常的做事方式相反。因此,解決方案應該是:

output.pos.x = 2*(input.pos.x * input.instanceScale.x + input.instancePos.x)/winSize.x -1; 
output.pos.y = 1 - 2*(input.pos.y * input.instanceScale.y + input.instancePos.y)/winSize.y; 

然而,當我運行這個時,我的四邊形就消失了。我認爲他們仍在渲染,但在某個地方屏幕外。

有沒有人有任何想法可能會出錯?另外,如果我保留新的output.pos.x計算,但對y座標使用舊計算,它仍然有效。所以這個問題必須在這個新代碼的第二行。

非常感謝

EDIT1:我現在跟着TomMcTwattyPants的意見和lerped 1和-1之間的定稿y位置。 GUI元素垂直向中心移動並收縮。當他們到達中心時,他們就會縮小,然後循環。

在循環之前有一個延遲,所以我相信在乘法的0和-1部分之間四邊形是不可見的。我不知道爲什麼,也許頂點的順序已經改變,所以正常現在指向離開屏幕並被剔除?我會嘗試關閉背面剔除以查看是否會改變任何內容。無論如何,它不需要GUI通行證。

編輯2:問題是背面剔除。禁用該固定一切

回答

2

反轉Y軸的最簡單的方法是通過減一乘它:

output.pos.y *= -1; 
+0

我剛剛也試過,出於某種原因,它仍然沒有出現。 – 2012-04-12 16:48:52

+0

然後我會建議使用調試器來逐步着色器代碼,並檢查值是你所期望的。 如果這沒有幫助(並且假設'output.pos.y * = 1;'除了Y軸反轉以外工作正常),您可以嘗試使用介於1和-1之間的定時lerp來幫助可視化問題。例如'output.pos.y * = lerp(1,-1,fmod(time_in_seconds,1));' – CarlJohnson 2012-04-13 01:49:33

+0

好主意。由於某些原因,PIX不能很好地與我的項目一起玩,所以我可能會使用定時的lerp。我應該在當天結束時展示一些東西 – 2012-04-13 09:22:34

1

剛剛經歷了同樣的問題:如果你發現四消失,這是因爲可能指數收盤指令。我沒有禁用背面剔除,而是扭轉了四邊形的纏繞順序,一切正常。