Тіньові артефакти на карті


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. (EDIT: це неправда, я писав, що коли я працював над візуалізацією фільмів. У розробці ігор, ви хочете, щоб тіньова карта була якомога меншою)

Деякі ресурси для вивчення більш прогресивних методик.


редагувати:


У мене є ще кілька матеріалів на цю тему в роботі, якщо ви зацікавлені, я також поділюсь нею.
Нотабене

Основна проблема великих резолюцій полягає в тому, що в кінцевій грі у мене є близько 3-4 світильників, які є непрямими => мені доведеться використовувати кубічні тіньові карти там, що призводить до отримання 24 тіньових карт. Якщо у вас є додаткові матеріали, я б дуже цінував ваші зусилля, щоб поділитися цим зі мною :-)
Etan

Мене цікавить принаймні, якщо це має значення :)
Джеймс

1
@Etan. Так, всенаправлені вогні справжні болі, якщо говорити про тіні. (я щось про це знаю :) gamedev.stackexchange.com/questions/6203/… ). Спробуйте використовувати подвійні параболоїдні карти. Або якщо вам подобаються кубічні карти, спробуйте заощадити трохи місця за допомогою відсікання перетину frustum-camera_frustum для кожного обличчя / візуалізації. Ти, мабуть, не потребуватимеш тіні для всіх напрямків (особливо в екстер'єрі)
Notabene

1
@Etan @James Я додав ще кілька речей для вас. Обидва варто прочитати, якщо вас цікавить ця тема.
Нотабене
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.