Все статьи
Туториалы · 6 min read

Густые леса без обрыва фреймрейта: LOD'ы, импостеры и инстансинг

Как рендерить тысячи деревьев на фреймрейте: цепочка LOD от полного меша до биллборда, октаэдрические импостеры, что держат с любого ракурса, инстансинг и отсечение, и приёмы ветра и шейдинга, что удерживают запечённый лес от вида мёртвого.

Spruce forest on a green alpine slope with a handful of wooden cabins below

Коротко: убедительный густой лес — это бой с боссом производительности: тысячи высокополигональных деревьев, слоистая прозрачность и инстансы, тянущиеся до горизонта. Побеждаешь его дисциплинированной цепочкой LOD, что кончается импостерами (биллбордами, обращёнными к камере, что подделывают 3D-дерево с любого ракурса), агрессивным инстансингом и отсечением, и парой приёмов шейдинга, чтобы дешёвые дальние деревья себя не выдавали. Эта статья проходит всю цепочку от полного меша до биллборда, трюк октаэдрического импостера, и как удержать сильно оптимизированный лес от вида мёртвого.

Край леса, деревья уходят вглубь Каждое дерево здесь на разной дистанции от камеры, так что каждое дерево должно быть разной стоимости. Искусство дешёвого леса в том, чтобы тратить полигоны лишь на близкие и убедительно подделывать остальные.

Основная идея: платить по дистанции

Дерево в 5 метрах и в 500 метрах не должны стоить одинаково. Цепочка LOD тратит полный детал вблизи и прогрессивно более дешёвые представления с дистанцией, кончаясь плоским биллбордом, так что общая стоимость остаётся плоской, пока лес растёт.

Вся игра — отказаться платить полную цену за деревья, что камера едва разрешает. Вблизи дерево — полный меш с индивидуальными карточками листьев, а далеко его заменяет горстка пикселей, что плоское изображение воспроизводит идеально. Цепочка LOD (уровень детализации) формализует это: несколько версий того же дерева при убывающей стоимости, подмениваемых по размеру на экране, так что лес из десяти тысяч деревьев стоит примерно то, что видимо в детале, вместо суммы каждого дерева на полном качестве. Без неё плотность масштабирует твоё время кадра линейно в землю; с ней ты можешь толкать число деревьев гораздо выше за тот же бюджет.

Цепочка LOD, шаг за шагом

LOD0 полный меш с карточками листьев (близко); LOD1–2 упрощённая геометрия и упрощённые листья (средне); LOD3 несколько карточек или одна карточка; финальный LOD импостер/биллборд (далеко). Каждый шаг приблизительно вдвое снижает стоимость, пока подмена остаётся невидимой.

Типичная цепочка LOD листвы идёт примерно так: LOD0, меш с полным деталом со всеми карточками листьев, для деревьев прямо рядом с игроком; LOD1–LOD2, упрощённая геометрия ствола и меньше, крупнее карточек листьев, для среднего плана; LOD3, драматически упрощённый кластер карточек; и финальный импостер (по сути плоское изображение) для всего дальнего. Мастерство в дистанциях перехода и блендинге, чтобы подмена не хлопала. Дизерные или кросс-фейд-переходы LOD прячут переключение; жёсткий хлопок на неверной дистанции, примета, что ломает иллюзию. Настраивай дистанции против реальной камеры, а не дефолтов.

Импостеры: подделка 3D с любого ракурса

Импостер (октаэдрический импостер) пре-рендерит дерево с десятков ракурсов в атлас, потом показывает ближайший захваченный вид как биллборд. В отличие от плоского биллборда, он выглядит корректно, пока камера движется вокруг: дёшево, но 3D-ish.

Дальний конец цепочки, где живут самые большие экономии, и импостер служит тем умным трюком, что делает их приемлемыми. Простой биллборд, одно плоское изображение, что поворачивается к камере, выглядит хорошо фронтально, но плющится и скользит неестественно, пока движешься. Октаэдрический импостер решает это, пре-рендеря дерево с многих точек обзора, расставленных вокруг сферы, упаковывая их в текстурный атлас, и показывая какой захваченный ракурс ближе всего к текущему направлению камеры (смешивая между ближайшими несколькими). Результат читается как настоящее 3D-дерево с любого ракурса за долю стоимости, вот почему импостеры служат хребтом правдоподобных дальних лесов. Их запекают раз, и они стоят почти ничего для отрисовки.

Папоротники и низкий подлесок, покрывающие лесную подстилку Слой земли быстро умножает количество инстансов. Подлесок нуждается в той же дисциплине, что и деревья: инстансь его, LOD-и его, и отсекай жёстко: папоротник на 80 метрах не должен рисоваться вообще.

