Hey everyone, for my project we wanted our terrain to take advantage of sunlight so we decided to use the "toon" multitexture terrain shader. Then we ran into the problem with casting shadows from our buildings... so I added in a shadow map for my level builder. It just takes the alpha layer of the mtlSkin1 and applies it as a shadow.

It works the fastest with .dds files... I'm using dxt5 for my shader. Thought I'd put this back out since the original helped me out a ton!

Code:
  texture entSkin1;
texture entSkin2;
texture entSkin3;
texture entSkin4;

texture mtlSkin1;
texture mtlSkin2;

matrix matWorldViewProj;
matrix matWorld;
vector vecSunDir;
vector vecFog;
vector vecViewPos;

sampler multiTex1 = sampler_state
{
Texture = <entSkin1>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};

sampler multiTex2 = sampler_state
{
Texture = <entSkin2>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};

sampler multiTex3 = sampler_state
{
Texture = <entSkin3>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};

sampler multiTex4 = sampler_state
{
Texture = <entSkin4>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};

sampler multiRes1 = sampler_state
{
Texture = <mtlSkin1>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Mirror;
AddressV = Mirror;
};

sampler toon_lookup = sampler_state
{
Texture = <mtlSkin2>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;

// clamp is important!
AddressU = Clamp;
AddressV = Clamp;
};

void mtoonVS(
in float4 inPosition : POSITION0,
in float4 inNormal : NORMAL0,
in float4 inTexcoord : TEXCOORD0,

out float4 outPosition : POSITION0,
out float4 outNormal : TEXCOORD0,
out float4 outLight : TEXCOORD1,
out float4 outTexcoord : TEXCOORD2,
out float outFog : FOG0)
{
outPosition = mul(inPosition, matWorldViewProj);
outNormal = mul(inNormal, matWorld);
outLight = -vecSunDir;
outTexcoord = inTexcoord;
outFog = 1 - (distance(inPosition, vecViewPos) - vecFog.x) * vecFog.z;
}

void mtoonPS(
in float4 inNormal : TEXCOORD0,
in float4 inLight : TEXCOORD1,
in float4 inTexcoord : TEXCOORD2,
out float4 outColor : COLOR0)
{
float4 Color2;
float lerpFactor;
inTexcoord *= 16;
outColor = tex2D(multiTex1, inTexcoord.xy);
Color2 = tex2D(multiTex2, inTexcoord.xy);
lerpFactor = tex2D(multiRes1, inTexcoord.xy/16).r;
outColor.rgb = lerp(outColor.rgb,Color2.rgb, lerpFactor);
Color2 = tex2D(multiTex3, inTexcoord.xy);
lerpFactor = tex2D(multiRes1, inTexcoord.xy/16).g;
outColor.rgb = lerp(outColor.rgb,Color2.rgb, lerpFactor);
Color2 = tex2D(multiTex4, inTexcoord.xy);
lerpFactor = tex2D(multiRes1, inTexcoord.xy/16).b;
outColor.rgb = lerp(outColor.rgb,Color2.rgb, lerpFactor);


// toon shade
float4 ToonShade = tex2D(toon_lookup, dot(inLight.xyz, inNormal.xyz));
lerpFactor = tex2D(multiRes1, inTexcoord.xy/16).a;
outColor.rgb *= ToonShade.rgb * lerpFactor;
}

technique toon
{
pass p0
{
VertexShader = compile vs_1_1 mtoonVS();
PixelShader = compile ps_2_0 mtoonPS();
}
}




"Towlie, you're the worst character ever." I know...