Я хочу попробовать добавить тени в игру 3D XNA. Я настроил тестовую среду с одним источником света и одной камерой. Тем не менее, я сталкиваюсь с артефактами с моим подходом.
Я использую код шейдера с http://pastebin.com/zXi0hmsU, чтобы сделать окончательный результат и http://pastebin.com/rY4Gcj9N для создания карт теней. Код довольно прост и включает в себя создание карты глубины с точки зрения света, затем проецирование ее в пространство камеры и проверку на окклюзию.
Тем не менее, с большинства ракурсов я получаю довольно некрасивые результаты
Сцена состоит из нескольких простых кубов (построенных вручную, обращенных наружу, задняя сторона обрезана), одного источника света (карта теней в верхнем левом углу - выглядит хорошо) и одной камеры.
Моя RenderTarget для карт теней инициализируется
int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
После этого применяется CreateShadowMap
эффект, за которым следует эффект LambertWithShadows. Наконец, карта теней рисуется с помощью SpriteBatch
.
Остальная часть кода состоит из простого предоставления правильных значений шейдерам. При необходимости, я могу предоставить это хорошо.