Коротко: убедительный густой лес — это бой с боссом производительности: тысячи высокополигональных деревьев, слоистая прозрачность и инстансы, тянущиеся до горизонта. Побеждаешь его дисциплинированной цепочкой 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, дай импостерам нести дистанцию, инстансь и отсекай без пощады, и потрать экономию на ветер и вариацию вблизи, и у тебя будет лес, что тянется до горизонта и держит свой фреймрейт.

