2012-02-28 111 views
0

我試圖繪製場景的深度圖。 現在,我製作了一個如下所示的HLSL文件:http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Shadow_map.php 而且一切都很順利。然而!我想找出每個像素的確切值,所以我沒有繪製正常的渲染目標,而是創建了一個新的渲染目標,它是一個Texture2D,如:http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php 然後我使用spritebatch繪製它。XNA深度圖重疊區域顏色

然後!當我顯示圖像中,第一,也就是,一個直接繪製到屏幕給出了這樣的輸出:

Correct Depth Image

並繪製到紋理然後於使用子畫面屏幕上的一個給這樣的: Sprite drawn Image

請注意,在第二次捕獲時,身體右臂明顯位於身體後方,如同身體不存在於重疊區域那樣繪製。

我認爲,它是一個排序問題,因爲前面的頂點首先被繪製到紋理,然後更遠的覆蓋更接近的結果,從而導致觀察圖像。

我將不勝感激任何輸入。

回答

2

SpriteBatchmodifies the graphics device state當你使用它。從鏈接的文章,這裏是它集:

GraphicsDevice.BlendState = BlendState.AlphaBlend; 
GraphicsDevice.DepthStencilState = DepthStencilState.None; 
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 
GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp; 

你可能要設置的深度模版狀態恢復到默認值(深度讀取和寫入)。

GraphicsDevice.DepthStencilState = DepthStencilState.Default; 

您可能還必須設置一些其他狀態,具體取決於您的渲染需要。

+1

+1:完全同意。在這種情況下,我通常在調用'SpriteBatch.Begin()'調用之前放置一個斷點,然後檢查'DepthStencilState','BlendState'和'RasterizerState',然後在'SpriteBatch.End()'調用之後全部重置它們。 – 2012-02-29 10:42:34

+0

工程就像一個魅力! – 2012-02-29 18:39:47