Procedural Tree Generation & Stylized Shader
Procedural vegetation pipeline developed for Yerba Buena using Blender Geometry Nodes and custom Unity shaders.
Developed for the upcoming title Yerba Buena, this system combines procedural tree generation, vertex data baking, and stylized real-time shading into a scalable vegetation workflow optimized for game production.
The toolset automates tree creation while preserving artistic control over shape, motion, and rendering behavior.
Project Context
This project was developed for Yerba Buena, an upcoming title developed by Mad About Pandas and published by Focus Entertainment.
As a Technical Artist working full time on the project, my goal was to create a procedural vegetation workflow capable of producing stylized trees with:
Fast iteration speed
Strong visual consistency
Runtime animation support
Minimal material complexity
Efficient integration into Unity
The system needed to bridge procedural content generation inside Blender with custom rendering behavior inside Unity.
Geometry Nodes Generator
The procedural generator was built entirely using Blender Geometry Nodes and designed around modular procedural controls.
The system generated:
Tree trunks
Primary and secondary branches
Crown distribution
Leaf placement
Surface variation
Parameters
The tool exposed adjustable parameters for:
Trunk height
Trunk thickness
Branch density
Branch layering
Crown scale
Crown distribution
Leaf coverage
This allowed artists to quickly generate large numbers of unique trees while maintaining a cohesive visual style.
Procedural LOD Generation
To support efficient real-time rendering, the generation system also included procedural Level of Detail (LOD) creation directly inside the Geometry Nodes workflow.
Because the tree generator was entirely parameter-driven and deterministic through seed values, identical tree variations could be regenerated at multiple geometric resolutions automatically.
The system exposed controls for:
Branch subdivision density
Curve resolution
Leaf density
Crown complexity
Overall mesh detail
9k Triangles
3.3k Triangles
1k Triangles
Using the same seed and structural settings, artists could rapidly generate:
High-detail hero trees
Mid-range gameplay LODs
Lightweight distant silhouettes
while preserving the overall shape and visual identity of each tree.
This significantly accelerated vegetation optimization workflows and ensured visual consistency across LOD transitions.
Under The Hood
Leaf Placement & Crown Generation
Leaf placement was generated procedurally using spherical proxy meshes defining the overall crown shape.
This approach enabled:
Controlled foliage density
Dynamic Normal recalculation
Cohesive silhouettes
Consistent stylization
The spherical proxies also became important for additional shading calculations later in the pipeline.
The goal was not photorealism, but readable stylized forms with strong visual clarity from gameplay distances.
Vertex Data Authoring
A major part of the workflow involved procedurally generating vertex data directly inside Blender for use inside Unity shaders.
The system wrote multiple data layers into vertex colors R, G and B Channels.
This approach reduced texture dependency while enabling rich stylized animation and shading behaviors entirely through mesh data.
Ambient Occlusion
Baked vertex AO provided depth and shading variation without requiring additional texture maps.
Height Gradient
A top-to-bottom gradient enabling procedural bending behavior driven by wind intensity.
Leaf Mask
Used to isolate foliage motion so trunks and leaves could share a single material while behaving differently in the shader.
Custom Unity Vegetation Shader
Inside Unity, a custom shader was developed to bring the procedural vegetation data to life in real time.
The shader handled:
Tree bending
Secondary leaf motion
Stylized translucency
Ambient occlusion shading
Vertex-driven animation masking
Stylized translucency was achieved using fresnel-based lighting to simulate soft light transmission through foliage.
All shading behavior was driven directly by the procedural vertex data generated in Blender.