how I went about creating multiple biomes was normalizing the noise, multiplying it by the number of biomes, and then blending it with the two biomes around it as well
local Biomes = {
{Name = "Forest", Noise = NoiseFunction},
{Name = "Plains", Noise = OtherNoise},
{Name = "Hills", Noise = AnotherNoise},
}
function module.DetermineNoise(BiomeNoise)
local NormalNoise = Normalize(BiomeNoise) * #Biomes
local RoundNoise = math.round(NormalNoise)
local Noise = Biomes[RoundNoise].Noise(x, z, GridX, GridZ)
Noise += Biomes[(RoundNoise + 1 > #Biomes and 1 or RoundNoise + 1)].Noise(x, z, GridX, GridZ) * (RoundNoise - NormalNoise)
Noise += Biomes[(RoundNoise - 1 < 0 and #Biomes or RoundNoise - 1)].Noise(x, z, GridX, GridZ) * (NormalNoise - RoundNoise)
return Noise
end
more or less something like this, typed this up pretty quick, so no idea if it functions or not, it gives you the general idea though
Adding on the noise of adjacent biomes helps smooth the transitions between biomes, however it can result in higher terrain in general
(in this case Noise
in the Biomes
table is a function which returns a number)