Procedural Terrain with Blender Geometry Nodes

This guide explains how to generate customizable, non-destructive landscapes directly inside Blender using Geometry Nodes and mathematical operations. By utilizing nodes such as Noise Texture, Set Position, and various Math functions, you will learn how to displace a flat grid, shape realistic mountain peaks, carve valleys, and control terrain elevation dynamically without relying on external heightmaps.

1. Setting Up the Base Mesh

  1. Add a new mesh object (such as a Plane or Cube) in the 3D Viewport.
  2. Open the Geometry Nodes workspace and click New to create a new node tree.
  3. Disconnect or delete the Group Input geometry node.
  4. Add a Grid node (Shift + A > Mesh Primitives > Grid).
  5. Set the Size X and Size Y values to define the terrain scale (e.g., 50m x 50m).
  6. Increase the Vertices X and Vertices Y counts (e.g., 250 to 500) to provide sufficient geometric density for displacement.
  7. Connect the Mesh output of the Grid to the Geometry input of a Set Position node.

2. Basic Elevation with Noise and Math Nodes

To elevate the flat grid into terrain, pass coordinates through noise functions and shape them with Math nodes:

  1. Add a Position node (Shift + A > Geometry > Read > Position).
  2. Connect the Position output to the Vector input of a Noise Texture node. Set the Noise Texture to 3D or 4D.
  3. Add a Math node (Shift + A > Utilities > Math) and set its operation to Multiply.
  4. Connect the Factor output of the Noise Texture to the first Value input of the Math node. Set the second Value to control the terrain height (e.g., 10.0).
  5. Add a Combine XYZ node (Shift + A > Vector > Combine XYZ).
  6. Connect the output of the Math node to the Z input of the Combine XYZ node.
  7. Plug the Vector output of the Combine XYZ node into the Offset input of the Set Position node.

3. Advanced Terrain Shaping Using Math Operations

Standard noise creates generic hills. Use specific Math node operations between the Noise Texture and the Combine XYZ node to create distinct geographic features:

  • Sharpening Ridges (Power Node): Add a Math node set to Power. Plug the Noise Texture into the base Value and set the exponent to 2.0 or 3.0. This suppresses low-elevation areas into flat plains while creating sharp, steep peaks.
  • Creating Plateaus and Terraces (Snap / Round Node): Add a Math node set to Snap or Floor. Setting the snap increment (e.g., 0.5) quantizes elevation, producing stepped canyons or layered rock formations.
  • Clamping Sea Level (Maximum Node): Add a Math node set to Maximum. Set the second value to 0.0 (or your desired water level). Any negative displacement will be flattened, forming an ocean or lake floor.
  • Adjusting Dynamic Range (Map Range Node): Insert a Map Range node to remap the default 0.0 to 1.0 noise values to custom minimum and maximum heights, allowing precise boundaries over the landscape.

4. Layering Multiple Frequencies

Realistic terrain requires broad landmasses layered with fine surface details:

  1. Create a primary Noise Texture with a low scale (e.g., 0.05) for continental shapes.
  2. Create a secondary Noise Texture with a higher scale (e.g., 0.5) for fine rock details.
  3. Multiply the secondary noise by a smaller multiplier (e.g., 1.5) using a Math node.
  4. Combine both layers using an Add Math node (Primary Elevation + Secondary Elevation).
  5. Connect the combined result into the Z input of the Combine XYZ node.

5. Finalizing the Mesh

  1. Add a Set Shade Smooth node after the Set Position node to eliminate visible polygon faceting.
  2. Add a Store Named Attribute node before the Group Output. Set the data type to Float, name the attribute height, and connect your final Z-math output to the Value socket. This attribute can be referenced inside the Shader Editor to drive procedural slope and elevation materials.
  3. Connect the final node to the Group Output.