If you have opened Unreal Engine 5.7 and noticed the Procedural Vegetation Editor sitting in the Window menu, you are probably wondering where to start. The documentation is sparse, the node graph is intimidating, and the relationship between PVE and existing foliage tools is not immediately obvious.
This guide is for developers who have never touched PVE before. We will go from plugin activation through to a finished forest of custom tree species scattered across a landscape, covering every step with enough detail that you can follow along in your own project. We will also be honest about where PVE excels and where it still has rough edges that you should know about before committing your environment art pipeline to it.
We have been working with PVE since the early 5.7 preview builds, integrating it into workflows alongside our Procedural Placement Tool and automating graph configuration through the Unreal MCP Server. This guide distills what we have learned into a practical starting point.
Prerequisites and Plugin Setup
Before you touch the PVE graph, you need to verify a few things in your project.
Engine and Project Requirements
PVE requires Unreal Engine 5.7 or later. It ships as a built-in plugin, not a marketplace download, but it is not enabled by default in all project templates.
Hardware considerations: PVE's graph evaluation is CPU-bound during generation, but the resulting meshes render through Nanite. You need a GPU that supports Nanite (DirectX 12 compatible, essentially any modern discrete GPU). Generation times scale with complexity — a simple bush graph evaluates in under a second, while a detailed oak tree with four branching levels can take 5-10 seconds per variation.
Project settings: Nanite must be enabled in your project. Go to Project Settings > Engine > Rendering and confirm that "Support Nanite" is checked. If you are starting a new project, the Third Person and Open World templates have Nanite enabled by default.
Enabling the Plugin
Open Edit > Plugins, search for "Procedural Vegetation," and enable the Procedural Vegetation Editor plugin. Restart the editor when prompted.
After restart, you should see "Procedural Vegetation Editor" under the Window menu. If it does not appear, check the Output Log for any plugin loading errors — the most common issue is a project that was migrated from 5.5 or earlier with incompatible foliage settings.
Creating Your First PVE Asset
PVE definitions are stored as assets in your Content Browser, just like materials or Blueprints.
- Right-click in the Content Browser
- Navigate to Procedural Generation > Vegetation Definition
- Name your asset (we recommend a naming convention like
VD_OakTree_01— VD for Vegetation Definition) - Double-click to open the PVE graph editor
You will see an empty graph workspace with a 3D preview panel on the right. The preview shows nothing yet because your graph has no nodes. Let us fix that.
Understanding the Node Graph
The PVE graph editor works on a left-to-right flow model. Data flows from source nodes on the left through processing nodes in the middle to output nodes on the right. If you have used Blender's Geometry Nodes or Houdini's SOPs, the mental model is similar, though the node vocabulary is purpose-built for vegetation.
The Species Root Node
Every PVE graph starts with a Species Root node. Create one by right-clicking in the graph and selecting Add Node > Species > Species Root.
The Species Root defines global parameters that affect the entire plant:
- Base Scale Range — minimum and maximum scale multipliers applied to the entire plant. Set this to something like 0.8-1.2 for natural variation without dramatic size differences.
- Seed Range — how many unique variations can be generated from this graph. A range of 0-15 gives you 16 distinct instances. More variations mean more visual diversity but also more memory for instance data.
- Growth Stage — a 0.0-1.0 parameter that controls the maturity of the plant. At 0.0 you get a sapling, at 1.0 a fully mature tree. This is incredibly useful for creating diverse forests without separate graphs for young and old trees.
- Wind Response Profile — global settings for how the plant responds to wind. You can override this per-branch later, but the species-level setting establishes the base behavior.
Core Node Categories
PVE organizes its nodes into several categories. Understanding what each category does will save you hours of experimentation.
Trunk Nodes control the main stem. The Primary Trunk node is your starting point — it defines height, diameter, taper, segment count, and curvature. For most trees, you will use a single Primary Trunk node, but you can chain Trunk Segment nodes for species with distinct lower and upper trunk characteristics.
Branch Nodes generate branching structures. The Branch Generator is the workhorse node — it takes a parent stem (trunk or another branch) as input and spawns child branches based on configurable parameters. You typically need 2-3 levels of branching for a convincing tree.
Leaf and Frond Nodes attach foliage geometry to branches. The Leaf Placer node distributes leaf clusters along branches and at branch tips. You control density, orientation, and size variation. The Frond Generator creates palm-like frond geometry procedurally.
Bark and Material Nodes assign materials and control UV generation for trunk and branch geometry. The Bark Material node handles UV unwrapping automatically based on the stem's circumference and length, which saves enormous amounts of manual UV work.
Root Nodes generate visible root structures at the base of the tree. These are optional but add significant realism, especially for fantasy or ancient forest aesthetics.
Modifier Nodes adjust the output of other nodes. Gravity Bend applies realistic downward curvature to branches. Phototropism Bend curves branches toward a configurable light direction. Randomize adds controlled noise to any parameter.
Output Nodes collect the generated geometry and produce the final mesh. The Nanite Output node is what you will use in most cases — it generates a Nanite-enabled Static Mesh asset directly into your Content Browser.
Data Flow and Pin Types
PVE uses color-coded pins to indicate data types:
- Green pins carry stem geometry (trunks and branches)
- Blue pins carry leaf/frond geometry
- Orange pins carry material assignments
- Gray pins carry parameter values (floats, vectors, ranges)
- White pins carry the final assembled mesh data
You can only connect pins of matching types. The graph editor will show valid connection targets when you drag from a pin, which helps when you are learning the system.
Building Your First Tree: A Step-by-Step Walkthrough
Let us build a deciduous tree from scratch. We will create something resembling a generic broadleaf tree — not photorealistic, but convincing enough for a game environment.
Step 1: The Trunk
- Create a Species Root node if you have not already
- Add a Primary Trunk node (right-click > Trunk > Primary Trunk)
- Connect the Species Root output to the Primary Trunk input
- Set these initial parameters:
- Height: 8.0-12.0 (meters, with range for variation)
- Base Diameter: 0.4
- Top Diameter: 0.15
- Segments: 8
- Curvature: 0.1 (slight lean)
The preview panel should now show a tapered cylinder. Not exciting yet, but it is the foundation.
Step 2: Primary Branches
- Add a Branch Generator node
- Connect the Primary Trunk's stem output to the Branch Generator's parent input
- Configure the Branch Generator:
- Branch Count: 5-8
- Start Height: 0.4 (branches begin 40% up the trunk)
- Angle From Parent: 35-65 degrees
- Length: 3.0-5.0 meters
- Taper: 0.7
- Gravity Response: 0.3 (branches droop slightly)
Your preview should now show a basic tree silhouette with main branches radiating from the upper trunk.
Step 3: Secondary Branches
- Add another Branch Generator node
- Connect the first Branch Generator's stem output to this new one's parent input
- Set smaller-scale parameters:
- Branch Count: 3-5 per parent
- Angle From Parent: 25-50 degrees
- Length: 1.0-2.5 meters
- Taper: 0.6
- Gravity Response: 0.4
The silhouette should now look more complex and natural.
Step 4: Adding Leaves
- Add a Leaf Placer node
- Connect the secondary Branch Generator's stem output to the Leaf Placer's branch input
- Configure leaf placement:
- Density: 15-25 leaves per meter of branch
- Cluster Size: 3-5 leaves per cluster
- Orientation: Semi-random with upward bias (set the Up Bias to 0.3)
- Scale Range: 0.03-0.06 meters
- For the leaf mesh, you have two options:
- Use PVE's built-in leaf shapes (elliptical, ovate, palmate) via the Leaf Shape Generator node
- Import a custom leaf mesh and connect it to the Leaf Placer's Mesh input
For your first tree, use the built-in elliptical shape. It will not win any realism awards, but it gets you through the workflow.
Step 5: Bark Material
- Add a Bark Material node
- Connect it to both the Primary Trunk and Branch Generator nodes' material inputs
- Assign a bark material from your project (or use the engine's default material temporarily)
- Set UV Scale to something like 2.0 for the trunk and 4.0 for branches — bark textures need to tile more densely on thinner geometry
Step 6: Generate the Output
- Add a Nanite Output node
- Connect all geometry outputs (trunk, branches, leaves) to the Nanite Output's inputs
- Set the output path in your Content Browser
- Click "Generate" in the Nanite Output node's properties
PVE will evaluate the graph, generate mesh geometry, create Nanite data, and save the result as a Static Mesh asset. The first generation for a moderately complex tree takes 3-8 seconds.
Step 7: Generate Variations
With your graph complete, use the Species Root's Seed Range to generate multiple variations:
- In the Species Root, set Seed Range to 0-9 (10 variations)
- Click "Generate All Variations" in the toolbar
- PVE will create 10 distinct mesh assets, each with slightly different branch placement, trunk curvature, leaf density, and overall scale
You now have a mini forest of unique trees from a single graph definition.
Creating Custom Tree Species
The walkthrough above produces a generic tree. Real projects need specific species with distinct visual characteristics. Here is how to push PVE toward recognizable species.
Birch Trees
Birch trees have a distinctive look: white bark, thin trunks, upward-reaching branches, and small leaves in clusters.
Key PVE settings for birch:
- Primary Trunk: tall and thin (Height 10-14, Base Diameter 0.2, Top Diameter 0.08)
- Low Curvature (0.05) for the straight lower trunk
- Add a second Trunk Segment for the upper portion with higher Curvature (0.3) to capture the characteristic lean
- Branch angles closer to vertical (20-40 degrees from trunk)
- High leaf density with small leaf scale
- Bark material with horizontal lenticel patterns
Pine Trees
Conifers require a different branching strategy:
- Use the Conifer Branch Mode on your Branch Generator (this changes the distribution pattern from random to whorl-based)
- Set Branch Count higher (8-12 per whorl) with shorter lengths
- Use the Needle Cluster node instead of Leaf Placer for conifer needles
- Set strong downward Gravity Response (0.6-0.8) on lower branches, less on upper
- The trunk should be very straight (Curvature near 0)
Tropical Palms
Palms are actually simpler in PVE because they have no branching:
- Single tall trunk with slight curvature
- Use the Frond Generator node connected directly to the trunk top
- Set Frond Count to 12-20
- Frond Length 2.0-4.0 meters
- Enable Frond Droop for realistic gravity response
Nanite Skeletal Assemblies
One of PVE's more advanced features is the Nanite Skeletal Assembly system. This is where PVE goes beyond simple static mesh generation.
What Are Skeletal Assemblies?
A Nanite Skeletal Assembly is a generated mesh that retains a simplified skeleton for runtime animation. Unlike standard Nanite meshes (which are purely static geometry with vertex-baked wind), skeletal assemblies can respond to runtime forces — player interaction, physics impacts, or dynamic weather changes.
The trade-off is performance. Skeletal assemblies cost more to render than pure static Nanite meshes because the skeleton evaluation happens every frame. Use them selectively: hero trees near the camera, trees along player paths, or trees that need interactive branch bending.
Enabling Skeletal Assembly Output
- In your Nanite Output node, switch the Output Mode from "Static Mesh" to "Skeletal Assembly"
- Configure the Skeleton Simplification level — this controls how many bones the generated skeleton has:
- Low (4-8 bones): trunk sway and primary branch movement only
- Medium (12-20 bones): includes secondary branch movement
- High (30+ bones): individual branch control, highest quality but most expensive
- Set the Animation Blueprint class — PVE ships with a default wind animation ABP, or you can assign a custom one
Performance Considerations
In our testing, skeletal assemblies cost roughly 2-3x more GPU time per instance than static Nanite meshes. For a forest with 500 trees, making all of them skeletal assemblies would be prohibitively expensive. The recommended approach is:
- Use skeletal assemblies for the 20-50 trees closest to the camera
- Use static Nanite meshes for everything else
- Implement a distance-based swap system (PVE includes a helper Blueprint for this)
This hybrid approach gives you interactive trees where the player notices and efficient rendering everywhere else.
PVE vs. SpeedTree: An Honest Comparison
SpeedTree has been the standard for game-ready vegetation for over a decade. How does PVE compare?
Where PVE Wins
Engine integration. PVE outputs are native Unreal assets. There is no import step, no FBX conversion, no material reassignment. When you generate a PVE tree, it is immediately usable in your level with correct materials, Nanite data, and wind animation.
Nanite-native output. SpeedTree meshes need to go through Nanite processing after import, and the results are not always optimal because SpeedTree was not designed with Nanite's triangle clustering in mind. PVE generates geometry specifically optimized for Nanite's internal data structures.
Cost. PVE is included with Unreal Engine. SpeedTree's Modeler costs $19/month for indie developers or significantly more for studio licenses.
Variation generation. Creating 20 variations of a tree in SpeedTree requires manual adjustment or scripting. PVE generates as many variations as you want from seed values, and they all share the same species parameters.
Where SpeedTree Still Wins
Maturity and polish. SpeedTree has had years of refinement. Its procedural algorithms produce more realistic results out of the box, especially for complex species. PVE's algorithms are good but sometimes produce unrealistic branching patterns that require manual parameter tweaking to fix.
Artist-friendly workflow. SpeedTree's UI is purpose-built for vegetation artists. PVE's node graph is powerful but less intuitive for artists who think in terms of "this branch should curve here" rather than "set the gravity response coefficient to 0.4."
Library of species presets. SpeedTree ships with extensive preset libraries. PVE currently ships with fewer than a dozen example graphs. You will be building most species from scratch, which is both a strength (full control) and a weakness (more upfront work).
Cross-engine support. SpeedTree exports to Unity, Unreal, Godot, and other engines. PVE only outputs to Unreal. If you work across engines, SpeedTree is the only option.
Foliage modeling depth. SpeedTree handles flowers, fruits, moss, ivy, and other vegetation details that PVE does not yet support. PVE is focused on trees and large shrubs; ground cover and decorative vegetation are not yet in its scope.
The Practical Verdict
For Unreal-only projects where you need lots of tree and shrub variations with Nanite performance, PVE is the better choice. It is free, integrated, and produces excellent Nanite-optimized output.
For projects requiring photorealistic vegetation, cross-engine compatibility, or species types that PVE does not support, SpeedTree remains the better tool.
Many teams will use both: PVE for background and mid-ground trees where variation and performance matter most, SpeedTree for hero trees and vegetation types that PVE cannot handle.
Scattering PVE Foliage Across Your Level
Generating tree meshes is only half the job. You need to place them in your level, and doing so manually for hundreds or thousands of trees is not practical.
Using the Built-in Foliage Tool
UE5's Foliage tool works with PVE-generated meshes just like any other static mesh. Add your generated variations to the Foliage palette, configure density and placement rules, and paint.
This works fine for small areas but lacks the biome-aware logic that large environments need. Trees should cluster in valleys, thin out on ridges, avoid steep slopes, and respond to moisture maps.
Procedural Placement with PCG
The PCG framework (which is now production-ready in UE 5.7) can scatter PVE meshes based on landscape data, biome maps, and custom rules. This is the recommended approach for large environments.
A basic PCG graph for PVE scattering:
- Surface Sampler node to generate candidate points on your landscape
- Density filter based on a painted biome map
- Slope filter to remove points on steep terrain
- Spacing filter to enforce minimum distances between trees
- PVE Mesh Selector node to randomly assign tree variations to each point
- Transform randomizer for rotation and slight scale variation
- Static Mesh Spawner to instantiate the results
Using the Procedural Placement Tool
Our Procedural Placement Tool provides a higher-level interface for this kind of scattering. It includes biome-aware placement profiles, density painting tools, and performance budgeting that automatically adjusts instance counts based on hardware targets. It works directly with PVE-generated meshes — you add your variations to a placement profile and the tool handles distribution, spacing, and LOD management.
The advantage over raw PCG is that the Procedural Placement Tool handles the optimization concerns (view distance culling, hierarchical LOD, streaming) that you would otherwise need to implement yourself in the PCG graph.
Automating PVE Workflows
Once you have a working PVE pipeline, you will find yourself repeating certain operations: regenerating variations after parameter tweaks, updating scatter placements, batch-processing material assignments. This is where automation pays off.
MCP-Based Automation
The Unreal MCP Server can interact with PVE graphs programmatically. Through natural language commands in Claude Code or other MCP clients, you can:
- Adjust PVE graph parameters without opening the graph editor (useful for A/B testing different branch densities or leaf scales)
- Batch-regenerate all variations after a parameter change
- Update scatter placements to use newly generated variations
- Create scene comparison screenshots before and after parameter changes
For example, telling Claude "increase the leaf density on VD_OakTree_01 by 20% and regenerate all variations" executes in seconds what would take several minutes of manual clicking through the PVE graph UI.
Parameter Experimentation
One powerful pattern is using MCP automation to explore PVE parameter spaces. You can instruct the AI to generate a tree at five different branching angle ranges, screenshot each result, and let you compare them side by side. This kind of rapid iteration is difficult to do manually because each change requires navigating the node graph, adjusting values, regenerating, and visually evaluating.
Performance Optimization
PVE-generated forests can be demanding even with Nanite optimization. Here are the key performance levers.
Instance Counts and Draw Calls
Nanite handles triangle complexity well, but instance counts still matter. A forest of 10,000 trees generates significant instance data overhead. Practical limits depend on hardware, but as a rough guide:
- 1,000-3,000 Nanite tree instances: comfortable on mid-range hardware
- 3,000-8,000 instances: fine on high-end hardware, may need culling on lower specs
- 8,000+ instances: requires aggressive culling, HLOD, or World Partition streaming
Hierarchical LOD
For large forests, enable UE5's HLOD system. It bakes distant tree clusters into simplified proxy meshes that replace individual instances beyond a configured distance. PVE-generated meshes work with HLOD out of the box.
World Partition
If your environment is large enough to use World Partition (and in 5.7, it probably should be), PVE-generated foliage respects partition boundaries. Trees are streamed in and out based on the player's position, which is the most effective way to maintain performance in open-world environments.
Material Complexity
PVE-generated bark and leaf materials can be a hidden performance cost. Each unique material on a PVE mesh adds to the shader compilation time and potentially to draw calls. Use material instances rather than separate material assets, and share base materials across species where possible.
Common Pitfalls and Troubleshooting
After working with PVE extensively, here are the issues we see most frequently.
"My trees look like broccoli." This happens when all branches have similar angles and lengths. Increase the randomization ranges on your Branch Generator nodes and vary the gravity response between branching levels.
"Wind animation looks jittery." Usually caused by too-high wind weight values on small branches. Reduce the Wind Weight on your secondary and tertiary Branch Generators. The default values are sometimes too aggressive.
"Generation takes forever." High segment counts on trunk and branch nodes are the main culprit. A tree does not need 32 segments per branch — 6-8 is usually sufficient for game-quality geometry. Also check your leaf density; placing 50 leaves per meter on four levels of branching creates an enormous amount of geometry.
"Nanite is not working on my PVE meshes." Verify that your Nanite Output node's "Enable Nanite" checkbox is on (it should be by default). If Nanite is enabled but the meshes still render as traditional LODs, check that your project's Nanite support is enabled and that you are using a compatible rendering path (Deferred, not Forward).
"Materials look wrong after generation." PVE's automatic UV generation sometimes produces unexpected results, especially on tightly curved branches. Adjust the UV Scale parameter on your Bark Material node, or switch to triplanar projection for the bark shader to avoid UV dependency entirely.
What Is Next After This Guide
This guide covers the fundamentals, but PVE has depth beyond what we can cover in a single post. Areas worth exploring once you are comfortable with the basics:
- Season parameters — PVE supports seasonal variation through a single Season float parameter that controls leaf color, leaf density, and branch flexibility. One graph can produce spring, summer, autumn, and winter versions of the same tree.
- Growth animation — the Growth Stage parameter can be animated at runtime for time-lapse effects or gameplay mechanics where vegetation grows or withers.
- Custom node creation — PVE's node system is extensible through C++. If you need species-specific behavior that the built-in nodes do not support, you can create custom nodes.
- Biome graph integration — advanced workflows connect multiple PVE species definitions into a biome-level graph that manages species distribution, understory vegetation, and ground cover as a unified system.
PVE is a significant addition to Unreal Engine's toolkit, and it is only going to improve as Epic iterates on it. The fundamentals you learn now will carry forward as the system matures. Start with simple species, build complexity gradually, and do not try to replicate SpeedTree's photorealism on your first day — PVE's strength is in variation, performance, and engine integration, and those are the qualities that matter most for shipping games.