I've recently picked up procedural generation and it's been going great - until I decided to give Biomes a shot. With my current setup, I can assign a specific point in my world a biome based on its current height in a "global" biome noise generated with Simplex. The issue i'm having (and many others it seems) is to blend these biomes with eachother - while still being able to decide what goes where.
I tried blending it on my own by simply generating a height with a weight-value that could help with blending a biome with its neighbor. I calculated the weight by getting the distance normalized in a 0 to 1 scale, using this as a percentage. So if the "heaviest" biome had a weight of 0.8, the other neighboring biome would then have 0.2.
float totalHeight = (mainBiome * weight) + (otherBiome * (1f - weight));
However this didn't work out as I still got cliff-like borders between different height biomes.
Then I found an algorithm at Parzivail.com that actually worked perfectly in blending a biome with its surrounding biomes. The only issue is that it's pretty much only based on the index of my biomes-array.
float totalHeight = 0.0f;
float n = biomes.Length;
for (int i = 0; i < n; i++)
{
float left = (i - 1f) / (n - 1);
float right = (i + 1f) / (n - 1);
if (left < noiseHeight && noiseHeight < right)
{
var layer = biomes[i];
float w = -Mathf.Abs((n - 1) * noiseHeight - i) + 1f;
layer.Evaluate(x, y, sampleCenter);
totalHeight += w * layer.Height;
layer.Weight = w;
}
}
I've tried modifying it in order to determine biomes based on temperaute and not only height, but whatever I do seems to bring the cliffs back.
Current implementation with seamless transition
How would I change my way of doing this, so I could set up the placement of biomes in a better way and not be forced to use my array indexes?