2012-02-28 2 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 Depth Map Overlapping Area Area

Тогда! когда я отображать изображения, то первый, то есть, один рисунок непосредственно на экран дает такой результат:

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() '. –

+0

работает как шарм! –