Оптимизированный скаттер травы (и не только травы)
Вот недавно для мульта я делал скаттер травы. Ну что же может быть проще, создаем на поверхности точки и инстансим траву на этих точках:
Что может быть проще?
Вопрос тут в том, а сколько объектов потянет ваша система, ведь травы должно быть много. Моя пустая сцена с 40 тысячами травинок уже начинает проседать:
Неужели 40 тысяч объектов по 40 полигонов (1.2млн поликов) это уже лимит? Да конечно, можно вывести на предпросмтр меньше инстансов, а все выводить только на рендере, но на самом деле есть способ все оптимизировать.
Тут проблема не в количестве полигонов, а в количестве объектов, как таковом. Дело в том, что каждый объект отрисовывается отдельным запросом в видеокарту, который называют Draw call. Мостик между видеокартой и процессором - это бутылочное горлышко, которое будет тормозить всю систему. В движках, таких как Unity вы можете узнать количество запросов, тогда как в Blender такой функционал отсутствует.
Итак, что-же нам делать, чтобы уменьшить количество запросов? Есть такая штука как Realize Instances, она сконвертирует наши отдельные инстансы в один большой меш. При этом, если мы ничего не меняем в меше от фрейма к фрейму, выглядит все хорошо:
Но вот сам процесс realize instance очень тяжелый:
Что даст нам очень маленький FPS если в модификаторе что-то меняется:
Поэтому, чтобы сделать скоростной скаттер, я совместил оба подхода, чтобы у нас было и маленькое количество релизнутой геометрии и не много инстансов. Сначала мы делаем блоки травы, конвертируем ее в меш а потом распределяем ее по поверхности.
И вуаля, даже с 10x большим количеством травы, (12млн поликов) ничего не проседает:
Начинает проседать уже на 120 млн:
Я для себя сделал кучу настроек скаттера, добавил анимацию легкого ветерка. С помощью тест функций можно посмотреть распределение блоков по поверхности и как выглядят сами блоки. Плюс самих блоков можно сделать несколько, что добавит рандомности:
Так выглядят ноды:
Этот скаттер с кучей настроек выложу подписчикам с уровнем исходники
geometry nodes