Растительность: билборды, импостеры и скоростные деревья
Лес в игре — это не сотни деревьев, это десятки тысяч объектов, и каждый кадр движок должен решить, что из них рисовать. Деревья — самый массовый объект в окружении, и именно они чаще всего кладут FPS. Хорошая новость: дерево — идеальная жертва для обмана, потому что игрок никогда не рассматривает крону с ближней дистанции дольше секунды.
Tree cards: крона из картонок
Настоящая крона из веток и отдельных листьев — расточительство. Рабочий стандарт: tree cards — плоские квады с текстурой ветвей, скрещённые пучком вокруг ствола. Классическая схема: 4–6 карт в кроне, пересечённые под углами, плюс 2–3 горизонтальные карты снизу и сверху. С любого ракурса игрок видит «объём», хотя внутри — только картон.
Проблема карт — силуэт: под некоторыми углами видна пустота между картами. Лечится плотным пересечением и альфа-текстурами, где ветви занимают большую часть кадра. Второе табу — освещённость: картонная крона на прямом солнце светится как абажур, если не запечь в текстуру нормальное затенение.
Impostor: дерево, которое притворяется картинкой
Для дальней дистанции карты уже дороги — тысячи деревьев дают десятки тысяч draw call. Решение — импостор: дерево рендерится один раз с 8–16 фиксированных ракурсов, кадры склеиваются в атлас. Вдали движок берёт нужный кадр из атласа и рисует один квад на дерево. Десять тысяч деревьев — десять тысяч квадов, а то и один instanced-батч.
Недавно эта техника живёт в Nanite Virtual Geometry и в Houdini-пайплайнах, но суть не изменилась с Far Cry 2: ближняя дистанция — геометрия, дальняя — фотоснимок геометрии. Порог переключения ставят так, чтобы pop-in был незаметен: обычно 30–60 метров для дерева.
Главный риск импостора — свет. Картинка запечена с одним освещением, а в сцене солнце ходит. Практический выход: импосторы только для дальнего плана, где разница углов не читается, плюс динамическая модуляция цвета под туман и время суток.
Скоростные деревья: ветер важнее полигонов
Дерево, которое не шевелится, выглядит мёртвым — и это выдаёт обман быстрее, чем низкое разрешение. Поэтому последний слой обмана — wind-шейдер: вершинный шейдер, гнущий ствол и листву по синусу с шумом. Правила простые:
- Амплитуда растёт от корня к веткам: ствол почти стоит, кончики ветвей гуляют на 10–20 см.
- Каждая карта кроны получает свою фазу по позиции — иначе лес качается как один флажок.
- Сила ветра — глобальный параметр: порывы двигают весь лес синхронно, и это лучшая инвестиция в «живость» сцены на свете.
Стоимость — ноль полигонов, чистая математика в вершинном шейдере. Деревья-карты с ветром выглядят живее, чем статичная высокая геометрия: движение продаёт объём лучше объёма.
Итоговая схема
Типовой LOD-путь дерева в моём пайплайне: LOD0 — ствол с нормал-картой + 6 карт кроны; LOD1 — 3 карты; LOD2 — импостор-квад; дальше — туман и здравый смысл. Плюс wind-шейдер на всех уровнях, кроме импостора (там «ветер» уже в запеченных кадрах).
Ботаники плачут, лес стоит, FPS ровный. В игре про лесоруба растительность — единственный противник, которого нельзя срубить: его можно только правильно нарисовать.
Комментарии (1)
Speedtree не поднимается на моём ноуте, ваши tree cards спасли прототип. Рендер импостеров в 8 направлений — понял наконец.
Форма для гостей комментариев пока не принимается — писать можно автору (expeot@outlook.com) или через владельца блога. Все записи выше настоящие, никто их не модерирует молча.