Цвет перекрывающихся областей карты глубины XNA - PullRequest
0 голосов
/ 28 февраля 2012

Я пытаюсь нарисовать карту глубины сцены. Теперь я создал файл 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 а потом я нарисовал его с помощью спрайтбэтча.

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

Correct Depth Image

и тот, который рисует текстуру, затем на экран, используя спрайт, дает следующее: Sprite drawn Image

Обратите внимание, как во втором снимке правая рука тела, которая явно находится позади тела, нарисована так, как будто тело не существует в перекрывающейся области.

Я думаю, это проблема упорядочения, так как вершины спереди рисуются сначала к текстуре, затем более удаленные перезаписывают более близкие, что приводит к наблюдаемому изображению.

Буду признателен за любой вклад.

1 Ответ

2 голосов
/ 29 февраля 2012

SpriteBatch изменяет состояние графического устройства при его использовании.Из связанной статьи вот что она устанавливает:

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

Возможно, вы захотите вернуть состояние глубины-трафарета обратно по умолчанию (чтение и запись глубины).

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Выможет также потребоваться установить некоторые другие состояния, в зависимости от того, что вам нужно для рендеринга.

...