Розробка шейдерів рослинності та вітру для графіки

Наша компанія з розробки відеоігор веде незалежні проекти, спільно з клієнтом створює ігри та надає додаткові операційні послуги. Досвід нашої команди дозволяє нам охопити всі ігрові платформи та розробити приголомшливий продукт, що відповідає баченню клієнта та перевагам гравців.

Від імерсивних застосунків до ігрових світів і 3D-сцен

Наша виділена команда для VR/AR/MR-розробки, Unity-продакшну і 3D-моделювання та анімації — з власними кейсами і презентаціями.

Відвідати персоналізований сайт
Показано 1 з 1 послугУсі 242 послуг
Розробка шейдерів рослинності та вітру для графіки
Складна
від 3 робочих днів до 2 тижнів
Часті питання

Наші компетенції

Які етапи розробки гри?

Останні роботи

  • image_games_mortal_motors_495_0.webp
    Розробка гри для компанії Mortal Motors
    683
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    Покрокова стратегія у фентезі сеттингу With Fire And Sword
    862
  • image_games_second_team_604_0.webp
    Розробка ігри для компанії Second term
    491
  • image_games_phoenix_ii_606_0.webp
    3D-анімація – тизер для гри phoenix 2.
    533

Розробка шейдерів рослинності та вітру для графіки

Дерева та трава в іграх — це не статичні меші. Це тисячі instances, кожен з яких повинен рухатися переконливо під вітром, правильно приймати освітлення через тонкі листки, не створювати z-fighting на напівпрозорих гранях та не вбивати продуктивність на мобільних пристроях. Зробити це правильно — означає вирішити кілька не пов'язаних між собою технічних проблем одночасно.

Vertex animation для вітру: чому скелетна анімація не підходить

Дерево з тисячею листків не можна анімувати через кості — це сотні skinned mesh renderer вишивів. Стандартне рішення — vertex shader animation, де переміщення вершини закодовано в самому шейдері та керується параметрами вітру через Material Property Block або Global Shader Property.

У ShaderGraph (URP/HDRP) алгоритм будується так: Transform Position нода → World Position → додаємо Sine-based offset по двом осям (X та Z) з Time + Phase Offset. Phase Offset — критично важливий параметр: він кодується в вершинний колір або UV-канал меша (звичайно UV2) на етапі підготовки ассету. Без phase offset всі гілки дерева рухаються синхронно — це виглядає як механічне покачування, а не органічний вітер.

Ієрархічний вітер — справжній differentiator якісного vegetation shader'а. Рух розбивається на три рівні:

  • Trunk sway (раскачивание стовбура) — низька частота, велика амплітуда, вся геометрія дерева
  • Branch flutter (рух гілок) — середня частота, менша амплітуда, закодована через R-канал Vertex Color
  • Leaf shimmer (трепет листків) — висока частота, мінімальна амплітуда, G-канал Vertex Color

У шейдері кожен рівень — окремий Sine з різними frequency та amplitude параметрами. Weight для кожного рівня береться з vertex color каналу. Це означає, що художник повинен запекти vertex colors в дерево перед експортом: у основи стовбура R=0 (немає branch flutter), на кінцях гілок R=1.

Двусторонняя відрисовка та alpha clipping

Листки — це полігональні карточки (billboard quads або meshcard strips) з alpha texture. Проблеми два типи:

Alpha blending vs Alpha Clipping. Blending правильно сортує напівпрозорість, але вимагає правильного depth sorting всіх листків, що неможливо без GPU-side sorting. На практиці для vegetation використовують Alpha Clipping (Alpha Test): жорстка межа по порогу, без blending. Це дає артефакти на краях, але працює правильно з depth buffer та інстансингом. Поріг (Cutoff) звичайно 0.4–0.6 залежно від текстури.

Двусторонняя відрисовка. Lit шейдер по замовчуванню освітлює тільки front face. Для листків потрібен Two Sided матеріал з Flip Normals на back face — інакше задня сторона листка буде чорною при будь-якому освітленні. У ShaderGraph це Two Sided checkbox в Graph Settings + Facing нода для застосування normal flip.

Subsurface scattering для листків. Реальні листки просвічуються на сонці. У URP для vegetation використовують Translucency апроксимацію: беруть dot product між Light Direction та View Direction, додають його до Albedo через Lerp з translucency color (теплий зелений). Це ~4 ноди у ShaderGraph, додає +0.1ms до вартості шейдера, але різниця у візуальній якості очевидна.

Інстансинг та GPU Instancing

Трава та дерева вимагають GPU Instancing — інакше кожен куст це окремий draw call. У Unity для vegetation правильний підхід:

  • Graphics.DrawMeshInstanced або Graphics.DrawMeshInstancedIndirect для процедурної рослинності
  • Unity Terrain Detail Mesh — вбудований інстансинг для деталізації террейну
  • SpeedTree integration (вбудований в Unity, але вимагає ліцензію SpeedTree для редагування)

Шейдер повинен підтримувати #pragma instancing_options та використовувати UNITY_SETUP_INSTANCE_ID у вершинному шейдері. У ShaderGraph це автоматично, але при написанні кастомного HLSL через Custom Function ноду потрібно явно додати ці pragma.

Material Property Block дозволяє передавати per-instance параметри (phase offset, wind strength multiplier) без створення окремого Material на кожен instance — критично для performance при сотнях інстансів з різними параметрами.

Настройка вітру через Global Shader Properties

Вітер у сцені — це глобальний параметр. Правильна архітектура: WindController MonoBehaviour встановлює Shader.SetGlobalFloat("_WindStrength", strength) та Shader.SetGlobalVector("_WindDirection", dir) кожен кадр (або по подіям зміни вітру). Всі vegetation шейдери читають ці глобальні параметри через Global ноду в ShaderGraph (Custom Function: UNITY_ACCESS_INSTANCED_PROP для per-instance або просто float з Global для shared).

Це дає можливість робити динамічні ефекти вітру: посилення при шторму, порив при вибуху рядом, зміна напрямку через день-ночний цикл — все через один контролер без змін матеріалів.

Тип задачі Строк
Шейдер трави (URP, mobile, з вітром) 2–4 дні
Шейдер дерева (URP, ієрархічний вітер, PBR листки) 4–7 днів
Vegetation shader set (трава + кусти + дерева) 1–2 тижні
HDRP з subsurface + translucency 1–2 тижні

Вартість розраховується індивідуально за результатами обговорення рендер-пайплайну, цільової платформи та стилю графіки.