Visual example:

I've been trying to understand multitexturing for a while now, I've created a terrain generator but have no need for height just yet and I still want one texture to blend over to another texture nicely.
I think Blau said that you only need 4 textures per vertex. My only guess then is that each point in a terrain has 4 neighbours - right? And that point is the main texture to sample from / blend from. Because it can't mean that 4 textures are all you get on a whole map in a game.
My idea is to have an "TextureID" for each point and whenever this point comes up, you load the textures in the effect with that neighbours textures.
Example (for each point):
effect.Parameters["MainTexture"].Setvalue(Content.Load<Texture2D>("MainTexture"))
effect.Parameters["TextureTopOfPoint"].SetValue(Content.Load<Texture2D>(textureID));
effect.Parameters["TextureRightOfPoint"].SetValue(Content.Load<Texture2D>(textureID));
effect.Parameters["TextureBottomOfPoint"].SetValue(Content.Load<Texture2D>(textureID));
effect.Parameters["TextureLeftOfPoint"].SetValue(Content.Load<Texture2D>(textureID));
/*
Now the Pixel and Vertex Shader can calculate a blend effect
from Center point to it's neighbouring points
*/
and somehow in the Effect file, blend from "Center point" to all it's neighbours. I also guess this would be a "slow" process.
Problems are:
Is this possible? I can't accept 4 textures for a whole map, so how do I manage to have multiple textures at the same time? And I don't want a solution with colors (like this) or heightmap, because I want it to be possible to have 4 or more textures on a flat surface.
How do I access each point's neighbour and when do I know when to set them?
My map contains Areas, each Area has it's own VertexBuffer and IndexBuffer.
(Example: MapWidth=4096, MapHeight=4096, each square = 128x128 = (32 * 128 x 32 * 128 grid)
public class Area
{
public VertexPositionTexture[] Vertices { get; set; }
public int[] Indexs { get; set; }
public VertexBuffer GetVertexBuffer() { /* create a vertexbuffer */ }
public IndexBuffer GetIndexBuffer() { /* creates a indexbuffer */ }
}
Edit (still not optimal)
Implemented some kind of method, but this method still relies on colors and I have no blendmap. I just use the color in the Vertex to check for a value (r, g, b, a)

Effect Code:
float4 PixelShaderFunction(VS_OUTPUT input) : COLOR
{
float4 colour = float4(0,0,0,0);
colour += tex2D(GroundText0Sampler, input.TexCoord) * input.Color.r;
colour += tex2D(GroundText1Sampler, input.TexCoord) * input.Color.g;
colour += tex2D(GroundText2Sampler, input.TexCoord) * input.Color.b;
colour += tex2D(GroundText3Sampler, input.TexCoord) * input.Color.a;
return colour;
}