LOD-кроссфейд: как не показывать игроку момент подмены
В прошлой статье мы договорились врать игроку с расстоянием. Но ложь раскрывается в момент переключения: дерево дёргается, гора «всплывает», силуэт на секунду меняется. Это pop-in — и от него лечатся кроссфейдом.
Что такое кроссфейд LOD
Движок не переключает модели скачком, а некоторое расстояние плавно смешивает их. В Unity ползунок Blend Distance в LOD Group: например, LOD0 активен до 30 метров, смешивание с LOD1 на 30–40, дальше чистый LOD1. В Unreal — аналогично, плюс режим dithered crossfade: пиксели случайным образом выбираются из одной или другой сетки, и граница размывается.
Визуальный эффект: силуэт на переходе «дрожит», но не прыгает. Для листвы, камней, травы — идеально. Для персонажа в упор — нет: дрожание заметно сильнее скачка.
Морфинг: вершины едут сами
Продвинутая версия — не смешивать, а перетекать. Если LOD0 и LOD1 построены с одинаковой топологией (та же сетка, только упрощённая без перестройки), GPU может интерполировать позиции вершин между уровнями. Модель плавно «сдувается» по мере удаления. Вот только Decimate и Remesh в Blender соответствие вершин как раз и разрушают — нижние LOD для морфинга делают ручной ретопологией от LOD0 или генераторами, сохраняющими маппинг (аддон Instant Models, Simplygon, встроенный LOD-генератор движка). В движке — шейдер морфинга. И не путать с Nanite в Unreal: он убирает pop-in другим механизмом — кластерным рендером с выбором деталей по экранному размеру, без всякого морфинга, но это отдельная история.
Цена: LOD-пары должны быть «родственными», а не лепленными независимо. То есть ретопологию нижних уровней надо начинать от верхней сетки, а не от нуля.
Цены перехода
Кроссфейд не бесплатен, и платим мы тремя валютами:
- FPS. В зоне blend движок рендерит обе модели одновременно — двойная вершинная нагрузка. На массовых объектах (лес из 2000 деревьев) это ощутимо. Лечится узкой зоной blend: 5–10% от дистанции переключения, не больше.
- Память. Сам кроссфейд новой памяти не требует: оба LOD и так лежат в VRAM — движок просто держит их оба загруженными на подходе к зоне переключения. Реальная цена перехода — та самая двойная вершинная нагрузка в кадре (пункт 1), а не гигабайты. Плюс морфинг требует хранить соответствие вершин — дополнительные буферы.
- Художественная дисциплина. Родственная топология, совпадающие UV, одинаковые материалы. Зато pop-in уходит.
Практические пороги
- Дистанция blend = 10–15% от дистанции переключения. Больше — замучаетесь с просадками.
- Для hero-объектов (боссы, транспорт вплотную) — морфинг или вообще без кроссфейда, просто качественный LOD1.
- Для листвы и мелочи — dithered crossfade, дрожание под шум листвы не видно.
- Прыгающие тени лечатся согласованием кроссфейда с дистанцией теней: тень не должна переключаться раньше самой модели. В Unity, например, обе сетки рендерятся в shadow map во время blend. Форсировать LOD0 для теней не нужно — и reflection probes тут ни при чём: они не считаются «по LOD», это кубики с заранее отснятой картинкой.
Когда не лечить вовсе
Pop-in незаметен, если объект мелкий, движение камеры быстрое, или сцена тёмная. Не тратьте бюджет на кроссфейд галстуков NPC в ночном клубе. Сначала покажите игру на слабом железе и спросите, видна ли подмена. Если да — лечите; если нет, значит, вы уже победили.
Комментарии (1)
Морфинг между LOD через 2 кадра спас мой болотный уровень. Проверено.
Форма для гостей комментариев пока не принимается — писать можно автору (expeot@outlook.com) или через владельца блога. Все записи выше настоящие, никто их не модерирует молча.