Procedural Grass в Ghost of Tsushima
Здесь трава — это не набор расставленных мешей. По сути это GPU-driven procedural pipeline, который генерирует, фильтрует и рендерит растительность почти полностью на стороне GPU.
Цели у системы довольно практичные:
• минимальная нагрузка на CPU
• масштабируемость для большого open world
• высокая визуальная плотность
• правдоподобное поведение на ветру
😡Procedural placement
Растительность не хранится как тысячи объектов сцены. Вместо этого на поверхности генерируются seed points — компактные записи, описывающие будущую траву. В них обычно лежат:
• тип растения
• вариация формы
• плотность
• параметры анимации
Распределение сидов учитывает особенности поверхности:
• угол наклона (slope)
• высоту
• тип материала
• контекст окружения (дороги, тропинки и т.п.)
За счёт этого данных хранится немного, а плотность растительности можно менять динамически.
⚡️ GPU-driven pipeline
CPU здесь в основном задаёт правила. Основная работа происходит на GPU.
Упрощённо пайплайн выглядит так:
seed data → visibility pass → LOD selection → instance buffer → indirect draw
Используются:
• compute shaders для подготовки instance buffer
• GPU frustum и distance culling
• indirect draw calls
CPU не управляет миллионами объектов — он лишь передаёт исходные данные и параметры.
---
🌾 LOD управляет не только геометрией
LOD здесь работает не просто как «меньше полигонов дальше от камеры».
Меняется и геометрия, и плотность растительности:
• рядом с камерой — полноценные blades
• на средней дистанции — grass cards
• вдали — impostor-поля
Так удаётся сохранить ощущение плотного травяного покрытия без перегрузки GPU.
---
🌬 Система ветра
Фирменный “Wind of Tsushima” — важная часть визуального стиля игры.
Для движения травы используется vector field. Он задаёт направление и силу ветра в пространстве.
Поверх этого комбинируются:
• крупные порывы ветра
• мелкие высокочастотные колебания
• локальная деформация от персонажа
Реакция травы задаётся кривыми (curve parameters), поэтому движение выглядит естественно и не синхронно.
---
⚙️ Оптимизации
Несколько вещей, которые делают систему дешёвой:
• секторный procedural culling
• очень компактные instance-данные
• многоступенчатые GPU-буферы
pipeline буферов выглядит примерно так:
visibility → LOD → final draw buffer
В результате одна травинка описывается буквально несколькими байтами данных.
---
🧩 Почему эта система интересна
Ghost of Tsushima хорошо показывает современный подход к растительности:
• data-driven
• GPU-centric
• процедурная генерация
• масштабируемость для open worlds
Трава здесь — не просто декор. Это часть динамической системы окружения, которая реагирует на ветер, камеру и игрока.
---
🎥 Разбор от разработчиков:
https://www.youtube.com/watch?v=Ibe1JBF5i5Y
Здесь трава — это не набор расставленных мешей. По сути это GPU-driven procedural pipeline, который генерирует, фильтрует и рендерит растительность почти полностью на стороне GPU.
Цели у системы довольно практичные:
• минимальная нагрузка на CPU
• масштабируемость для большого open world
• высокая визуальная плотность
• правдоподобное поведение на ветру
😡Procedural placement
Растительность не хранится как тысячи объектов сцены. Вместо этого на поверхности генерируются seed points — компактные записи, описывающие будущую траву. В них обычно лежат:
• тип растения
• вариация формы
• плотность
• параметры анимации
Распределение сидов учитывает особенности поверхности:
• угол наклона (slope)
• высоту
• тип материала
• контекст окружения (дороги, тропинки и т.п.)
За счёт этого данных хранится немного, а плотность растительности можно менять динамически.
⚡️ GPU-driven pipeline
CPU здесь в основном задаёт правила. Основная работа происходит на GPU.
Упрощённо пайплайн выглядит так:
seed data → visibility pass → LOD selection → instance buffer → indirect draw
Используются:
• compute shaders для подготовки instance buffer
• GPU frustum и distance culling
• indirect draw calls
CPU не управляет миллионами объектов — он лишь передаёт исходные данные и параметры.
---
🌾 LOD управляет не только геометрией
LOD здесь работает не просто как «меньше полигонов дальше от камеры».
Меняется и геометрия, и плотность растительности:
• рядом с камерой — полноценные blades
• на средней дистанции — grass cards
• вдали — impostor-поля
Так удаётся сохранить ощущение плотного травяного покрытия без перегрузки GPU.
---
🌬 Система ветра
Фирменный “Wind of Tsushima” — важная часть визуального стиля игры.
Для движения травы используется vector field. Он задаёт направление и силу ветра в пространстве.
Поверх этого комбинируются:
• крупные порывы ветра
• мелкие высокочастотные колебания
• локальная деформация от персонажа
Реакция травы задаётся кривыми (curve parameters), поэтому движение выглядит естественно и не синхронно.
---
⚙️ Оптимизации
Несколько вещей, которые делают систему дешёвой:
• секторный procedural culling
• очень компактные instance-данные
• многоступенчатые GPU-буферы
pipeline буферов выглядит примерно так:
visibility → LOD → final draw buffer
В результате одна травинка описывается буквально несколькими байтами данных.
---
🧩 Почему эта система интересна
Ghost of Tsushima хорошо показывает современный подход к растительности:
• data-driven
• GPU-centric
• процедурная генерация
• масштабируемость для open worlds
Трава здесь — не просто декор. Это часть динамической системы окружения, которая реагирует на ветер, камеру и игрока.
---
🎥 Разбор от разработчиков:
https://www.youtube.com/watch?v=Ibe1JBF5i5Y