top of page

How to Color Low Poly Terrain with Gradients and Curves

Most low poly terrain shaders give you three controls that are easy to misuse: a gradient for slope, a gradient for height, and a curve that blends between them. This article explains what each one actually does, why the combination works visually, and how to tune them.


Introduction


Painting every cliff face, riverbed, and plateau by hand is slow. Worse, it locks you into a look early, so revision becomes expensive.


A cleaner approach is to let the terrain's own geometry drive most of the coloring. Slope tells you where rock faces are. Elevation tells you where snow, grass, and sand belong. A blend curve lets you decide which logic wins at each altitude. Together, three controls can cover the majority of a low poly terrain's color story without a single brush stroke.


This article walks through that method in general terms, then shows it applied in Polaris by Pinwheel Studio. If you are using a different terrain shader or toolchain, the underlying logic still applies.


A low poly terrain colored with only gradients and curve

The Method in General for coloring Low Poly Terrain using only gradients and curve


The workflow uses three parameters:


1. A slope gradient

Maps a color ramp to the terrain's surface angle. Faces pointing straight up (flat ground) sample one end of the gradient. Faces pointing sideways (steep cliffs) sample the other end. This gradient handles the cliff-vs-flat distinction automatically, with no painting required.


2. A height gradient

Maps a color ramp to elevation. Low elevations sample one end, high elevations sample the other. This gradient handles broad biome-like zones: sandy riverbeds at the bottom, grassy midlands, snow-capped peaks at the top.


3. A blend curve

Controls how much the slope gradient vs the height gradient contributes at each elevation. A high value at a given elevation means "let slope drive the color here." A low value means "let height drive the color here."


These three parameters can produce a full, readable terrain palette. You use manual painting only to add local variation on top of this base.


Why This Works Visually


Low poly terrain already communicates shape through facets and silhouette. Color should reinforce that shape, not fight it.


The slope gradient works with facets. In a low poly mesh, steep cliff faces are already distinct surfaces. Assigning them a darker, more neutral color reads as rock or shadow without needing a normal map or heavy texture work.


The height gradient provides geographic logic. Audiences read elevation intuitively: dirt at the bottom, snow at the top. You are anchoring your color choices to something the eye already expects.


The blend curve is what makes the combination feel authored rather than generated. At the peaks and valleys, you probably want clear height-based color signals (snow, sand). In the mid-range, where most terrain action happens, you may want the slope to dominate so cliff faces and flat clearings read differently inside the same elevation band. The curve lets you tune that relationship at each altitude without writing additional rules.


The result is a terrain that is legible at a distance and holds up on close inspection, built from a handful of color choices rather than dozens of painted layers.


Shader Logic: Pseudocode


The following is conceptual pseudocode. It uses GLSL-style syntax to illustrate the idea, but the same logic maps to HLSL, ShaderLab, or any node-based tool that exposes the same values.


The key insight is that blendWeight is a function of height, not a constant. That makes the blend non-uniform: slope can dominate at mid-elevation while height dominates near the peaks and the floor.


To implement this in any terrain shader or tool you need: a normalized surface-angle value, a normalized height value, two color ramps, and one remapping curve. Those four inputs are all the method requires.


In practice you author blendCurve as an animation curve or gradient mask, shaping it until the color transitions feel right for your biome layout.


How it was implemented in Unity with Polaris


Polaris by Pinwheel Studio is a mesh-based terrain tool for Unity that implements this method directly. Its Gradient Lookup shading mode exposes the three parameters as editor controls: Color By Normal for slope, Color By Height for elevation, and Blend By Height as the curve, and previews all changes in real time on the terrain mesh.


gradient and curve settings for Polaris low poly terrain

On top of the gradient base, Polaris includes a texture painter that lets you add albedo, metallic, and smoothness detail locally. That covers the gap between what the gradients produce globally and what specific areas need.


low poly terrain colored with gradients and curve, with color map and metallic map overlay on top

Common Pitfall: Height Range Mismatch


In any height-based coloring system, your gradient is only as useful as the normalization range you give it. If the range fed to the height lookup does not match the actual elevation span of your terrain, the gradient samples only a narrow slice of your color ramp. Colors at the extremes may never appear, and transitions look compressed or arbitrary.


This is a general implementation problem. It surfaces whenever the min/max values used for normalization are too wide relative to the terrain you have actually sculpted.


In Polaris specifically, the height gradient maps across the full height range of the terrain asset, not just the elevations your sculpted terrain uses. If your landscape sits between 20% and 70% of the asset's total height capacity, the gradient's lower and upper stops are never reached.


The fix in Polaris: pull your gradient stops inward to match the elevation range your terrain actually occupies. The full palette becomes usable again and the transitions become legible.


The fix in general: make sure terrainMinY and terrainMaxY in your shader reflect the real bounds of the mesh you are shading, not a theoretical maximum.


This issue is easy to miss because the controls still produce some color response, they just do not produce the intended one.


When to Add Manual Painting on Top


The gradient system handles broad color structure well. It does not handle local variation or specific surface conditions.


Add manual painting for:


  • Dirt paths and trails that cross multiple elevation bands

  • Isolated wet or icy patches that should not appear globally

  • Rock formations inside a grassy zone that the slope gradient alone cannot isolate

  • Color accents used as visual landmarks


In Polaris, you can paint albedo, metallic, and smoothness on top of the gradient result. The gradient base remains intact underneath; you are only adding local overrides where the automatic logic falls short.


Gradients set the rules, painting breaks the rules.


Conclusion


Slope, height, and a blend curve are enough to build a coherent color base for most low poly terrain scenes. The slope gradient handles surface type. The height gradient handles biome logic. The blend curve decides which of those readings takes priority at each elevation. Manual painting adds what neither gradient can produce automatically.


This method is not Polaris-specific. It applies to any terrain shader that exposes surface angle, elevation, and a blending parameter. Polaris is a practical starting point if you are working in Unity -- it implements the method with real-time feedback and a painter on top, so you can tune the three controls and see the result immediately.


If you want to try Polaris, it is available on the Asset Store.


















  • Discord
  • Facebook
  • X
  • Youtube
  • Reddit
  • Pinterest

© 2015-2025, Pinwheel Studio. All Rights Reserved.

bottom of page