2011-08-16 69 views
0

我有一個非常微妙的問題與XNA,特別是SpriteBatch。 在我的遊戲中,我有一個Camera類。它可以翻譯視圖(顯然),也可以放大和縮小。 當我調用我的spritebatch實例(最後一個參數)的「Begin」函數時,我將相機應用於場景。SpriteBatch drawcalls被XNA撲殺了嗎?

問題:當相機Zoomfactor大於1.0f時,spritebatch停止繪圖。 我試圖調試我的場景,但我找不到出錯的地方。

我試圖用「Matrix.CreateScale(2.0f);」作爲「開始」的最後一個參數。 所有其他參數都爲空,並且是第一個「SpriteSortMode.Immediate」,所以沒有自定義着色器或其他東西。 但SpriteBatch仍然不想繪製。

然後我試着只調用「DrawString」,並且DrawString與提供的尺度(2.0f)一起完美地工作。然而,通過大量的試驗和錯誤,我發現將ScaleMatrix乘以「Matrix.CreateTranslation(0,0,-1)」以某種方式將「安全」值改爲1.1f。 所以所有Scale值最高可達1.1f。對於上面的所有內容,SpriteBatch在正常的「Draw」調用中不會呈現單個像素。 (DrawString仍然不受影響並正在工作)。

這是怎麼發生的? 我沒有設置任何視口或其他矩陣。 在我看來,這可能是某種奇怪的Near/Farclipping。 但我通常只知道從3d的東西這些參數。

如果有什麼不清楚的地方請問!

回答

2

它是近/遠剪裁。

您繪製的所有東西都被轉換成投影空間,然後柵格化。該空間從屏幕左下角的(-1,-1)到右上角的(1,1)。但這只是(X,Y)座標。在Z座標中,它從0到1(從前到後)。本卷以外的任何內容都將被剪輯。 (參考文獻:123

當你在3D工作,您使用將壓縮Z上的投影矩陣座標下來,在投影空間在0附近飛機降落,並遠飛機降落在1.

在2D中工作時,您通常會使用Matrix.CreateOrthographic,它具有完全相同的近平面參數和遠平面參數。這只是SpriteBatch指定了它自己的矩陣,並將近平面和遠平面留在0和1.

SpriteBatch中的精靈的頂點實際上具有Z座標,儘管它通常不被使用。它由layerDepth參數指定。因此,如果您設置的圖層深度大於0.5,然後按比例放大2,則Z座標將超出0到1的有效範圍,並且不會呈現。

(文檔說0到1的有效範圍內,但沒有指定當您將轉換矩陣發生了什麼。)

的解決方案是非常簡單的:不要擴展您的Z座標。使用縮放矩陣,如:

Matrix.CreateScale(2f, 2f, 1f) 
+0

解決方案完美無缺。感謝您的深入解釋,這真的很有用! – riki