Артефакты карты теней

16

Я хочу попробовать добавить тени в игру 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.

Остальная часть кода состоит из простого предоставления правильных значений шейдерам. При необходимости, я могу предоставить это хорошо.

Этан
источник

Ответы:

19

Это типичная проблема называется угревой болезнью . Это вызвано тем, что проецируемый пиксель карты теней (глубина) больше, чем пиксель на экране (уравнение не может правильно отображать глубину).

введите описание изображения здесь

Есть много решений для этого. Первое, самое простое - это предвзятость (я вижу это в вашем коде, так что это не проблема). И второе простое решение - карта теней в большем разрешении, действительно более чем типично иметь карты теней в разрешении 2048x2048 на текущем hw. (РЕДАКТИРОВАТЬ: это не правда, я писал, что когда я работал над рендерингом фильмов. В разработке игр, вы хотите, чтобы ваша карта теней была как можно меньше)

Некоторые ресурсы для изучения более продвинутых методов.


редактировать:

NotaBene
источник
У меня есть еще несколько материалов на эту тему в работе, если вы заинтересованы, я тоже поделюсь им.
Notabene
Основная проблема с большими разрешениями состоит в том, что в конце игры у меня есть около 3-4 источников света, которые не направлены => Мне придется использовать там кубические карты теней, что приводит к 24 картам теней. Если у вас есть дополнительные материалы, я бы очень признателен вам за то, что вы поделились ими со мной :-)
Etan
Я заинтересован, по крайней мере, если это имеет значение :)
Джеймс
1
@Etan. Да, всенаправленные огни - настоящая боль, если говорить о тенях. (я кое-что знаю об этом :) gamedev.stackexchange.com/questions/6203/… ). Попробуйте использовать двойные карты параболоидов. Или, если вам нравятся кубические карты, попробуйте сэкономить место, выбрав пересечение frustum-camera_frustum для каждого лица / рендера. Вероятно, вам не понадобится тень для всех направлений все время (особенно в экстерьерах)
Notabene
1
@Etan @James Я добавил еще кое-что для тебя. И то, и другое стоит прочитать, если вы заинтересованы в этой теме.
Notabene