Creating biomes for procedurally generated terrain

You can write your topic however you want, but you need to answer these questions:

  1. What do you want to achieve? Keep it simple and clear!

I want to implement biomes in my procedural generating terrain. Similar to Minecraft as in snow biomes can’t be beside desert, and height slowly going down into oceans ect.

  1. What is the issue? Include screenshots / videos if possible!

I do not know how to do this, and google will NOT help me.

Also here is an image of my terrain generator currently.


  1. What solutions have you tried so far? Did you look for solutions on the Developer Hub?

I have search google for over an hour with no result.

I know this is not a realistic thing for a game on Roblox because of how laggy it would be, it’s just a personal challenge. All help is appreciated.


Have you been read this?
^ Look in generation section.
I have no clue how to implement this into ROBLOX. But I am sure you can figure a way

I have read it and I understand it, but that doesn’t solve my issue. That just says how Minecraft smoothly generates its terrain between biomes. Not how it decides what biomes are there at the start. (Hopefully, that makes sense.)

1 Like

Ah alright I’ll keep a eye look out for a way in the mean-time. Also good luck sorry that it was the wrong thing you were looking for.

It’s ok thanks for the help. :heart:

Minecraft does this my coloring blocks like grass a gradient composed of two of the biomes colors over a section of blocks.
A good idea would be to generate chucks of biomes and then try to connect them.

A great way to start would be to generate a temperature value for every voxel using coherent noise, then calculating what biome a voxel would be in by taking into account both the temperature and the altitude (you would want colder biomes like snowy mountains to generate on mountaintops, and you wouldn’t want a desert generating on top of a mountain either). This should generate some well-blended biomes that are sort of realistic, since you should never have an ice biome bordering a desert biome without some sort of intermediate biomes in between.


If I was to go that biomes shapes would be made out of squares.

1 Like

I will look further into coherent noise and see if this works, thanks!

1 Like

Coherent/Cohesive (pretty much just Perlin) Noise :slight_smile:

So, I would generate a coherent noise, and then dependent on the color it is it decides the temperature? Also how would I generate a coherent noise?

You can use math.noise to generate coherent Perlin noise. You could then take the output at each (x,z) coordinate and use the resulting “temperature” to determine what biome the block is in.

But then I can’t make biomes rarer than other, for example snowy biomes and mountain tops will generate a lot more than I would like with Perlin noise.

Here’s what I meant: You would take both altitude (the height at a location) AND the temperature (this would be a heightmap where higher values represent a hotter/humid area and lower values represent a colder/drier area).
For a given (x,z) coordinate, you would first:
Find the elevation of the land at that point (mountains would be higher)
Find the temperature of that same point (represents how hot/humid or cold/dry the area is)
See how the elevation and temperature fit the criteria for each biome you offer; for example, if the height is 128 (let’s assume this is a mountaintop) and the temperature is -1 (the lowest value returned by math.noise, so the coldest), then that would match the criteria for a snowy mountaintop. If the height is 64 (let’s call this ground level) and the temperature is 0 (neutral temp), then the area would match the criteria for some sort of forest. If the height is STILL 64 but the temperature was 1 (hot as heck), then that area would be considered a desert.

Ok, I sort of understand. So the temperature would just be another layer of noise. Just with a different seed right?

In my mind, the temperature layer would be a more “coarse” layer of noise, i.e with bigger “scale” so the “patches” of noise would be larger (it changes far less quickly than height does).

I would also add a “wetness” layer, depending on how detailed I wanted the map to be. Wet mountains become snowy, dry mountains become giant crags.

I would do this biome mapping first.

I’d break it down into cycles:

  1. terrain height map - creates the “mesh” of the terrain.
  2. mountain heightmap - a large, coarse perlin map.
  3. terrain tile paint - paints the terrain tiles the color of the biome.
  4. biome assets paint - adds on all the relevant trees, debris etc.

First, I would create the temperature + wetness maps, with a coarse/large scale.

Then, I would create the perlin noise height maps (both mountain and terrain).

Then, I would create the actual terrain mesh based on the terrain map + temp/wet maps; I would scale the corresponding terrain world height (from the height map) based on the temperature (terrainHeight = heightmap*Temperature);

then I would superimpose the mountain map onto the terrain height map (i.e unscaled, place mountains here and there on top of the terrain). Principle of superposition, etc etc (terrainHeight = terrainHeight + mountainMap)

Then I would handle biome painting based on the wetness:

High temp + wetness --> medium height fluctuation (tropical forest).
High temp + low wetness -> very low height fluctuation (desert/savanna).
Low temp + Low wetness -> very low height fluctuation (glacier/antarctic).
low temp + high wetness -> medium height flux (tundra/highlands).

and add the appropriate assets.

This would all be done with some linear function i.e , terrainColor = terrainHeight * wetness…

That’s my initial take. Interesting project.

1 Like

So would these new noises be generated using Perlin noise? Or would they use some different type of noise, and what would be different about it?

it’s entirely up to you.

The key take away is how biomes should be decided, not so much generated.

And you would decide which biome to paint based on some criteria. An easy way to select the criteria is with a temperature and wetness map, which would be some randomly generated, continuously changing* map.

*continuously changing - doesn’t suddenly change from max height to zero, but rather changes slowly over distance.