Art, design & a little curiosity
Creative coding ↗

Generative landscapes with layered horizons

Build an invented landscape from a few related contour systems, using overlap and bounded variation to create depth without rendering a detailed scene.

An imagined pen-plotter print of fine indigo contour lines.
Pen-plotter print / Imagined editorial illustration

Depth through related contours

A landscape can emerge from three or four contour bands and their overlaps. The bands do not need realistic geography. They need distinct roles: a distant quiet contour, a more active middle layer, and a foreground that frames the view. Give each layer its own range of movement.

Draw distant contours before foreground bands

Sample a smoothly varying height function across the canvas. Convert those samples into a closed shape by adding bottom corners. Draw distant bands first and nearby bands later. Offset the sampling input between layers so they do not become identical contours shifted vertically.

Separate foreground height variation from the other decisions so that a later revision has an identifiable cause. Keep the first pass deliberately modest in scale. A manageable version is easier to inspect, undo, and reconstruct. Increasing complexity should answer a visible artistic need, rather than simply making the process look more elaborate. A useful acceptance check is whether the opening remains readable while the foreground gains character. Judge that at the intended viewing size or working distance, where tiny construction mistakes and exaggerated effects can have very different consequences.

Find seams and overly similar horizons

A vertical seam usually means the final shape was closed along the wrong edge. A landscape that feels stacked rather than deep may have equally active layers everywhere. Reduce variation in the distant band and inspect overlaps in a simple two-layer proof.

Treat a disappointing result as evidence about foreground height variation, rather than immediately adding another effect. Temporarily show construction points and intermediate values. Reduce repeated elements to a handful and pause anything that changes over time.

Lock the distance and vary the foreground

Generate several versions while locking the farthest horizon. Vary only the foreground shape and compare how it redirects attention. This makes the role of framing clearer than changing every layer together.

Use 20, 60, and 120 pixels as three deliberately separated trial conditions. Keep the subject, framing, and main materials consistent across those trials. Note what changes first, what remains stable, and where the intended effect becomes excessive. Choose a version for an articulated reason. A useful note names a visible relationship that you could inspect again, rather than simply calling the result better.

Keep the distant layer independent

Give each horizon its own input offset and height range, then store those choices. If every layer samples the same portion of the same function, the landscape can resemble nested copies of one ridge. That may be useful for an abstract study, but it weakens the sense of separate terrain. Lock the distant layer while adjusting the foreground shoulders so the intended opening does not wander during every comparison.

A worked example

A dawn valley with two shoulders

Create a dawn valley with a shallow distant ridge and two darker foreground shoulders. Leave a low opening near one third of the width. Add no sun, trees, or buildings until the open space already suggests a place to look through.

References & further reading

Examples and exercises in this guide are original teaching scenarios.

Keep following the thread.

More creative coding ↗