Alpine Lakeside Village: World Partition & PCG Optimization

This piece showcases my technical art workflow for building a large-scale, physically accurate landscape in UE 5.4. I handled the full environment pass, from procedural terrain generation in Gaea to designing and authoring a multi-layer automaterial that responds to slope, height, macro breakup, and weathering variations.

Technical Systems
To support rapid iteration and believable worldbuilding, I built a modular PCG setup for foliage and structural distribution. This included rule-based scattering, biome variation, and density controls tuned for early-stage performance testing.

I also established a light-weight optimization pipeline for this prototype: profiling material cost, validating Nanite behavior across the terrain, and configuring early HLOD settings for large structures. During this process, I identified and debugged a World Partition streaming issue, refining my workflow to maintain consistent performance while working at scale.

Tools / Tech
UE 5.4 (World Partition, PCG, Nanite, HLODs, Lumen), Gaea, Substance Designer/Painter, Blueprints, GPU/Rendering Profiling tools.

For this project, I wanted to create an open-world alpine environment to explore World Partition streaming, PCG workflows, and performance optimization in Unreal Engine.

For this project, I wanted to create an open-world alpine environment to explore World Partition streaming, PCG workflows, and performance optimization in Unreal Engine.

The scene spans ~16km² and features procedurally generated forests and meadows, a lakeside village with PCG-spawned structures, and Data Layer organization for content streaming.

The scene spans ~16km² and features procedurally generated forests and meadows, a lakeside village with PCG-spawned structures, and Data Layer organization for content streaming.

(more images at the end!)

(more images at the end!)

I gathered references for alpine lakeside villages, focusing on moody atmospheric lighting, natural integration of structures with terrain, and layered mountain backdrops.

I gathered references for alpine lakeside villages, focusing on moody atmospheric lighting, natural integration of structures with terrain, and layered mountain backdrops.

The landscape was generated in Gaea using erosion and flow maps to create natural terrain features. It's then exported as a height map and imported into Unreal.

The landscape was generated in Gaea using erosion and flow maps to create natural terrain features. It's then exported as a height map and imported into Unreal.

Auto-landscape material blends textures based on slope and height, with additional variation for rocky outcrops and grassy meadows.

Auto-landscape material blends textures based on slope and height, with additional variation for rocky outcrops and grassy meadows.

I built a PCG system using a singleton spawner pattern - one main spawner generates point data that specialized graphs (trees, rocks, flowers) reference. This keeps the system modular and easier to iterate on.

I built a PCG system using a singleton spawner pattern - one main spawner generates point data that specialized graphs (trees, rocks, flowers) reference. This keeps the system modular and easier to iterate on.

The forest biome uses distance-to-bounds spawning to create natural transitions - large trees in the center, saplings at the edges. Flowers are spawned around trees using density rejection to avoid overlap.

The forest biome uses distance-to-bounds spawning to create natural transitions - large trees in the center, saplings at the edges. Flowers are spawned around trees using density rejection to avoid overlap.

Logs and bushes are scattered within the forest boundary while rocks and stones are scattered across the biome.

Logs and bushes are scattered within the forest boundary while rocks and stones are scattered across the biome.

Village structures are PCG-spawned using level instances with tagged actor randomization

Village structures are PCG-spawned using level instances with tagged actor randomization

Windows, roof decorations, and props are randomly hidden/shown using attribute filter node and select point in PCG to create variation from base assets.

Windows, roof decorations, and props are randomly hidden/shown using attribute filter node and select point in PCG to create variation from base assets.

These houses have different clutter. Some have two stories. By using this technique we can create variants of different assets.

These houses have different clutter. Some have two stories. By using this technique we can create variants of different assets.

Early on, I hit a major performance issue with the landscape causing excessive fragmentation and performance dropping to 28 FPS.

Early on, I hit a major performance issue with the landscape causing excessive fragmentation and performance dropping to 28 FPS.

Increasing the proxy grid to 16 and switching to volume-based PCG solved both issues, bringing baseline performance to 90 FPS.

Increasing the proxy grid to 16 and switching to volume-based PCG solved both issues, bringing baseline performance to 90 FPS.

I set up HLOD generation for the level and created a batch file to build HLODs outside of the editor using commandlets. This helps the process faster because it's not bogged up by the editor.

I set up HLOD generation for the level and created a batch file to build HLODs outside of the editor using commandlets. This helps the process faster because it's not bogged up by the editor.

For lighting, I want the scene to be moody and overcast, so I create fog cards and adjust the Rayleigh settings to achieve the desired cloudy and low-light effect.

For lighting, I want the scene to be moody and overcast, so I create fog cards and adjust the Rayleigh settings to achieve the desired cloudy and low-light effect.

I then color grade and adjust post-process settings to get the desired result and realism.

I then color grade and adjust post-process settings to get the desired result and realism.

I also created a cheap fog card material to create a more pronounced atmospheric perspective.

I also created a cheap fog card material to create a more pronounced atmospheric perspective.

PCG + spline partitioning doesn't work (solution: use Data Layers for spline-based content), and PCG spatial queries only work with collision components not primitives

PCG + spline partitioning doesn't work (solution: use Data Layers for spline-based content), and PCG spatial queries only work with collision components not primitives

I profiled the scene using stat GPU and ProfileGPU to identify bottlenecks. Primary cost: planar reflections (5-8ms) rendering the full scene for water surface. Secondary: Nanite virtual shadow maps (2.6-6.4ms) especially in closeup foliage-heavy views.

I profiled the scene using stat GPU and ProfileGPU to identify bottlenecks. Primary cost: planar reflections (5-8ms) rendering the full scene for water surface. Secondary: Nanite virtual shadow maps (2.6-6.4ms) especially in closeup foliage-heavy views.

If I had more time, I'd implement planar reflection optimization (disabling settings that aren't high impact), reduce the r.Shadow.Virtual.ResolutionLodBiasDirectional, and do a shadow pass switch

If I had more time, I'd implement planar reflection optimization (disabling settings that aren't high impact), reduce the r.Shadow.Virtual.ResolutionLodBiasDirectional, and do a shadow pass switch

 Add spline-based paths using Data Layer streaming, and expand the biome variety with snowy peaks and dense forest interiors.

Add spline-based paths using Data Layer streaming, and expand the biome variety with snowy peaks and dense forest interiors.