2013-02-18 54 views
1

我正在使用XNA 3.1繪製2D HUD會渲染我的3D模型?

我最近使用Components.Add(myComponent)在我的遊戲中創建了2D平視顯示器(HUD)。 HUD看起來很好,顯示了2D地圖,十字線和幀率計數器。事情是,每當HUD出現在屏幕上時,遊戲中的3D對象都不再正確繪製。

離我的玩家更遠的東西可能會在距離更近的地方得到,當我走過它們時,模型有時會失去定義。當我移除HUD時,所有繪製都正常。

是否有任何已知的問題需要注意?我應該如何在3D遊戲區域繪製2D HUD?

這是它看起來就像沒有GameComponent

two 3D objects, the one further away is correctly rendered behind the closer one

這裏是它的外觀與GameComponent(在這種情況下,它只是一些文字離屏幕的左上角,顯示幀率)注意到後面的樹是如何出現在樹前更接近攝像機:

two 3D objects, the one further away is rendered on top of the closer one

+1

HUD渲染代碼中的某處會更改流水線狀態,以後不會恢復。確保繪製模型時設置*所有必要的狀態*。這包括混合/光柵化器/深度模板狀態,視口,着色器,採樣器,輸入佈局,深度緩衝區和渲染目標。你能提供一個截圖來縮小問題的範圍嗎? – Lucius 2013-02-18 15:00:44

+0

感謝您的回覆。我一回到工作崗位就會提供屏幕截圖。 – PaulG 2013-02-18 15:10:07

+0

在繪製模型之前,嘗試'GraphicsDevice.DepthStencilState = DepthStencilState.Default;'。 – Lucius 2013-02-19 00:39:39

回答

1

您必須啓用深度緩衝區:

// XNA 3.1 
GraphicsDevice.RenderState.DepthBufferEnable = true; 
GraphicsDevice.RenderState.DepthBufferWriteEnable = true; 

// XNA 4.0 
GraphicsDevice.DepthStencilState = DepthStencilState.Default; 

SpriteBatch.Begin改變圖形流水線的狀態:

在這兩個版本的深度緩衝被禁止,這是什麼原因造成的問題。

同樣,我不能強調這一點:

務必確保所有渲染狀態繪製任何幾何體之前設置正確。

  • BlendState
  • DepthStencilState
  • RasterizerState
  • 視口
  • RenderTargets
  • 着色
  • SamplerStates
  • 紋理
  • 常量

教育自己在purpose of each state和渲染管道中的每個階段。如果有疑問,請嘗試將所有內容重置爲默認值。