Мягкие тени используя иерархическую мин-макс карту теней Kirill Dmitriev Yury Uralsky
NVIDIA Confidential Обзор Традиционные алгоритмы мягких теней Мин-макс теневая карта Реализация PCF с большим ядром Реализация адаптивного размытия тени Идеи по улучшению производительности
NVIDIA Confidential Мягкие тени – это важно Важно для реалистичности Четкие тени могут получаться только от точечных источников, которых не существует в реальной жизни Важно для качества Скрывают артефакты возникающие из-за недостаточного разрешения карты теней
NVIDIA Confidential Обычные мягкие тени? PCF (Percentage Closer Filtering) Посчитать тень в нескольких точках вокруг и усреднить Размер фильтра (K) управляетмягкостью K
NVIDIA Confidential Percentage closer filtering (PCF) Важно усреднять не глубину а затенение: Железо NVIDIA реализует PCF для маленьких размеров фильтра (K) K
NVIDIA Confidential PCF с большим ядром PCF с большим ядром K требует много сэмплов Можно фильтровать по подмножеству текселей K: приводит к бандингу K
NVIDIA Confidential Рандомизированный PCF Чтобы избежать бандинга, можно в каждом фрагменте использовать свой набор сэмплов Заменяет бандинг на шум K
NVIDIA Confidential Дисперсные карты теней (variance shadow maps) Сохранять глубину и квадрат глубины Тогда можно вычислить дисперсию и используя неравенство Чебышева (из теории вероятностей) посчитать затенение Позволяет использовать мип-маппинг Недостаток: предположения теории вероятностей
NVIDIA Confidential Недостатки предыдущих алгоритмов Percentage closer filtering Нужно много сэмплов для качественной тени Дисперсные теневые карты Предположения теории вероятностей Общий недостаток Ядро фильтрации фиксировано
NVIDIA Confidential Новая идея Представим себе теневую карту как набор квадратиков в 3D пространстве В шейдере считаем затенение от каждого квадратика – получаем тень
NVIDIA Confidential Иерархическая мин-макс теневая карта Линейный проход по всем квадратикам (миллион) – слишком медленно Решение: иерархическое представление Можно отсекать целые кластеры текселей, заведомо не вносящих вклад в затенение фрагмента
NVIDIA Confidential Мин-макс теневая карта Мин канал 4 соседних текселя Макс канал Вычислить две мипмап пирамиды Используя мин фильтр Используя макс фильтр Можно сохранить в двухканальной текстуре
NVIDIA Confidential PCF с большим ядром используя минмакс теневую карту Каково затенение? 1.0 выйти 0.0 К друим текселям на том же уровне или выше Спуститься ниже иначе
NVIDIA Confidential Расчет затенения K SM texel Затенение одним теневым текселем равно пересечению между этим текселем и ядром фильтрации
NVIDIA Confidential Расчет затенения K Затенение можно считать полным если пересечение полное И макс канал меньше глубины фрагмента SM Texel
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень 2
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень 2 0.5
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень
NVIDIA Confidential По сути – проход по дереву 0 Мип уровень 0 Мип уровень 1 Мип уровень
NVIDIA Confidential По сути – проход по дереву Мип уровень 0 Мип уровень 1 Мип уровень 2
NVIDIA Confidential Демо: мягкие тени используя иерархическую минмакс теневую карту
NVIDIA Confidential Как сделать размытие адаптивным? Размытие должно увеличиваться Размытие должно зависеть от взаимного расположения источника света, затеняющего и затененного объектов
NVIDIA Confidential Физически аккуратные тени Будем вычислять затенение от каждого текселя с учетом площади источника света
NVIDIA Confidential Затенение – перспективная проекция текселя на источник фрагмент тексель Источник света Проекция на источник
NVIDIA Confidential Физически аккуратное затенение от всех текселей Суммирование идет по всем текселям 0-го мипмапа. Теневые тексели - AABBs, Источник света - тоже AABB: вычисления очень просты EvalS(depth) depth
NVIDIA Confidential Большая часть теневых текселей не важны Начинаем с больших текселей; if (EvalS(DepthMin) == 0) { откидываем поддерево; } Откидывает (2^N)^2 текселей где N – текущий уровень мипмапа if (EvalS(DepthMin) == 1 && DepthMax < DepthFrag) { выходим из шейдера; }
NVIDIA Confidential Протекание света Так как теневая карта создается для точечного источника света, а используется для площадного, возможны протекания света Гладкая поверхность
NVIDIA Confidential Пример протекания света
NVIDIA Confidential Как уменьшить протекания света Расширить на определенную величину теневые тексели Тексели с большей глубиной расширяются так чтобы проeкции их границ точно совпали с проeкциями границ соседей
NVIDIA Confidential Пример уменьшения протеканий света С протеканиями
NVIDIA Confidential Демо физически приближенных теней
NVIDIA Confidential Эффективная реализация стека Нам нужно класть/вынимать: индекс мип уровня (4 бита) + индекс пикселя (2 бита) Динамическая индексация массива в шейдере – накладно. Если элемент стека мал – лучшее решение...
NVIDIA Confidential Операция push() Младшее слово (32 бита) Старшее слово (32 бита) Нам нужно класть/вынимать: индекс мип уровня (4 бита) + индекс пикселя (2 бита)
NVIDIA Confidential Операция push() Младшее слово (32 бита) Старшее слово (32 бита) Нам нужно класть/вынимать: индекс мип уровня (4 бита) + индекс пикселя (2 бита)
NVIDIA Confidential Идеи как ускорить Можно останавливаться не доходя до низа дерева Если затененный объект находится далеко Вычислять точные значения затенения на грубой сетке Остальные пиксели можно интерполировать/вычислять базируясь на значениях в узлах сетки… Нужна хорошая эвристика!
NVIDIA Confidential Эвристика интерполяции Нельзя интерполировать если сильно неплоская поверхность Нельзя интерполировать если затенение узлов слишком сильно меняется Затенение может сильно менятся если есть объекты, расположенные слишком близко к точке затенения
NVIDIA Confidential Для каждого узла сетки сохранять расстояние до ближайшего затенителя (всего один float на узел); Можно интерполировать только если фрагмент находится внутки бокса, образованного четырьмя ближайшими узлами сетки И расстояние до ближайшего затенителя больше чем размер бокса. Эвристика интерполяции
NVIDIA Confidential Ссылки [1] See NVIDIA SDK10 SoftShadows demo for details [2] Gael Guennebaud, Loic Barthe and Mathias Paulin. Real-time Soft Shadow Mapping by Backprojection. Eurographics Symposium on Rendering 2006, Nicosia, Cyprus.
NVIDIA Confidential Вопросы?