To achieve a fuller stylized silhouette without relying on dense card setups, I shaped the tree canopy using simple base geometry in Maya. This provided a strong overall form before shading was applied.
The shader then inflates billboarded leaf elements, allowing the canopy to appear softer and more voluminous while keeping the geometry lightweight.
Leaf opacity masks are interchangeable, making it easy to vary foliage patterns across assets without rebuilding the shader. This supports visual variety while maintaining a consistent stylized language.
The same canopy workflow was extended to bushes, allowing both assets to share a consistent stylized language while keeping the geometry lightweight.
By shaping the base forms first and relying on shader-driven leaf inflation, I was able to create dense-looking foliage without resorting to heavily layered card setups.
Opacity masks remain interchangeable, making it easy to generate variation across assets without rebuilding materials or increasing shader complexity.
The canopy was designed to achieve visual density while keeping shader complexity low, making it suitable for scenes with heavy foliage coverage.
Grass can easily look like it’s just sitting on top of the terrain if the color doesn’t match. To solve this, I used Runtime Virtual Texture blending so the grass pulls color directly from the landscape and blends in naturally.
This keeps large ground areas feeling cohesive without needing constant manual tweaking.
To support stylization, I also introduced controllable “fake” wind lines — a directional motion layer that gives the grass a clearer sense of flow without relying on complex simulation.
Everything is parameter-driven, making it easy to adjust wind intensity, speed, and pattern depending on the mood of the environment.
Shader complexity remains in the green even across dense foliage coverage, keeping the material suitable for large environments.