Инстансинг и отсечение

Рисуй повторяемые деревья как инстансы, чтобы тысячи стоили немного дроколлов, и отсекай агрессивно: фрустум-отсекай то, что вне экрана, и дистанц-отсекай мелочь. Инстансинг чинит стоимость CPU; отсечение останавливает тебя от платы за невидимое.

Даже с идеальными LOD'ами, подача десяти тысяч деревьев как индивидуальных объектов хоронит CPU. Инстансинг схлопывает все копии дерева в горстку дроколлов, что не обсуждается для настоящего леса, и это ровно то, что даёт запекание скаттера в нативные инстансы движка. Сверху отсекай беспощадно: фрустум-отсечение отбрасывает всё вне вида, а дистанц-отсечение удаляет наземный хлам и мелкую листву, слишком крохотную, чтобы заметить за определённым диапазоном. Трава и подлесок особенно должны иметь жёсткие, близкие дистанции отсечения, потому что они умножают количество инстансов быстрее деревьев. Рабочий процесс, что красит плотность и потом запекает в инстансированные меши (как у Numivo), вручает движку ровно ту сбатченную, отсекаемую форму, что нужна густому лесу.

Держать дешёвый лес живым

Тяжёлая оптимизация может сделать лес выглядящим статичным и мёртвым: контрируй тонким ветром на близких LOD'ах, вариацией цвета и масштаба между инстансами, и шейдингом, что удержит дальние импостеры от чтения как плоский картон.

Риск всей этой эффективности в том, что лес бежит отлично и чувствуется безжизненно. Три дешёвых касания возвращают его: ветер: вершинная анимация на близких LOD'ах, чтобы близкая листва двигалась, даже если дальние импостеры стоят неподвижно (никто не замечает статичного дерева в 300 метрах). Вариация: рандомизируй масштаб, вращение и тинт на инстанс, чтобы глаз не поймал повтор; идентичные деревья, примета копипаста. И забота о шейдинге на импостерах: запеки их освещение, чтобы они не сплющивались в очевидный картон, когда меняется угол солнца. Потрать время кадра, что ты сэкономил, на эти детали вблизи, где игрок реально смотрит, и оптимизированный лес чувствуется таким же живым, как неоптимизированный, работая в несколько раз быстрее.

Полевые числа, которые стоит украсть

  • Принцип стоимости: платить по дистанции, дальнее дерево не должно стоить как близкое
  • Цепочка LOD: полный меш → упрощённый → кластер карточек → импостер, каждый ~вдвое снижает стоимость
  • Импостер = пре-рендеренные ракурсы в атласе → 3D-ish биллборд с любого вида
  • Инстансь повторы (немного дроколлов) + жёстко-отсекай мелкую дальнюю листву
  • Держи живым: ветер на ближнем LOD + вариация на инстанс + запечённый шейдинг импостера

Мини-FAQ

Биллборд vs импостер: в чём разница? Биллборд, одно плоское изображение, что поворачивается к камере, сплющивается, пока ты движешься вокруг. Импостер хранит много ракурсов и показывает правильный, так что держится в 3D. Для всего, что игрок обводит или проходит мимо, используй импостеры; простые биллборды годятся лишь для по-настоящему дальних, статичных задников.

Сколько уровней LOD нужно дереву? Обычно три-четыре плюс импостер. Больше не автоматически лучше. Каждый уровень добавляет стоимость авторинга и памяти. Достаточно, чтобы сделать каждую подмену малым, незаметным шагом, вот цель, не максимум.

Делает ли Nanite это устаревшим? Он меняет сторону геометрии (Nanite обрабатывает плотный меш-детал без традиционных LOD'ов), но прозрачность (карточки листьев), дисциплина инстансинга и отсечение всё ещё важны, а импостеры остаются полезны для дальней дистанции. Принципы выживают; инструментарий сдвигается.

Что чаще всего убивает производительность леса? Овердро от перекрывающихся прозрачных карточек листьев и неотсечённая наземная листва. Затяни карточки листьев, отсекай подлесок близко, и инстансь всё, эта тройка возвращает большую часть бюджета до того, как ты вообще коснёшься мешей деревьев.

Густой лес — одна из самых карающих вещей для рендеринга и одна из самых вознаграждающих для правильного исполнения. Построй цепочку LOD, дай импостерам нести дистанцию, инстансь и отсекай без пощады, и потрать экономию на ветер и вариацию вблизи, и у тебя будет лес, что тянется до горизонта и держит свой фреймрейт.