I dont think I'll get any better than what youve done already,
so Ive integrated yours into mine (below).

Yeah, I knew shadows and lighting needs to be redone but ORIGINALLY I just
wanted this shader to run ONCE and calculate a new skin for the terrain.
Not to be kept running like this one is...

Im still going to keep heading in that direction, for educational purposes.

Im posting my 'current' so you can see the height 'randomiser' Ive added
to the VERTEX shader, in order to 'roughen up' the 'flat' edges.
But its is NOW hard to spot with my existing test-model with your smoothing.
So IF you take a look, disable your smoothing to actually see whats happening.

Click to reveal..
Code:
//Application fed data
const float4x4 matWorldViewProj;


texture Sand_BM_bmap, Grass_BM_bmap, Rock_BM_bmap, Snow_BM_bmap;

// ColorMap Samplers
sampler SandSampler  = sampler_state  { Texture = <Sand_BM_bmap>;  };
sampler GrassSampler = sampler_state  { Texture = <Grass_BM_bmap>; };
sampler RockSampler  = sampler_state  { Texture = <Rock_BM_bmap>;  };
sampler SnowSampler  = sampler_state  { Texture = <Snow_BM_bmap>;  };




#define cMult 0.0001002707309736288
#define aSubtract 0.2727272727272727

float random(float4 t)
{ 
	float a, b, c, d;
	a=t.x+t.z*cMult+aSubtract-floor(t.x); 
	a*=a; 	b=t.y+a; 	b-=floor(b); 
	c=t.z+b; 	c-=floor(c); 	d=c; 
	a+=c*cMult+aSubtract-floor(a); 
	a*=a; b+=a;		b-=floor(b); 
	c+=b; c-=floor(c); 
	return ((a+b+c+d)/4); 
}


// Vertex Shader: 
void TerrPaintVS( in  float4 InPos:  POSITION,	in  float2 InTex: TEXCOORD0, 
						out float4 OutPos: POSITION,	out float2 OutTex: TEXCOORD0, 
						out float  Height: TEXCOORD1 											)	 
{ 
	// Transform the vertex from object space to projected world space: 
	OutPos = mul(InPos, 	matWorldViewProj);
	// Pass the texture coordinate to the pixel shader: 
	OutTex = InTex; 
	// Capture the Height of this vertex from object space... SEEMINGLY
	Height = InPos.y;
	// OPTIONALLY add some randomness to the demarkation line
	Height += (random(InPos)*30)-10;
}


// Pixel Shader: 
float4 TerrPaintPS(	in float4 InPos: POSITION,	 in float2 InTex: TEXCOORD0,
							in float  Height:TEXCOORD1											): COLOR 
{
	float4 Color = 0;

	if(Height < 32) Color = tex2D(SandSampler, InTex); 
	else if(Height < 42) Color = lerp(tex2D(SandSampler,InTex), tex2D(GrassSampler,InTex), (Height-32)/10);
	else if(Height < 75) Color = tex2D(GrassSampler, InTex); 
	else if(Height < 85) Color = lerp(tex2D(GrassSampler,InTex), tex2D(RockSampler,InTex), (Height-75)/10);
	else if(Height < 120) Color = tex2D(RockSampler, InTex); 
	else if(Height < 130) Color = lerp(tex2D(RockSampler,InTex), tex2D(SnowSampler,InTex), (Height-120)/10);
	else Color = tex2D(SnowSampler, InTex);

	return Color; 
} 



// Technique: 
technique AmbientTechnique 
{ 
	pass P0 
	{ 
		VertexShader = compile vs_2_0 TerrPaintVS(); 
		PixelShader  = compile ps_2_0 TerrPaintPS(); 
	} 
}



Ill do some more playing once I get to work tonight...


"There is no fate but what WE make." - CEO Cyberdyne Systems Corp.
A8.30.5 Commercial