ProceduralWorlds

Master procedural world generation in Unity 3D. From noise algorithms to infinite terrains — build the systems behind open-world games,...
1 joined
Profile picture
@wheeldonpointsProfile pictureMay 31
Pinned post

Welcome to Procedural World Generation Masterclass

Welcome aboard. You just made a decision that's going to fundamentally change how you build games.


Over the next 7 chapters and 21 lessons, you're going to build a complete procedural world engine from scratch in Unity — infinite terrain, biomes, weather, day/night cycles, GPU compute, and production-grade optimization.


How to get the most out of this course


  • Follow the order. Lessons are sequential for a reason — each system builds on the last.

  • Type the code yourself. Don't copy-paste. The muscle memory matters when you're debugging at 2am.

  • Hit every exercise target. The performance benchmarks aren't arbitrary — they're what ships.

  • Use the community chat. Post your terrain screenshots, share your noise experiments, ask questions. Everyone here is building the same thing.


What you'll have when you're done


A modular, GPU-accelerated procedural world engine that generates infinite explorable terrain with biomes, vegetation, dynamic weather, and atmospheric lighting — running at 60 FPS on mid-range hardware.


This isn't a toy project. This is portfolio-grade work.


Let's build some worlds.

Profile picture
@wheeldonpointsProfile pictureMay 31

Why Your Perlin Noise Terrain Looks Like Garbage (And How to Fix It)

Every Unity developer's first procedural terrain looks the same: a lumpy surface that resembles a crumpled bedsheet more than actual geography. Here's why, and the three things you're probably missing.


Problem 1: Single-octave noise


If you're calling Mathf.PerlinNoise(x * scale, z * scale) and plugging it straight into vertex heights, you're getting one frequency of detail. Real terrain has detail at every scale — continental shapes, mountain ranges, individual ridges, small rocks.


Fix: Fractal Brownian Motion (fBM)


Layer multiple octaves of noise at increasing frequencies and decreasing amplitudes:


float FBM(float x, float z, int octaves, float persistence, float lacunarity)
{
    float total = 0f;
    float amplitude = 1f;
    float frequency = 1f;
    float maxValue = 0f;
    
    for (int i = 0; i < octaves; i++)
    {
        total += Mathf.PerlinNoise(x * frequency, z * frequency) * amplitude;
        maxValue += amplitude;
        amplitude *= persistence;  // Each octave is quieter (try 0.5)
        frequency *= lacunarity;   // Each octave is higher freq (try 2.0)
    }
    
    return total / maxValue;
}


6 octaves, persistence 0.5, lacunarity 2.0. You'll immediately see the difference.


Problem 2: Linear height mapping


Mapping noise (0–1) directly to height gives terrain where valleys and peaks have equal probability. Real terrain clusters around sea level with occasional peaks.


Fix: Apply a power curve


float height = Mathf.Pow(noiseValue, 2.5f);


This single line makes your terrain dramatically more natural. Low areas become flat plains, only the highest noise values produce peaks.


Problem 3: No erosion


Noise terrain has no concept of water flow. Real mountains have valleys carved by rivers, ridges shaped by wind, sediment deposited in lowlands.


Even a simplified hydraulic erosion pass transforms noise terrain into something genuinely geological. The algorithm: place a water droplet, compute the gradient, move it downhill, erode material from the current position, deposit material where the droplet slows. 50,000 droplets on a 256×256 heightmap takes ~200ms and the visual improvement is massive.


---


These three techniques — fractal noise, non-linear height mapping, and erosion — are the difference between "I made a terrain" and "I made a world."


Full implementation with GPU compute shaders, chunk streaming, biomes, weather systems, and production optimization → .

Profile picture
@wheeldonpointsProfile pictureMay 31

Why Your Perlin Noise Terrain Looks Like Garbage (And How to Fix It)

Every Unity developer's first procedural terrain looks the same: a lumpy surface that resembles a crumpled bedsheet more than actual geography. Here's why, and the three things you're probably missing.


Problem 1: Single-octave noise


If you're calling Mathf.PerlinNoise(x * scale, z * scale) and plugging it straight into vertex heights, you're getting one frequency of detail. Real terrain has detail at every scale — continental shapes, mountain ranges, individual ridges, and small rocks.


Fix: Fractal Brownian Motion (fBM)


Layer multiple octaves of noise at increasing frequencies and decreasing amplitudes:


float FBM(float x, float z, int octaves, float persistence, float lacunarity)
{
    float total = 0f;
    float amplitude = 1f;
    float frequency = 1f;
    float maxValue = 0f;
    
    for (int i = 0; i < octaves; i++)
    {
        total += Mathf.PerlinNoise(x * frequency, z * frequency) * amplitude;
        maxValue += amplitude;
        amplitude *= persistence;  // Each octave is quieter (try 0.5)
        frequency *= lacunarity;   // Each octave is higher frequency (try 2.0)
    }
    
    return total / maxValue; // Normalize to 0-1
}


6 octaves with persistence 0.5 and lacunarity 2.0 is a solid starting point. You'll immediately see the difference — terrain that has both broad shapes and fine detail.


Problem 2: Linear height mapping


Mapping noise output (0–1) directly to height gives you terrain where valleys and peaks have equal probability. Real terrain clusters around sea level with occasional peaks.


Fix: Apply a height curve


// Use an AnimationCurve in the inspector for full control, or:
float height = Mathf.Pow(noiseValue, 2.5f); // Flattens lows, exaggerates highs


This single line makes your terrain feel dramatically more natural. Low areas become flat plains, and only the highest noise values produce mountain peaks.


Problem 3: No erosion simulation


Noise-based terrain has no concept of water flow. Real mountains have valleys carved by rivers, ridges shaped by wind, and sediment deposited in lowlands.


Even a simplified hydraulic erosion pass — dropping virtual water droplets and letting them carry sediment downhill — transforms noise terrain into something that looks genuinely geological.


The algorithm: place a droplet, compute the gradient, move it downhill, erode material from the current position, deposit material where the droplet slows down. 50,000 droplets on a 256×256 heightmap takes about 200ms and the visual improvement is massive.


---


These three techniques — fractal noise, non-linear height mapping, and erosion — are the difference between "I made a terrain" and "I made a world." If you want the full implementation with GPU-accelerated compute shaders, chunk streaming, biomes, weather systems, and production optimization, that's exactly what we cover in the .