top of page

Low poly terrains in Unity and how to make them look good

Updated: Mar 26

Low poly (or faceted/polygonal) is one of the most popular art style that being used in many indie games on the market. Along with low poly models of character and props, low poly terrain is the essential part of the game's environment. In this post, we will discuss about some tips to save them from boring look (and more performant), as well as the tool you can use to make low poly terrain for your game.

Low poly terrain scene in Unity
Low poly terrain scene in Unity

How to make low poly terrain look good?

There are a few things you need to consider when making the terrain, those are just ideas, the implementation is totally up to you and the tool you're using.


Tip #1: Use dynamic polygon density

That means putting less polygons where the surface is plain, and more where the surface is complex with many details. This way you can break the boring uniform look and save a tremendous amount of vertices, thus improving performance.

low poly terrain in Unity with dynamic polygon density
Low poly terrain in Unity with dynamic polygon density

Some tools such as Polaris do this by default. In case you want to implement this in your code, here's the idea:

  • Generate a "polygon density map" that derived from your height map. Just compare a height map pixel value with its neighbors and output a value denoting the density at that point. Store those values in a read/write Texture2D.

  • Start with a single triangle and continuously subdivide it. At each iteration, read the density map (at vertex location or the center point) to determine if it should split the triangle or not, for example:

    • The current iteration is 1, density value is 8, we split the triangle into 2 pieces and add them to the list for the next iteration.

    • The current iteration is 9, density value is 8, we don't split it anymore.

    • Store your triangles in a tree-like structure so you can easily determine the "density level" of each triangle.

  • After this point, you have the basic grid of the terrain. However, some triangles may not match with their adjacents and create gaps. You will need some additional subdivision to match them.

  • Iterate through the triangles tree and only take leaf nodes.

The triangle should be split from its square corner like this:

Create low poly terrain by dynamic subdivision
Create low poly terrain by dynamic subdivision

Tip #2: Split the terrain mesh into smaller chunks

Why? Because the maximum number of vertices in a mesh is about 65k. To create bigger world, you need to split the terrain into several smaller chunks so it won't exceed that limit. This approach is also better for calculating mesh LOD and level streaming. In contrast, you can just set the mesh index format to 32 bits, but this may not work for low end platforms.


A question remains: how to remove potential gaps from subdivision between chunk?


Tip #3: Random displacement on XZ plane

A low poly terrain will look super boring when all vertices align nicely to a grid. To get around it, add a small offset to every vertices (x and z only). The offset should "look" random but actually deterministic, Perlin Noise function with original vertex position as argument should work.

The same low poly terrain as above, but with XZ displacement
The same low poly terrain as above, but with XZ displacement

Tip #4: Choosing a material targeting low poly terrain

Not all terrain materials work with this kind of terrain, because of 2 main reasons:

  • Mesh format: Low poly terrain usually made using "split vertices" technique, which mean triangles don't share their vertices, thus each vertex has its own normal vector to create the flat look. Material with tessellation won't work.

  • Low poly style prefers a crispy & sharp color between triangles, using splat textures is fine but remember to keep lightling & detail as simple as possible.



Tip #5: Cover it with grass and detail objects

Low poly doesn't mean empty! Get some grass textures, rock & pebble models and scatter them everywhere. But remember to keep an eye on performance. Having too many game objects & renderer is not so good for the framerate (and memory too). If you want to have a bunch of grass all over the place, consider using a custom vegetation renderer. Tool such as Polaris provides a vegetation renderer out of the box, where it treats each grass instance as vectors instead of game object.

Low poly terrain scene in Unity with grass & tree
Grass makes low poly terrain more interesting and less empty

Do you have any tip to make low poly terrain in Unity looks good? Share with us in the comment!






Comments


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

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

bottom of page