Generate different types of terrain with perlin noise?

How could I generate several different types of terrain with perlin noise? For example, mountains, deserts, and so on. Do I need to implement my own noise algorithm for this, or can it be achieved with perlin noise–and if so, how? Also (but this is not as important) when I have different types of terrain, how could I smoothly transition between them? By the way all of this will be done at runtime in the game.

Thanks

I come from an audio background and my hobby is figuring out noise formulas for mountains. :smiley:

you can make your own 2d perlin noise with specific wave shapes, and you can multiple 2 1d perlin noises pnoise(x,y) in unity is already cool.

in audio, you have waveshapes like:

abs(sin(x))
1-abs(sin)
(sin*.5+.5) sinh callit, puts it above zero and it reacts well to powers, squareroots etc,
you can have
sinh^3,
sqrt sin,
1-sinh^3

there are some other basic waveshape mashups…

ideally you make perlin noise using those in 2d, or you can multiply the perlin noise using those functions when it’s already done, and you can change x y z proportions that go in and out of the formula.

if you want to learn about perlin noise, here is 3d:

http://forum.unity3d.com/threads/code-version-of-mathf-perlinnoise-and-fast-perlin-noise-2d-3d.261094/

you can derive 2d and 1d (1d same as unity) from this:

obviously never use sin on cpu or cos, its slow, use a cyclic x*x function to do a curve, its 10 times less heavy on processor…

and i like the perlin noise DLL Nevermind released for unity, it’s free now i dunno where you can get it. here it is in attachement…

this is for the attached dll, to access noise:
https://dl.dropboxusercontent.com/u/114667999/Plugins.rar

function  simplex (a: float, b: float,c: float ): float// very erratic natural mountains
{
	var noises: SimplexNoiseGenerator = GetComponent(SimplexNoiseGenerator); 
	var n = noises.noise(a,b,c);
	return n; 
}	

function  ng2 (a: float,c: float ): float//  gradient noise 2d
{
	var n = new  CoherentNoise.Generation.GradientNoise2D(213321);
	var k =  n.GetValue(a,c,1);
	return k; 
}	

function  nvn (a: float, b: float,c: float ): float//3d function like Perlin
{
	var n = new CoherentNoise.Generation.ValueNoise(213321);
	var k =  n.GetValue(a,b,c);
	return k; 
}	

function  nv2 (a: float,c: float ): float//2D,similar to Perlin noise, straighter, faster
{
	var n = new CoherentNoise.Generation.ValueNoise2D(213321);
	var k =  n.GetValue(a,c,1);
	return k; 
}	

function  nvr (a: float,c: float ): float//lags it's slow, it's some pointy mountains with circular valleys
{
	var n = new CoherentNoise.Generation.Voronoi.VoronoiPits2D(466);
	var k =  n.GetValue(a,c,c);
	return k; 
}